2017-08-02 6 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??? 
    } 
} 

私は2つの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

をleaveOpenとのctorのは、その前に利用できないので、これは、V4.5への依存を取ります。 –

+0

迅速な回答ありがとうございます! –

+0

この問題を解決するために新しいleaveOpenパラメータを使用する理由はありません。ファイルを読み込み/書き込みとして開くだけで十分です。リーダーとライターの両方を同時に作成することができます。基本的なストリームの長さは、読み込み後、書き込み前に設定されます。 –

関連する問題