2011-07-02 48 views
1

我的程序正在將數據記錄到文件中,同時用戶界面實時顯示傳入數據。如果計算機/程序/ os /關閉,我希望記錄的數據在一秒鐘或兩秒鐘內在磁盤上。數據至少每秒100次。重命名自己打開文件

我希望用戶能夠在日誌記錄處於活動狀態時爲日誌文件提供新名稱。問題在於,即使它是通過相同的進程打開,我也無法更改文件的名稱。

測試用例:

string fileName1 = "test.txt"; 
string fileName2 = "test2.txt"; 

using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create))) 
{ 
    sw.WriteLine("before"); 
    File.Move(fileName1, fileName2); //<<-- IOException - The process cannot access the file because it is being used by another process. 
    w.WriteLine("after"); 
} 

所以,如何從一個過程,而同樣的過程中具有數據流來打開文件重命名文件?

+0

如果你記錄如此多的數據,你真的應該嘗試一個日誌庫,像log4net的(HTTP ://logging.apache.org/log4net/)。 –

+1

不幸的是,當你使用它的流時,你不能移動文件或改變它的名字,甚至刪除它,就好像它被另一個程序使用一樣... –

回答

2

您應該關閉第一個流,重命名文件,然後重新打開流:

using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create))) 
{ 
    sw.WriteLine("before"); 
    sw.Close(); 
} 

File.Move(fileName1, fileName2); 

using (StreamWriter sw = new StreamWriter(new FileStream(fileName2, FileMode.Append))) 
{ 
    sw.WriteLine("after"); 
} 
+0

這不會起作用,因爲你不能在使用塊中設置'sw'。錯誤:'不能分配給'SW',因爲它是'使用變量'' –

+0

聽起來很合理。但是你必須第二次表示文件名2,並且文件模式不能被正確創建?只要我在間隙期間鎖定任何日誌記錄,而我沒有任何流,我猜這會奏效。 – obmoc

+0

好點。我已經更新了我的答案。 –

0

,而它是由一個進程打開您不能重命名一個文件,但如果你想寫入它從你的程序的其他實例中執行此操作。

嘗試FileShare.Write。您可以在File.Open中使用它。

using (StreamWriter sw = new StreamWriter (File.Open(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)) 
{ 
    ... 
} 
0

打開連接關閉文件的第二個100次會對你的性能影響,您可以登錄到一個臨時文件,並追加臨時文件每隔10秒左右。這會給你你想要的。

+0

在整個程序運行期間文件處於打開狀態。重命名可能只發生一次或兩次,由用戶引起。 – obmoc

+0

如果你想重命名文件,它不應該打開。因此,每10秒只打開一次以追加日誌條目,使用戶可以在程序運行時重命名該文件。 – Peter

0

我知道這個答案有點晚,以幫助您在移植項目上,但也許它會幫助別人!

如果您打開與FileShare.Delete標誌的文件時,它會讓你重新命名它,即使它仍然是開放的:)