source

"다른 프로세스에서 사용 중" 예외가 발생한 경우에도 파일을 읽는 방법은 무엇입니까?

ittop 2023. 5. 17. 23:24
반응형

"다른 프로세스에서 사용 중" 예외가 발생한 경우에도 파일을 읽는 방법은 무엇입니까?

VB.NET 또는 C#에서 다른 프로그램에서 사용 중인 텍스트 파일의 내용을 읽으려고 합니다. 즉, 프로그램을 중지할 수 없거나 프로그램이 텍스트 파일에 쓰기를 중지하고 다른 프로그램의 텍스트 파일에 현재 있는 내용을 주기적으로 읽으려고 합니다.

사용 중인 코드입니다(VB.NET).

Dim strContents As String
Dim objReader As StreamReader
objReader = New StreamReader(FullPath)
strContents = objReader.ReadToEnd()
objReader.Close()

또는 C#:

var objReader = new StreamReader(FullPath);
var strContents = objReader.ReadToEnd();
objReader.Close();

그러나 위에서는 IO 예외 "프로세스가 파일 '파일에 액세스할 수 없습니다.txt'는 다른 프로세스에서 사용되고 있기 때문입니다."이 시나리오에 해결 방법이 있습니까?

FileStream logFileStream = new FileStream("c:\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader logFileReader = new StreamReader(logFileStream);

while (!logFileReader.EndOfStream)
{
    string line = logFileReader.ReadLine();
    // Your code here
}

// Clean up
logFileReader.Close();
logFileStream.Close();

코드의 원본 소스

물고기는 제가 할게요.파일 공유 모드가 중요하므로 쓰기 공유를 허용해야 합니다.파일을 쓰는 프로세스가 이미 쓰기 액세스 권한을 얻었기 때문에 거부할 수 없습니다.StreamReader() 생성자는 FileShare를 사용합니다.읽고 다른 값을 사용하는 옵션이 없습니다.대신 StreamReader(Stream) 생성자를 사용하는 것이 실제로 해결 방법입니다.

그러나 이 공유 모드는 코드에도 영향을 미칩니다.다른 프로세스가 파일을 플러시할 때는 예측할 수 없습니다.마지막으로 읽은 행은 텍스트 행의 일부만 포함할 수 있습니다.파일 버퍼를 다시 플러시하면 나중에 나머지 줄이 표시됩니다.분명히 이것은 당신의 논리를 망칠 수 있습니다.

그것은 그것에 따라 다릅니다.FileShare파일에 추가되는 다른 응용 프로그램에 의해 파일이 열린 모드입니다.다른 응용 프로그램이 파일을 열 때 다음을 지정했습니다.FileShare다른 응용 프로그램이 파일에 액세스할 수 있는 모드입니다.이것.FileShare모드는 읽기, 쓰기, 둘 다, 삭제, 모두 또는 없음일 수 있습니다.

동일하게 지정해야 합니다.FileShare다른 응용 프로그램이 지정한 모드입니다.다른 응용 프로그램이 읽기만 허용하는 경우,FileShare.Read;만약 그것이 읽기와 쓰기 둘다를 허용한다면, 사용합니다.FileShare.ReadWrite.

StreamReader사용만FileShare.Read모드, 그래서 당신은 이미 그것이 올바른 것이 아니라고 가정할 수 있습니다.다음과 같이 ReadWrite를 시도합니다.

FileStream fs = new FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader reader = new StreamReader(fs);

이미 열려 있는 파일에서 이 작업이 어떻게 수행될지는 확실하지 않지만 응용 프로그램이 이 파일을 잠글 수는 없습니다.

FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs);

도움이 되길 바랍니다!

언급URL : https://stackoverflow.com/questions/4400517/how-can-i-read-a-file-even-when-getting-an-in-use-by-another-process-exception

반응형