파일이 완전히 기록될 때까지 대기
특정 시나리오에서는 소스 파일이 작성될 때만 파일 복사 작업이 시작되도록 하는 것이 중요합니다. 완전히 쓰여있습니다. 불행히도, 너무 이르게 복사하려고 시도하면 "파일을 다른 프로세스에서 사용하고 있기 때문에 파일을 복사할 수 없습니다." 오류가 발생할 수 있으므로 대용량 파일을 처리할 때 이는 어려울 수 있습니다.
문제 해결 방법
이 문제에 대한 완전한 해결책은 없지만 복사를 시작하기 전에 파일이 여전히 수정되고 있는지 주기적으로 확인하는 해결 방법이 있습니다. 프로세스. 이 작업을 수행하는 두 가지 방법은 다음과 같습니다.
방법 1
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { return true; } finally { if (stream != null) stream.Close(); } return false; }
이 방법은 독점 액세스를 위해 파일 열기를 시도하고 파일이 잠겨 있으면 true를 반환합니다. (즉, 아직 다른 스레드에 의해 작성 또는 처리 중입니다.)
방법 2
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { if (File.Exists(file)) { FileStream stream = null; try { stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (Exception ex2) { int errorCode = Marshal.GetHRForException(ex2) & ((1 << 16) - 1); if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION)) { return true; } } finally { if (stream != null) stream.Close(); } } return false; }
이 방법은 파일의 존재 여부와 단독 액세스 가능성을 모두 확인하고, 파일이 잠겨 있는 경우(예: 공유 또는 잠금 위반으로 인해 액세스할 수 없는 경우) true를 반환합니다.
위 내용은 파일을 복사하기 전에 파일이 완전히 기록되었는지 어떻게 확인할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!