0

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

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

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

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

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

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

4

4 回答 4

3

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

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

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

编辑

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

于 2010-01-09T16:08:14.927 回答
1

...你最终会得到 /path/../path/to/file.txt。不确定 fstream 是否会自动解析该路径,但即使确实如此,如果没有大量字符串处理,我仍然没有完整路径。

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

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

于 2010-01-09T16:02:55.453 回答
1

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

于 2010-01-09T16:18:47.853 回答
1

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

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

于 2010-01-09T16:19:14.643 回答