2017-11-06 26 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를 사용하여 파일을 열 수 있지만, 그것은()는 파일이 다른 프로세스에 의해 사용중인 것을, 예외를 throw 예를 들어 sr.ReadLine과에서는 StreamReader를 사용하는 때.

여기에 언급 된대로 Reading a file used by another process [duplicate] FileShare 속성은 ReadWrite 여야하지만 이는 도움이되지 않습니다.

또한 StreamReader(bufferStream, Encoding.*)과 같은 사용 가능한 모든 인코딩을 시도했지만 그 중 하나도 작동하지 않았습니다.

내가 간과하는 것이 있습니까?

+1

[에 설명을'LockFile'] (https://msdn.microsoft.com/library/windows/desktop/aa365202)하는 관리 기능 랩 " 잠금 프로세스가 파일을 다시 열면 영역을 잠금 해제 할 때까지이 두 번째 핸들을 통해 지정된 영역에 액세스 할 수 없습니다. " 당신은 당신이하고 싶은 독서를 위해 첫 번째 스트림을 사용해야합니다. –

+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

[스트림을 열어 둘 수있는 하나의 생성자] (https://docs.microsoft.com/dotnet/api/)를 사용하지 않는 한 'StreamReader'가 전달 된 스트림의 소유권을 갖기 때문에 작동하지 않습니다. 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'을 호출 할 때까지 이미 스트림이 삭제되었습니다. –