복사 전 파일 완료 보장
FileSystemWatcher를 사용하여 디렉터리에서 파일 생성을 감지하고 이후 복사하는 시나리오의 경우 다른 위치로 이동하는 경우 대용량 파일(>10MB)이 관련된 경우 문제가 발생합니다. 파일 생성이 완료되기 전에 복사 프로세스가 시작되어 "파일을 다른 프로세스에서 사용하고 있기 때문에 복사할 수 없습니다"라는 오류가 발생할 수 있습니다.
해결 방법:
알려진 유일한 해결 방법은 복사 작업을 시작하기 전에 파일이 잠겨 있는지 확인하는 것입니다. 이는 파일이 더 이상 잠겨 있지 않음을 나타내는 false를 반환할 때까지 파일이 사용 중인지 반복적으로 확인하는 기능을 통해 달성할 수 있습니다.
방법 1(직접 복사):
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { // File still being written, processed, or doesn't exist return true; } finally { if (stream != null) stream.Close(); } // File not locked return false; }
방법 2:
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { // Check destination file status 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; }
위 내용은 '파일 사용 중' 오류를 방지하기 위해 복사하기 전에 파일 완료를 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!