Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从c+;中的文件名命令行参数确定完整路径+;节目? 我正在编写一个C++程序,它接受文件名作为命令行上的参数: >> ./myprogram ../path/to/file.txt_C++_Operating System_Path_Command Line Arguments - Fatal编程技术网

如何从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