2017-08-02 83 views
0

我需要讀取文件的內容並在文件鎖定時覆蓋它。我不希望文件在讀取和寫入操作之間解鎖。如何鎖定文件,讀取其內容並覆蓋它?

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) 
{ 
    using (var reader = new StreamReader(file, Encoding.Unicode)) 
    using (var writer = new StreamWriter(file, Encoding.Unicode)) 
    { 
    // read 
    // calculate new content 
    // overwrite - how do I do this??? 
    } 
} 

如果我用兩個FileStream S,實例作家當文件被清除,但該文件將讀者和作家之間的實例進行簡要解鎖。

using (var reader = new StreamReader(new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None))) 
{ 
    // read 
    // calculate new content 
} 

using (var writer = new StreamWriter(new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))) 
{ 
    // write 
} 

回答

3

如果你把開原的FileStream你可以做到這一點:

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) 
{ 
    // This overload will leave the underlying stream open 
    using (var reader = new StreamReader(file, Encoding.Unicode, true, 4096, true)) 
    { 
     //Read 
    } 

    file.SetLength(0); //Truncate the file and seek to 0 

    using (var writer = new StreamWriter(file, Encoding.Unicode)) 
    { 
     //Write the new data 
    } 
} 
+0

這需要在V4.5的依賴,因爲與leaveOpen的構造函數是不是之前它用。 –

+0

感謝您的快速回答! –

+0

沒有理由使用新的'leaveOpen'參數來解決這個問題。打開文件作爲讀/寫就足夠了。讀取器和寫入器都可以同時創建,並且在讀取之後但在寫入之前設置基礎流長度。 –