【问题标题】:How do you determine full paths from filename command line arguments in a c++ program?如何从 C++ 程序中的文件名命令行参数确定完整路径?
【发布时间】:2010-01-09 15:54:40
【问题描述】:

我正在用 C++ 编写一个程序,它在命令行上接受文件名作为参数:

>> ./myprogram ../path/to/file.txt

我知道我可以简单地使用argv[1] 打开一个 fstream,但程序需要有关文件的确切位置(即完整路径名)的更多信息。

我曾考虑将argv[1] 附加到getcwd(),但显然在上面的示例中您最终会得到/path/../path/to/file.txt。不确定 fstream 是否会自动解析该路径,但即使可以,如果没有大量字符串处理,我仍然没有完整路径。

当然,如果提供的路径已经是绝对路径,则该方法根本不起作用。并且由于该程序可能在 Linux/Windows/etc 上运行,因此仅检测起始 '/' 字符将无法确定参数是否为完整路径。

我认为这是处理跨多个操作系统的路径名的一个相当普遍的问题。那么如何获取命令行参数的完整路径名以及操作系统之间如何处理

【问题讨论】:

    标签: c++ operating-system path command-line-arguments


    【解决方案1】:

    路径名处理是高度特定于操作系统的:有些操作系统只有一个根(例如 / 在 Unix 上),有些操作系统有多个根,例如 MS-DOS 的驱动器号;有些可能有符号链接、硬链接或其他类型的链接,这会使遍历变得棘手。有些甚至可能没有文件“规范”路径的概念(例如,如果文件有硬链接,则它有多个名称,没有一个更“规范”)。

    如果您曾尝试在 Java 中跨多个操作系统进行路径名操作,您就会明白我的意思 :-)。

    简而言之,路径名处理是系统特定的,因此您必须为每个操作系统(系列)单独处理,或者使用合适的库。

    编辑

    您可以查看 Apache Portable Runtime 或 Boost(尽管是 C++),它们都具有路径名处理函数。

    【讨论】:

    • 如果你是跨平台的,你真的应该使用 boost 而不是平台特定的函数。
    【解决方案2】:

    ...您最终会得到 /path/../path/to/file.txt。没有把握 fstream 是否会解决这个问题 自动路径,但即使它 做了,我仍然没有完整的路径 没有大量的字符串处理。

    确实如此,您可以毫无问题地将 /path/../path/ 用于您想要的所有内容。

    无论如何,C++ 中没有标准函数可以做你想做的事。您必须手动完成,这不是微不足道的。我建议您保持原样,它不会造成任何问题。

    【讨论】:

    • 在理想情况下,这将是一个很好的解决方案,但是该程序的目的是收集有关文件的一些信息,包括其在文件系统中的位置。我可以进行字符串处理,真正的问题是确定您输入的是相对路径还是绝对路径,以便知道将其附加到 cwd。
    • @Alex B,绝对路径非常可能以'/'开头,否则是相对路径不是吗?
    • 抱歉,在阅读了您的“/path/../path/stuff”示例后,没有意识到您可能会关心这一点。
    【解决方案3】:

    它依赖于操作系统。如果您使用的是 linux,您可以查看 realpath()。毫无疑问,Windows 有类似的东西。

    【讨论】:

    • 谢谢,realpath() 在 linux 上完美运行。仍在寻找 Windows 等价物...
    【解决方案4】:

    AFAIK 没有标准方法。

    但是您可以尝试这种方法(用伪代码编写):

    string raw_dirname=get_directory_part(argv[1])
    string basename=get_filename_part(argv[1])
    string cwd=getcwd()
    chdir(relative_dirname)
    string absolute_dirname=getcwd()
    chdir(cwd)
    string absolute_filename=absulute_dirname + separator + basename
    

    但请注意:我不太确定符号链接发挥作用时是否存在问题。

    【讨论】:

    • 我刚刚发现这篇文章 - insanecoding.blogspot.com/2007/11/… - 它有一些用于这种精确方法的 c++ 代码。虽然 realpath() 似乎工作得很好(如果它在平台上可用 - 似乎不适用于 Windows),文章显示了一个很好的自己动手版本。
    • 好主意。但是,如果getcwd 真的返回规范路径,我会担心。我阅读了它的文档,似乎它可能只是返回类似 /a/b/../c 的东西,如果感觉的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 2018-02-23
    • 2016-04-27
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多