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

Comment puis-je m'assurer qu'un fichier est entièrement écrit avant de le copier ?

Patricia Arquette
Libérer: 2025-01-03 17:45:43
original
598 Les gens l'ont consulté

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

Attendre qu'un fichier soit entièrement écrit

Dans certains scénarios, il est crucial de s'assurer que les opérations de copie de fichiers ne commencent que lorsque le fichier source est entièrement écrit. Malheureusement, cela peut être difficile lorsqu'il s'agit de fichiers volumineux, car des tentatives de copie prématurées peuvent entraîner l'erreur redoutée « Impossible de copier le fichier, car il est utilisé par un autre processus ».

Une solution de contournement au problème.

Bien qu'il n'existe pas de solution complète à ce problème, il existe une solution de contournement qui consiste à vérifier périodiquement si le fichier est toujours en cours de modification avant de lancer le processus de copie. Voici deux méthodes pour accomplir cette tâche :

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

Cette méthode tente d'ouvrir le fichier pour un accès exclusif et renvoie vrai si le fichier est verrouillé (c'est-à-dire toujours en cours d'écriture ou de traitement par un autre thread).

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

Cette méthode vérifie à la fois l'existence du fichier et sa disponibilité pour un accès exclusif, renvoyant true si le fichier est verrouillé (c'est-à-dire inaccessible en raison d'un partage ou d'une violation de verrouillage).

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