2012-06-11 13 views
3

我剛剛注意到刪除並重新寫入文件時出現了一個奇怪的行爲:如果兩個操作之間的間隔足夠短,文件創建時間不會更新。刪除並重新創建時,Ghost文件保持活動狀態

我跑到下面的代碼:

File.Delete("hello"); 
using(var stream = new StreamWriter("hello")) 
{ 
    stream.WriteLine("hello"); 
} 
var f = new FileInfo("hello"); 
Console.WriteLine("{0} {1}ms", f.CreationTime, f.CreationTime.Millisecond); 

如果我把一個斷點在using(...)行,我可以看到該文件刪除後消失,但最終它還是會給我老的創建日期。我甚至可以從資源管理器中手動刪除文件,然後運行此代碼,它仍顯示舊的創建時間。但是,如果我在刪除和重新創建之間等待一段未確定的時間(大約1分鐘),那麼創建時間設置正確(如果我在上面提到的斷點處等待調試器)。

這是從哪裏來的?它是一個記錄的Windows行爲?我忘記了什麼嗎?

PS:我在Windows XP上測試它,看看它的重要性。

+0

考慮要麼創建FileInfo的實例,然後從它創建流,或創建FileInfo的實例之前關閉流。如果直接查看文件系統(在DIR中使用DIR或使用Windows資源管理器,則可能會找到預期的創建時間)。 –

+0

@OllieJones'}'在使用塊的末尾關閉流。我沒有提到它,但我也可以在資源管理器屬性窗口中看到這個創建時間問題。 – Zonko

回答

4
+0

另外:http://blogs.msdn.com/b/oldnewthing/archive/2005/07/15/439261.aspx – Zonko

0

試圖強迫你的FileInfo的刷新(因爲數據緩存):

var f = new FileInfo("hello"); 
f.Refresh(); // Force to read all props again 
Console.WriteLine("{0} {1}ms", f.CreationTime, f.CreationTime.Millisecond); 
+0

相同的行爲。我猜這會很有用的是我在創建流之前得到'FileInfo',但是在這裏它什麼都不做。 – Zonko