Frage

Jemand, der eine Möglichkeit zum kopieren einer Datei von Pfad A auf Pfad B und Unterdrückung der Windows-Datei-system-cache?
Typische Verwendung ist das kopieren einer großen Datei von einem USB-Laufwerk oder server auf Ihrer lokalen Maschine.Windows scheint zu tauschen alles aus, wenn die Datei sehr groß werden, z.B.2 GB.Bevorzugen Beispiel in C#, aber ich vermute, dies wäre ein Win32-Aufruf von einige Sortieren, wenn möglich.

War es hilfreich?

Lösung

Noch wichtiger ist, es gibt FILE_FLAG_WRITE_THROUGH und FILE_FLAG_NO_BUFFERING.

MSDN hat einen schönen Artikel über Sie beide: http://support.microsoft.com/kb/99794

Andere Tipps

In C# habe ich etwas gefunden, wie dies funktioniert, kann dies geändert werden, um direkt kopieren zu Ziel-Datei:

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

Ich bin mir nicht sicher, ob das hilft, aber nehmen Sie einen Blick auf Erhöhte Leistung Mit FILE_FLAG_SEQUENTIAL_SCAN.

ZUSAMMENFASSUNG

Es ist ein flag für die CreateFile() genannt FILE_FLAG_SEQUENTIAL_SCAN, die wird direkt der Cache-Manager Zugriff auf die Datei sequenziell.

Wer liest potenziell große Dateien mit sequenziellen Zugriff festlegen können dieses flag für höhere Leistung.Dieses flag ist nützlich, wenn Sie Lesen Dateien, die als "überwiegend" sequenzielle, aber Sie gelegentlich überspringen kleinen reicht von bytes.

Wenn Sie dont Geist mit einem tool ESEUTIL funktionierte großartig für mich.

Sie können check out this blog Eintrag, zu vergleichen Gepuffert und NonBuffered IO-Funktionen und von wo aus man ESEUTIL.

kopieren von text aus dem technet blog:

So suchen Sie auf der definition von gepufferten I/O oben, können wir sehen, wo die wahrgenommene performance-Probleme liegen - in den Dateisystem-cache-overhead.Unbuffered I/O (oder eine raw-Datei kopieren) ist vorzuziehen, wenn Sie versuchen, eine große Datei kopieren von einem Ort zum anderen, wenn wir nicht beabsichtigen, den Zugriff auf die Quelldatei nach dem kopieren abgeschlossen ist.Dadurch vermeiden Sie die Datei system-cache-overhead und verhindern, dass die Dateisystem-cache wirksam geleert, die durch die große Datei Daten.Viele Anwendungen erreichen dies durch Aufruf von CreateFile (), um ein leeres Ziel-Datei dann mit der ReadFile() und WriteFile () - Funktionen, um die Daten zu übertragen.CreateFile() - Die Funktion CreateFile erstellt oder öffnet eine Datei, Datei-stream, directory, physische Festplatte, ein volume -, Konsolen-Puffer, Bandlaufwerk, Kommunikation Ressource, mailslot, oder named pipe.Die Funktion gibt ein handle zurück, der verwendet werden kann, um auf ein Objekt zuzugreifen.ReadFile() - ReadFile-Funktion liest Daten aus einer Datei und startet an der position, die der Dateizeiger zeigt.Mit dieser Funktion können Sie sowohl für synchron-und asynchron-Vorgänge.WriteFile() - Die Funktion WriteFile schreibt Daten in eine Datei an der angegebenen position durch den Datei-Zeiger.Diese Funktion ist entworfen für sowohl synchrone und asynchrone operation.Für das kopieren von Dateien im Netzwerk, die sind sehr groß, meine Kopie Dienstprogramm der Wahl ist ESEUTIL, welche ist eines der Datenbank-Dienstprogramme zur Verfügung gestellt mit Austausch.

Eseutil ist eine richtige Antwort, auch da Win7 / 2008 R2 verwenden, können Sie die Option /j in Xcopy, das hat den gleichen Effekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top