2017-11-06 10 views
0

これまでのところ、私はすべて成功しなかった。C#はロックされたファイルを読み取った

私が達成しようとしているのは、特定の時間ファイルを開いてロックしたいということです。 ファイルを開いてロックした直後に、読み込み専用に同じファイルを開こうとします。

string filePath = "test.ini"; 

// Open and lock the file 
FileStream configurationFile = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 
configurationFile.Lock(1, configurationFile.Length); 

// Open the same file just to read it 
using (FileStream bufferStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    using (StreamReader sr = new StreamReader(bufferStream)) 
    { 
     string line; 
     while ((line = sr.ReadLine()) != null) // <--- Here I get the error 
     { 
      CustomMessageBox.Show(line); 
     } 
    } 
} 

)(私は実際のFileStreamとStreamReaderを使用してファイルを開くことができますが、それは、例えば、sr.ReadLine用でのStreamReaderを使用するために来るとき、それは、ファイルが別のプロセスで使用中であることを、例外がスローされます。

ここで言及したように、Reading a file used by another process [duplicate] FileShare属性はReadWriteでなければなりませんが、これは役に立ちませんでした。

また、私はStreamReader(bufferStream, Encoding.*)のような利用可能なエンコードを試しましたが、どちらもうまくいきませんでした。

私は見落としているものがありますか?

+1

これは、管理機能がラップされ、(https://msdn.microsoft.com/library/windows/desktop/aa365202)[ 'LockFile'で文書化]されています。"ロックプロセスがファイルをもう一度開くと、領域をロック解除するまで、この2番目のハンドルを通じて指定された領域にアクセスすることはできません。最初のストリームは、読んだり読んだりするために使う必要があります。 –

+0

読み込みを許可しながら、ファイルを書き込み用にロックしたいと思っていますか?その場合、これはhttps://stackoverflow.com/q/3279071/120955の複製ですか? – StriplingWarrior

+0

とにかくファイル全体をロックしようとしているので、Lockを使用する代わりにFileShare.Noneで開くことができます。 – Evk

答えて

0

ファイルストリームでLockを呼び出して、ファイル全体をロックすることを示すパラメータを渡しています。ドキュメントによれば、

ファイルストリームの範囲をロックすると、ロックプロセスのスレッドはファイルストリームのその範囲に排他的にアクセスできます。

ファイルをロックしたくない場合は、Lockに電話をかけないでください。

+0

私はちょうど顔面の瞬間があった、あなたは絶対に正しいです。私はそれが魅力のように動作するロック行をコメントアウトした後、ありがとう。 –

0

これは、Windowsによれば、ファイルに対する新しいハンドルを作成しているからです。 ファイルがロックされていると、ほかのストリームで他のハンドルを取得できません。方が良い、このようにコードを修正:

using (FileStream bufferStream = new FileStream(filePath, FileMode.Open, 
       FileAccess.Read, FileShare.ReadWrite)) 
{ 
    bufferStream.Lock(0L, bufferStream.Length); 
    using (StreamReader sr = new StreamReader(bufferStream)) 
    { 
     string line; 
     while ((line = sr.ReadLine()) != null) // <--- Here I get the error 
     { 
     CustomMessageBox.Show(line); 
     } 
    } 

    // dispose lock 
    bufferStream.Unlock(0L, bufferStream.Length); 
} 
+0

[ストリームを開いたままにすることができるコンストラクタ]を使用しない限り、 'StreamReader'が渡されたストリームの所有権を取得するため、動作しません(https://docs.microsoft.com/dotnet/api/ system.io.streamreader.-ctor?view = netframework-4.7.1#System_IO_StreamReader__ctor_System_IO_Stream_System_Text_Encoding_System_Boolean_System_Int32_System_Boolean_)。 '.Unlock'を呼び出すときには、ストリームは既に破棄されています。 –

関連する問題