Heim >Backend-Entwicklung >C++ >Wie kann sichergestellt werden, dass die Datei vor dem Kopieren vollständig ist, um „File in Use'-Fehler zu verhindern?
Sicherstellen der Dateivervollständigung vor dem Kopieren
In dem Szenario, in dem ein FileSystemWatcher verwendet wird, um die Erstellung von Dateien in einem Verzeichnis zu erkennen und diese anschließend zu kopieren an einen anderen Ort verschieben, tritt ein Problem auf, wenn es sich um große Dateien (> 10 MB) handelt. Der Fehler „Die Datei kann nicht kopiert werden, da sie von einem anderen Prozess verwendet wird“ kann auftreten, weil der Kopiervorgang beginnt, bevor die Dateierstellung abgeschlossen ist.
Problemumgehung:
Die einzige bekannte Problemumgehung besteht darin, zu prüfen, ob die Datei gesperrt ist, bevor der Kopiervorgang gestartet wird. Dies kann durch eine Funktion erreicht werden, die wiederholt prüft, ob die Datei verwendet wird, bis sie „false“ zurückgibt, was anzeigt, dass die Datei nicht mehr gesperrt ist.
Methode 1 (Direktes Kopieren):
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; }
Methode 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; }
Das obige ist der detaillierte Inhalt vonWie kann sichergestellt werden, dass die Datei vor dem Kopieren vollständig ist, um „File in Use'-Fehler zu verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!