代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

从文件对象到文件名

  •  4
  • Tim unnamed eng  · 技术社区  · 15 年前

    我想知道我们是否可以从文件对象中获得文件名,包括我们在C和C++中为文件名创建的文件对象。

    FILE *fp = fopen(filename, mode); // in C
    ofstream out(filename); // in C++
    ifstream in(filename);  // in C++
    

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  9
  •   Brian Campbell Dennis Williamson    15 年前

    一般来说,你不能。该文件可能从来没有文件名,因为它可能是标准输入、输出、错误或套接字。该文件也可能已被删除;至少在UNIX上,您仍然可以对已删除的文件进行读写操作,因为进程保留对该文件的引用,因此在引用计数变为零之前,不会删除基础文件本身。一个文件可能有多个名称;您可以有多个指向单个文件的硬链接。

    如果您想保留有关文件来源的信息,我建议您创建自己的结构或类,该结构或类由文件名和文件指针或流组成。

        2
  •  9
  •   Kyle Lutz    15 年前

    没有可移植的方法来检索文件*对象的文件名。它甚至可能与实际文件(例如,stdout的文件指针)没有关联。

        3
  •  1
  •   Sliq    15 年前

    没有便携方式。然而,特定的平台有时也有办法做到这一点。

    在Windows中,如果可以获取文件的句柄(如从::createfile()获得的句柄),则可以使用zwqueryinformationfile()之类的工具从该句柄获取路径。

    从文件*中,可以使用_fileno()获取(Unix样式)文件ID。然后调用getooshandle()获取句柄。

    不知道如何从std::ofstream中做到这一点,但您可以研究一下。

    不确定如何在其他操作系统上执行此操作,但这可能是可能的。