我想知道我们是否可以从我们为C和C ++中的文件名创建的文件对象中获取文件名,包括其路径
FILE *fp = fopen(filename, mode); // in C
ofstream out(filename); // in C++
ifstream in(filename); // in C++
谢谢!
答案 0 :(得分:9)
没有可移植的方法来检索FILE *对象的文件名。它甚至可能与实际文件无关(例如stdout的FILE指针)。
答案 1 :(得分:9)
总的来说,你不能。该文件可能没有文件名,因为它可能是标准输入,输出或错误,或者是套接字。该文件可能也已被删除;至少在Unix上,您仍然可以读取或写入已删除的文件,因为进程会保留对它的引用,因此在引用计数变为零之前不会删除基础文件本身。文件的名称可能不止一个;你可以有多个硬链接到一个文件。
如果您想保留有关文件来源的信息,我建议您创建自己的结构或类,其中包含文件名和文件指针或流。
答案 2 :(得分:1)
没有可移植的方式。然而,特定平台有时会有办法做到这一点。
在Windows中,如果您可以获取文件的HANDLE(就像您从:: CreateFile()获得的那样),您可以使用类似ZwQueryInformationFile()的方式获取该文件的路径。
从FILE *,您可以使用_fileno()获取(Unix风格)文件ID。然后调用_get_oshandle()来获取HANDLE。
不确定如何从std :: ofstream中做到这一点,但你可以研究它。
不确定如何在其他操作系统上执行此操作,但有可能。