Warten Sie, bis die Datei vollständig geschrieben ist
Wenn eine Datei in einem überwachten Verzeichnis erstellt wird, besteht eine häufige Aufgabe darin, sie in ein anderes zu kopieren Standort. Bei der Übertragung großer Dateien kann es jedoch zu Fehlern kommen, da die Datei nicht vollständig geschrieben ist, bevor der Kopiervorgang beginnt.
Um dieses Problem zu beheben, besteht eine Problemumgehung darin, den Status der Datei vor dem Kopieren zu überprüfen. Eine Methode besteht darin, die Funktion IsFileLocked zu verwenden, die True zurückgibt, wenn die Datei noch von einem anderen Thread geschrieben oder verarbeitet wird. Hier ist ein Beispiel:
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; }
Dieser Code kann in Ihren FileSystemWatcher_Created-Ereignishandler integriert werden:
public static void listener_Created(object sender, FileSystemEventArgs e) { while (IsFileLocked(new FileInfo(e.FullPath))) { // Wait for file to finish writing } File.Copy(e.FullPath, @"D:\levan\FolderListenerTest\CopiedFilesFolder\" + e.Name); }
Alternativ können Sie die folgende Methode verwenden:
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { if (File.Exists(file) == true) { 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; }
Das obige ist der detaillierte Inhalt vonWie kann sichergestellt werden, dass eine Datei vor dem Kopieren vollständig geschrieben ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!