从文件对象到文件名

4
我想知道我们是否可以分别在C和C++中从文件对象中获取包括路径的文件名。
FILE *fp = fopen(filename, mode); // in C
ofstream out(filename); // in C++
ifstream in(filename);  // in C++

谢谢!

3个回答

9

没有一种通用的方法可以获取 FILE* 对象的文件名。它甚至可能与实际文件无关(例如,用于 stdout 的 FILE 指针)。


9
一般情况下,无法确定文件的名称。因为文件可能是标准输入、输出或错误,或者是套接字。此外,文件可能已被删除;至少在Unix系统中,即使文件已被删除,您仍然可以读取或写入该文件,因为进程保留对其的引用,因此底层文件本身直到引用计数归零才会被删除。一个文件可能有多个名称;您可以将多个硬链接指向同一个文件。
如果您想保留有关文件来源的信息,我建议创建自己的结构体或类,其中包括文件名和文件指针或流。

2

没有通用的方法。但是某些平台可能有特定的方法来实现。

在Windows中,如果您可以获取文件的句柄(例如从::CreateFile()获取的句柄),则可以使用类似ZwQueryInformationFile()的函数获取该路径。

从FILE *中,可以使用_fileno()获取Unix-style文件ID。然后调用_get_oshandle()获取句柄。

不确定如何从std::ofstream中获取句柄,但您可以进行研究。

不确定如何在其他操作系统上实现,但可能是可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接