2012-05-27 412 views
35

我可以从fstream对象获取文件名或路径吗?我查看了fstream的方法,没有发现任何与之相近的东西。从fstream获取文件名(或路径)

+8

我不认为这是可能的。底层文件可能有多个名称(如果它有多个硬链接)或根本没有名称(例如,如果它代表一个匿名管道)。 –

回答

33

不,这是不可能的,至少在库的标准符合性实现中是不可能的。

fstream类不存储文件名,也不提供任何检索它的函数。

因此,要保持这一信息跟踪一个方法是使用std::map为:

std::map<std::fstream*, std::string> stream_file_table; 

void f() 
{ 
    //when you open a file, do this: 
    std::fstream file("somefile.txt"); 

    stream_file_table[&file] = "somefile.txt"; //store the filename 

    //.. 
    g(file); 
} 
void g(std::fstream & file) 
{ 
    std::string filename = stream_file_table[&file]; //get the filename 
    //... 
} 

或者,干脆绕过文件名也。

+0

这看起来没错,只有你需要说,一旦fstream对象被破坏,名称必须被删除... –

20

你也可以设计一个继承自fstream的小类,其行为像一个fstream,但也存储它的文件名。

+7

这也允许你添加一个方便的构造函数,它需要一个'std :: string', C++ 11,但通常不在C++ 03实现中。 –