Domanda

Qualcuno conosce un modo per copiare un file dal percorso A al percorso B e sopprimere la cache del file system di Windows?
L'uso tipico è la copia di un file di grandi dimensioni da un'unità USB o da un server sul computer locale.Windows sembra scambiare tutto se il file è veramente grande, ad es.2GiB.Preferisco l'esempio in C#, ma suppongo che questa sarebbe una chiamata Win32 di qualche tipo, se possibile.

È stato utile?

Soluzione

Ancora più importante, ci sono FILE_FLAG_WRITE_THROUGH e FILE_FLAG_NO_BUFFERING.

MSDN ha un bell'articolo su entrambi: http://support.microsoft.com/kb/99794

Altri suggerimenti

In C# ho trovato qualcosa di simile che funziona, questo può essere modificato per copiare direttamente nel file di destinazione:

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

Non sono sicuro che questo aiuti, ma dai un'occhiata Aumento delle prestazioni utilizzando FILE_FLAG_SEQUENTIAL_SCAN.

RIEPILOGO

Esiste un flag per createFile () chiamato file_flag_sequential_scan che indirizzerà il gestore cache per accedere al file in sequenza.

Chiunque legga file potenzialmente grandi con accesso sequenziale può specificare questo flag per aumentare le prestazioni.Questo flag è utile se stai leggendo file che sono "per lo più" sequenziali, ma occasionalmente salti piccoli gamme di byte.

Se non ti dispiace usare uno strumento, ESEUTIL ha funzionato benissimo per me.

Puoi controllare questo blog voce che confronta le funzioni IO bufferizzate e non bufferizzate e da dove ottenere ESEUTIL.

copiando del testo dal blog technet:

Quindi, osservando la definizione di I/O bufferizzata sopra, possiamo vedere dove si trovano i problemi di prestazioni percepiti: nell'overhead della cache del file system.L'I/O senza buffer (o una copia del file non elaborato) è preferibile quando si tenta di copiare un file di grandi dimensioni da una posizione a un'altra quando non si intende accedere al file di origine una volta completata la copia.Ciò eviterà il sovraccarico della cache del file system e impedirà che la cache del file system venga effettivamente svuotata dai dati di file di grandi dimensioni.Molte applicazioni ottengono ciò chiamando CreateFile() per creare un file di destinazione vuoto, quindi utilizzando le funzioni ReadFile() e WriteFile() per trasferire i dati.CreateFile(): la funzione CreateFile crea o apre un file, un flusso di file, una directory, un disco fisico, un volume, un buffer della console, un'unità nastro, una risorsa di comunicazione, un mailslot o una pipe denominata.La funzione restituisce un handle che può essere utilizzato per accedere a un oggetto.ReadFile(): la funzione ReadFile legge i dati da un file e inizia nella posizione indicata dal puntatore del file.È possibile utilizzare questa funzione sia per operazioni sincrone che asincrone.WriteFile() - La funzione WriteFile scrive i dati in un file nella posizione specificata dal puntatore del file.Questa funzione è progettata sia per il funzionamento sincrono che asincrono.Per copiare file molto grandi in rete, la mia utilità di copia preferita è ESEUTIL, una delle utilità di database fornite con Exchange.

Eseutil è una risposta corretta, inoltre a partire da Win7/2008 R2 è possibile utilizzare l'opzione /j in Xcopy, che ha lo stesso effetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top