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

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

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

我考虑过附加 argv[1]getcwd(), ,但是显然在上面的示例中,您最终会出现 /path/../path/to/file.txt. 。不确定FSTREAM是否会自动解决该路径,但是即使这样做,我仍然没有大量的字符串处理的完整路径。

当然,如果所提供的路径已经绝对,该方法根本不起作用。而且,由于该程序可以在Linux/Windows/etc上运行,因此只需检测一个启动'/'字符就无法确定参数是否是完整的路径。

我认为这是一个相当普遍的问题,可以处理多个OSS的路径名。所以 一个人如何重述命令行参数的完整路径名操作系统之间的处理方式如何?

有帮助吗?

解决方案

PathName处理高度特定于OS:有些操作系统只有一个词根(例如,在UNIX上),有些OS具有几个根,有几个根部的la ms-dos驱动器字母。有些可能具有符号链接,硬链接或其他类型的链接,这可能会使遍历棘手。有些人甚至可能没有“规范”路径的概念(例如,如果文件具有硬链接,则具有多个名称,而没有一个更“规范”)。

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

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

编辑:

你可以看 Apache便携式运行时, ,或在Boost(C ++),两者都具有路径名处理函数。

其他提示

...您最终会得到/path/../path/to/file.txt。不确定FSTREAM是否会自动解决该路径,但是即使这样做,我仍然没有大量的字符串处理的完整路径。

它确实可以,您可以使用/path/../path/适用于您想要的一切而没有问题。

无论如何,C ++没有标准功能可以完成您想要的事情。您将必须手动进行操作,这不会很轻松。.我建议您保持道路,不应该引起任何问题。

它取决于OS。如果您正在使用Linux,则可以查看 realpath(). 。毫无疑问,Windows有一些可比的东西。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top