2017-08-02 84 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'参数来解决这个问题。打开文件作为读/写就足够了。读取器和写入器都可以同时创建,并且在读取之后但在写入之前设置基础流长度。 –