Heim > Backend-Entwicklung > C++ > Wie kann sichergestellt werden, dass eine Datei vor dem Kopieren vollständig geschrieben ist?

Wie kann sichergestellt werden, dass eine Datei vor dem Kopieren vollständig geschrieben ist?

Linda Hamilton
Freigeben: 2025-01-05 12:07:41
Original
395 Leute haben es durchsucht

How to Ensure a File Is Completely Written Before Copying It?

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;
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage