2012-04-17 47 views
1

我不斷查詢一個文件目錄,並且每次看到符合某些讀取條件的文件時,我都會打開該文件並對其進行解析。C++ ifstream試圖在寫入時打開文件

string newLine; 

ifstream fileReader; 

fileReader.open(filename.c_str()); 

while(!fileReader.eof()) 
{ 
getline(fileReader, newLine); 
    // do some stuff with the line... 
} 
filereader.close(); 

上面的代碼是在循環中每1秒運行一次,檢查新文件的目錄。我的問題是,當我將文件傳輸到文件夾中進行處理時,我的循環找到該文件並將文件的名稱傳遞給ifstream,然後誰打開它並嘗試解析不完整的文件。如何讓ifstream在文件完成寫入之前等待,直到它試圖解析文件?

編輯: 希望在這裏更好地說出問題,因爲回覆者似乎誤解了我的問題。我有2個目錄

mydirectory/ 
mydirectoryParsed/ 

的方式我的代碼工作原理是,我在mydirectory中的文件程序檢查/當它發現它們,分析它們,並使用在文件中的信息。沒有寫入文件完成。一旦我完成解析文件,文件被移動到mydirectoryparsed/

問題是,當我通過網絡將文件傳輸到mydirectory/ifstream看到這些文件midtransfer並開始讀取它們之前,他們完成寫入目錄。如何讓ifstream在解析之前等待文件完全寫入?

+0

有誰正在寫文件拒絕閱讀訪問,而文件句柄是打開的。 – ildjarn 2012-04-17 01:37:44

回答

3

不要將文件直接傳輸到你的程序是看的目錄;而是將它們轉移到同一驅動器上的不同目錄中,然後在傳輸完成後將它們移動到監視的目錄中。這樣,整個文件就會在一個原子操作中出現在監視目錄中。

或者,您可以在監視的目錄中使用命名約定 - 爲正在傳輸的文件附加後綴,例如「.partial」,然後在傳輸完成後重命名文件以刪除後綴。讓程序忽略名稱以後綴結尾的文件。

+0

是的,謝謝!這對程序來說似乎很好!我將轉移到具有額外擴展名的目錄,然後重新命名!避免部分文件問題。你是生命的救星! – user1314238 2012-04-17 01:57:41

+1

值得注意的是,對於原子移動,您可能希望兩個目錄位於同一個文件系統上。 – Hugh 2012-04-17 04:37:04

+1

這就是爲什麼我說「在同一個驅動器上」,雖然它不夠精確。 – Wyzard 2012-04-17 05:02:06

0

您不應該在每次寫入文件時打開該文件。打開一次!

一些這方面的僞代碼將是:

1- Open file 
2- Get the data you want to write, treat that data 
3- Call the write to file function 
4- Loop until you have nothing left to write 
5- Close de file 
+0

對不起,也許我寫得不好。發生的事情是文件正在從目錄mydirectory /中進行處理,並且當我找到要解析的文件時,我解析所述文件,然後將其移出目錄到類似mydirectoryparsed /的目錄。發生的事情是,當我通過網絡將新文件傳輸到目錄中時,我的程序看起來是這些新文件,但在它們寫完之前,它會嘗試讀取它們。這是我遇到的問題。 – user1314238 2012-04-17 01:43:56

+0

你有沒有考慮像fileReader.fail()或fileReader.isopen()等流校驗? – Erwald 2012-04-17 01:46:21