Filelock이 출시 될 때까지 가장 잘 기다리는 방법
-
22-08-2019 - |
문제
때로는 파일을 읽어야하고 결과적으로 잠겨있는 응용 프로그램이 있습니다. 내가 다른 사람에게서 이해했듯이 질문 나는 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 호출을 할 수 있습니다. 파일이 잠겨 있는지 확인하는 기능이있을 수 있습니다.
또한 기다려야하는 경우 루프를 사용할 수 있지만 대기 중에 다른 작업을 수행하려면 비동기 스레드를 사용하십시오.