Maison > développement back-end > C++ > Comment s'assurer qu'un fichier est entièrement écrit avant de le copier ?

Comment s'assurer qu'un fichier est entièrement écrit avant de le copier ?

Linda Hamilton
Libérer: 2025-01-05 12:07:41
original
395 Les gens l'ont consulté

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

Attendre que le fichier soit complètement écrit

Lorsqu'un fichier est créé dans un répertoire surveillé, une tâche courante consiste à le copier dans un autre emplacement. Cependant, les transferts de fichiers volumineux peuvent entraîner des échecs car le fichier n'est pas complètement écrit avant le début du processus de copie.

Pour résoudre ce problème, une solution de contournement consiste à vérifier l'état du fichier avant la copie. Une méthode consiste à utiliser la fonction IsFileLocked, qui renvoie True si le fichier est toujours en cours d'écriture ou de traitement par un autre thread. Voici un exemple :

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;
}
Copier après la connexion

Ce code peut être incorporé dans votre gestionnaire d'événements FileSystemWatcher_Created :

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);
}
Copier après la connexion

Vous pouvez également utiliser la méthode suivante :

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;
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal