![](/img/trans.png)
[英]C++, how to provide the input filename from the command line, without hardcoding it in the program?
[英]How do you determine full paths from filename command line arguments in a c++ program?
我正在用C ++编写一个程序,该程序在命令行上接受文件名作为参数:
>> ./myprogram ../path/to/file.txt
我知道我可以使用argv[1]
打开一个fstream,但是程序需要有关文件确切位置(即完整路径名)的更多信息。
我曾考虑过将argv[1]
附加到getcwd()
,但是显然在上面的示例中,您最终会得到/path/../path/to/file.txt
。 不知道fstream是否会自动解析该路径,但是即使这样做,如果没有大量字符串处理,我仍然没有完整的路径。
当然,如果提供的路径已经是绝对路径,则该方法将根本无法工作。 而且由于该程序可以在Linux / Windows / etc上运行,因此仅检测开始的'/'字符将无法确定该参数是否为完整路径。
我认为这是处理多个操作系统上的路径名相当普遍的问题。 那么, 如何获取命令行参数的完整路径名以及如何在操作系统之间进行处理呢?
路径名处理是高度特定于OS的:有些OS的层次结构只有一个根(例如/在Unix上),有些OS则具有多个根(例如MS-DOS的驱动器号)。 有些可能具有符号链接,硬链接或其他类型的链接,这可能会使遍历变得棘手。 有些甚至可能没有指向文件的“规范”路径的概念(例如,如果文件具有硬链接,则它具有多个名称,没有一个更像“规范”路径)。
如果您曾经尝试过在Java中跨多个操作系统进行路径名操作,那么您就会明白我的意思了:-)。
简而言之,路径名处理是特定于系统的,因此您必须针对每个操作系统(系列)分别进行处理,或使用合适的库。
编辑 :
您可以查看Apache Portable Runtime或Boost(尽管是C ++),它们都具有路径名处理功能。
...您最终会得到/path/../path/to/file.txt。 不知道fstream是否会自动解析该路径,但是即使这样做,如果没有大量字符串处理,我仍然没有完整的路径。
确实如此,您可以将/path/../path/用于所有您想要的东西而不会出现问题。
无论如何,C ++中没有标准函数可以执行您想要的操作。 您将必须手动执行此操作,而这并非易事。.我建议您保持原样,这不会造成任何问题。
它取决于操作系统。 如果您使用的是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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.