2012-05-27 170 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實現中。 –