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