Heim >Backend-Entwicklung >C++ >Wie kann ich sicherstellen, dass eine Datei vollständig geschrieben ist, bevor ich sie kopiere?

Wie kann ich sicherstellen, dass eine Datei vollständig geschrieben ist, bevor ich sie kopiere?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-03 17:45:43621Durchsuche

How Can I Ensure a File Is Fully Written Before Copying It?

Warten, bis eine Datei vollständig geschrieben ist

In bestimmten Szenarien ist es wichtig sicherzustellen, dass Dateikopiervorgänge erst beginnen, wenn die Quelldatei ist vollständig geschrieben. Leider kann dies beim Umgang mit großen Dateien eine Herausforderung darstellen, da vorzeitige Kopierversuche zu dem gefürchteten Fehler „Die Datei kann nicht kopiert werden, da sie von einem anderen Prozess verwendet wird“ führen können.

Eine Problemumgehung für das Problem

Obwohl es keine vollständige Lösung für dieses Problem gibt, gibt es eine Problemumgehung, bei der regelmäßig überprüft wird, ob die Datei noch geändert wird, bevor der Kopiervorgang gestartet wird. Hier sind zwei Methoden, um diese Aufgabe zu erfüllen:

Methode 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;
}

Diese Methode versucht, die Datei für exklusiven Zugriff zu öffnen und gibt true zurück, wenn die Datei gesperrt ist (d. h. wird noch von einem anderen Thread geschrieben oder verarbeitet).

Methode 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;
}

Diese Methode prüft sowohl das Vorhandensein der Datei als auch ihre Verfügbarkeit für exklusiven Zugriff und gibt „true“ zurück, wenn die Datei gesperrt ist (d. h. aufgrund einer Freigabe- oder Sperrverletzung nicht zugänglich ist).

Das obige ist der detaillierte Inhalt vonWie kann ich sicherstellen, dass eine Datei vollständig geschrieben ist, bevor ich sie kopiere?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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