Question

Quelqu'un connaît-il un moyen de copier un fichier du chemin A vers le chemin B et de supprimer le cache du système de fichiers Windows ?
L'utilisation typique consiste à copier un fichier volumineux depuis une clé USB ou un serveur vers votre ordinateur local.Windows semble tout échanger si le fichier est vraiment volumineux, par ex.2 Go.Préférez l’exemple en C#, mais je suppose que ce serait un appel Win32 si possible.

Était-ce utile?

La solution

Plus important encore, il existe FILE_FLAG_WRITE_THROUGH et FILE_FLAG_NO_BUFFERING.

MSDN a un article intéressant sur les deux : http://support.microsoft.com/kb/99794

Autres conseils

En C#, j'ai trouvé quelque chose comme ceci qui fonctionne, cela peut être modifié pour copier directement dans le fichier de destination :

    public static byte[] ReadAllBytesUnbuffered(string filePath)
    {
        const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
        var fileInfo = new FileInfo(filePath);
        long fileLength = fileInfo.Length;
        int bufferSize = (int)Math.Min(fileLength, int.MaxValue / 2);
        bufferSize += ((bufferSize + 1023) & ~1023) - bufferSize;
        using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None,
                                           bufferSize, FileFlagNoBuffering | FileOptions.SequentialScan))
        {
            long length = stream.Length;
            if (length > 0x7fffffffL)
            {
                throw new IOException("File too long over 2GB");
            }
            int offset = 0;
            int count = (int)length;
            var buffer = new byte[count];
            while (count > 0)
            {
                int bytesRead = stream.Read(buffer, offset, count);
                if (bytesRead == 0)
                {
                    throw new EndOfStreamException("Read beyond end of file EOF");
                }
                offset += bytesRead;
                count -= bytesRead;
            }
            return buffer;
        }
    }

Je ne sais pas si cela aide, mais jetez un oeil à Performances accrues grâce à FILE_FLAG_SEQUENTIAL_SCAN.

RÉSUMÉ

Il existe un indicateur pour CreateFile () appelé file_flag_sequential_scan qui ordonne au gestionnaire de cache d'accès au fichier séquentiellement.

Quiconque lit des fichiers potentiellement volumineux avec un accès séquentiel peut spécifier ce drapeau pour une performance accrue.Ce drapeau est utile si vous lisez des fichiers "principalement" séquentiels, mais que vous sautez parfois de petites gammes d'octets.

Si cela ne vous dérange pas d'utiliser un outil, ESEUTIL a très bien fonctionné pour moi.

Vous pouvez consulter ceci Blog entrée comparant les fonctions IO tamponnées et non tamponnées et d'où obtenir ESEUTIL.

copier du texte du blog technet :

Ainsi, en regardant la définition des E/S tamponnées ci-dessus, nous pouvons voir où se situent les problèmes de performances perçus : dans la surcharge du cache du système de fichiers.Les E/S sans tampon (ou une copie de fichier brut) sont préférables lorsque nous essayons de copier un fichier volumineux d'un emplacement à un autre lorsque nous n'avons pas l'intention d'accéder au fichier source une fois la copie terminée.Cela évitera la surcharge du cache du système de fichiers et empêchera le cache du système de fichiers d'être efficacement vidé par les données de fichiers volumineux.De nombreuses applications y parviennent en appelant CreateFile() pour créer un fichier de destination vide, puis en utilisant les fonctions ReadFile() et WriteFile() pour transférer les données.CreateFile() - La fonction CreateFile crée ou ouvre un fichier, un flux de fichiers, un répertoire, un disque physique, un volume, un tampon de console, un lecteur de bande, une ressource de communication, un emplacement de courrier ou un canal nommé.La fonction renvoie un handle qui peut être utilisé pour accéder à un objet.ReadFile() - La fonction ReadFile lit les données d'un fichier et commence à la position indiquée par le pointeur de fichier.Vous pouvez utiliser cette fonction pour les opérations synchrones et asynchrones.WriteFile() - La fonction WriteFile écrit des données dans un fichier à la position spécifiée par le pointeur de fichier.Cette fonction est conçue pour un fonctionnement synchrone et asynchrone.Pour copier des fichiers très volumineux sur le réseau, mon utilitaire de copie préféré est ESEUTIL, qui est l'un des utilitaires de base de données fournis avec Exchange.

Eseutil est une réponse correcte, également depuis Win7/2008 R2, vous pouvez utiliser le commutateur /j dans Xcopy, qui a le même effet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top