如何从c+;中的文件名命令行参数确定完整路径+;节目? 我正在编写一个C++程序,它接受文件名作为命令行上的参数: >> ./myprogram ../path/to/file.txt
我知道我可以简单地使用如何从c+;中的文件名命令行参数确定完整路径+;节目? 我正在编写一个C++程序,它接受文件名作为命令行上的参数: >> ./myprogram ../path/to/file.txt,c++,operating-system,path,command-line-arguments,C++,Operating System,Path,Command Line Arguments,我知道我可以简单地使用argv[1]打开一个fstream,但是程序需要更多关于文件确切位置(即完整路径名)的信息 我曾考虑将argv[1]附加到getcwd(),但显然在上面的示例中,您最终会得到/path/./path/to/file.txt。不确定fstream是否会自动解析该路径,但即使它会自动解析,如果没有大量字符串处理,我仍然没有完整的路径 当然,如果所提供的路径已经是绝对路径,那么该方法根本不起作用。由于该程序可能在Linux/Windows/etc上运行,因此仅检测起始“/”字符
argv[1]
打开一个fstream,但是程序需要更多关于文件确切位置(即完整路径名)的信息
我曾考虑将argv[1]
附加到getcwd()
,但显然在上面的示例中,您最终会得到/path/./path/to/file.txt
。不确定fstream是否会自动解析该路径,但即使它会自动解析,如果没有大量字符串处理,我仍然没有完整的路径
当然,如果所提供的路径已经是绝对路径,那么该方法根本不起作用。由于该程序可能在Linux/Windows/etc上运行,因此仅检测起始“/”字符无法确定参数是否为完整路径
我认为这是处理跨多个操作系统的路径名的一个相当常见的问题。那么,如何检索命令行参数的完整路径名,以及如何在操作系统之间进行处理
…您将得到/path/。/path/to/file.txt。不确定
fstream是否会解决这个问题
自动创建路径,但即使
是的,我仍然没有完整的路径
没有大量的字符串处理
确实如此,并且您可以毫无问题地使用/path/。/path/实现您想要的一切
无论如何,C++中没有标准函数来做你想做的事情。你必须手动完成,而且这不是一件小事。。我建议你保持原样,这不会引起任何问题
…您将得到/path/。/path/to/file.txt。不确定
fstream是否会解决这个问题
自动创建路径,但即使
是的,我仍然没有完整的路径
没有大量的字符串处理
确实如此,并且您可以毫无问题地使用/path/。/path/实现您想要的一切
无论如何,C++中没有标准函数来做你想做的事情。你必须手动完成,而且这不是一件小事。。我建议您保持路径不变,它不会引起任何问题。路径名处理是高度特定于操作系统的:有些操作系统的层次结构只有一个根(例如,在Unix上),有些操作系统有多个根和MS-DOS的驱动器号;有些可能有符号链接、硬链接或其他类型的链接,这会使遍历变得棘手。有些甚至可能没有文件“规范”路径的概念(例如,如果一个文件有硬链接,它有多个名称,没有一个更“规范”) 如果您曾经尝试在Java中跨多个操作系统进行路径名操作,您知道我的意思:-) 简言之,路径名处理是特定于系统的,因此您必须为每个操作系统(系列)分别进行处理,或者使用合适的库 编辑:
您可以查看或查看Boost(尽管是C++版本),它们都有路径名处理功能。路径名处理是高度特定于操作系统的:有些操作系统的层次结构只有一个根(例如在Unix上),有些操作系统有几个根(如MS-DOS的驱动器号);有些可能有符号链接、硬链接或其他类型的链接,这会使遍历变得棘手。有些甚至可能没有文件“规范”路径的概念(例如,如果一个文件有硬链接,它有多个名称,没有一个更“规范”) 如果您曾经尝试在Java中跨多个操作系统进行路径名操作,您知道我的意思:-) 简言之,路径名处理是特定于系统的,因此您必须为每个操作系统(系列)分别进行处理,或者使用合适的库 编辑:
您可以看看Boost,也可以看看Boost(尽管是C++),它们都有路径名处理函数。它依赖于操作系统。如果您正在使用linux,您可以查看。毫无疑问,Windows具有可比性。它依赖于操作系统。如果您正在使用linux,您可以查看。毫无疑问,Windows也有类似的功能。AFAIK没有标准方法 但是,您可以尝试这种方法(用伪代码编写):
但请注意:我不太确定符号链接起作用时是否存在问题。AFAIK没有标准方法 但是,您可以尝试这种方法(用伪代码编写):
但请注意:我不太确定在使用符号链接时是否会出现问题。在一个完美的世界中,这将是一个很好的解决方案,但是该程序的目的是收集有关文件的一些信息,包括其在文件系统中的位置。我可以进行字符串处理,真正的问题是确定键入的是相对路径还是绝对路径,以便知道如何将其附加到cwd。@Alex B,绝对路径很可能以“/”开头,否则它是相对的,不是吗?对不起,在阅读了“/path/。/path/stuff”的示例后,我没有意识到您可能会关心这个问题。在一个完美的世界中,这将是一个很好的解决方案,但是该程序的目的是收集有关文件的一些信息,包括其在文件系统中的位置。我可以进行字符串处理,真正的问题是确定键入的是相对路径还是绝对路径,以便知道如何将其附加到cwd。@Alex B,绝对路径很可能以“/”开头,否则它是相对的,不是吗?对不起,在阅读了“/path/。/path/stuff”的示例后,我没有意识到您可能会关心这个问题。如果您是跨平台的,您应该真正使用boost而不是特定于平台的函数。如果您是跨平台的,您应该真正使用boost而不是特定于平台的函数。谢谢,realpath()在linux上工作得非常好。不过,仍在寻找与Windows相同的版本…谢谢,realpath()在linux上运行得非常好。不过,我仍然在寻找一个与Windows等价的……我刚刚找到了这篇文章——它有一些C++代码用于这个精确的方法。虽然realpath()似乎工作得很好(如果平台上有它的话),但是
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