문제

때로는 파일을 읽어야하고 결과적으로 잠겨있는 응용 프로그램이 있습니다. 내가 다른 사람에게서 이해했듯이 질문 나는 ioexception을 잡고 읽을 수있을 때까지 다시 시도해야합니다.

그러나 내 질문은 파일이 잠겨 있고 발생하는 또 다른 ioexcetpion이 아니라는 것을 확실히 알 수있는 방법입니다.

도움이 되었습니까?

해결책

.NET에서 읽기 파일을 열면 어느 시점에서 CreateFile 설정하는 API 함수 에러 코드 왜 실패한 이유를 확인하는 데 사용할 수 있습니다.

const int ERROR_SHARING_VIOLATION = 32;
try
{
    using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    }
}
catch (IOException ex)
{
    if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
    {
        Console.WriteLine("The process cannot access the file because it is being used by another process.");
    }
}

다른 팁

유용한 토론이 있습니다 Google 그룹 당신은 정말로 읽어야합니다. 옵션 중 하나는 Darin 's에 가깝습니다. 그러나 올바른 Win32 오류를 얻으려면 실제로 Win32 OpenFile () API를 직접 호출해야합니다 (그렇지 않으면 검색중인 오류를 실제로 알 수 없습니다).

다른 하나는 오류 메시지를 구문 분석하는 것입니다. 응용 프로그램이 다른 언어 버전에서 실행되면 실패합니다.

세 번째 옵션은 실제 hresult를 낚시하기 위해 반사와 함께 예외 클래스 내부를 해킹하는 것입니다.

IOException 계층 구조는 몇 가지 하위 클래스 IMHO의 혜택을받을 것입니다.

데이터를 읽으려면 다음을 수행 할 수 있습니다.

사용 (filestream fs = new Filestream (filename, filemode.open, fileaccess.read, fileshare.readwrite | fileshare.delete)) {....}

파일에 저장하려면 :

사용 (filestream fs = new Filestream (filename, filemode.append, fileaccess.write, fileshare.Read | fileshare.delete)) {...}

생성자 끝에있는 플래그는 다른 프로세스가 파일로 수행 할 수있는 작업을 설명합니다. 물론 글쓰기와 읽기를 모두 제어하면 괜찮습니다.

Bezieur가 설명한대로 열 수있는 다음 섹션 (또는 전체 파일)을 잠그십시오.http://www.java2s.com/code/vb/file-directory/lockandunlockafile.htm

파일을 읽고 쓰고 있다는 뜻입니까? 또는 외부 응용 프로그램이 작성하고 있습니다.

당신이 읽기와 쓰기를하고 있다면, 나는 당신이 다른 스레드에서 그것을하고 있다고 가정합니다.이 경우 dreaderWritelock 클래스를 살펴보고 시간 초과를 제공 할 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx

그렇지 않으면 파일을 읽기 전용 모드로 열면됩니다. 그런 다음 아무런 문제가 없어야합니다.

fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));

IoException 유형과 비교하여 다른 것이 아닌지 확인하고 확인할 수 있습니다.

와 같은

if (ex is FileNotFoundException)

System.io에서의 도움을 찾아 볼 수 있습니다. 해당 클래스의 많은 예외는 ioexception. 다른 유형의 예외인지 확인하기 위해 설명의 메시지를 살펴 봐야 할 수도 있고 shell32.dll로 Win32 API 호출을 할 수 있습니다. 파일이 잠겨 있는지 확인하는 기능이있을 수 있습니다.

또한 기다려야하는 경우 루프를 사용할 수 있지만 대기 중에 다른 작업을 수행하려면 비동기 스레드를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top