您如何从C ++程序中的文件名命令行参数确定完整路径?
-
19-09-2019 - |
题
我正在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
但是请注意:我不确定符号链接发挥作用时是否存在问题。