warum fsutil.exe nimmt weniger Zeit in eine große Datei in Disk als programmatisch zu schreiben?

StackOverflow https://stackoverflow.com/questions/1893200

  •  19-09-2019
  •  | 
  •  

Frage

Diese Frage ist nach diesem Thema: die Schaffung eine riesige Dummy-Datei in einer Angelegenheit von Sekunden in c #

Ich habe gerade überprüfte die fsutil.exe in XP / Vista / seven eine riesige Menge von Dummy-Daten in Speicherplatte zu schreiben und es braucht weniger Zeit, eine so große Datei im Vergleich zu schreiben Art und Weise programmaticly.

Wenn ich versuche, das gleiche mit Hilfe zu tun .net es deutlich mehr Zeit als fsutil.exe stattfinden wird.

Anmerkung: Ich weiß, dass .net nicht nativen Code aus diesem Grunde verwendet ich habe gerade überprüft dieses Problem mit nativer api auch wie folgt vor:

long int size = DiskFree('L' - 64);
const char* full = "fulldisk.dsk";
__try{
Application->ProcessMessages();
HANDLE hf = CreateFile(full,
                       GENERIC_WRITE,
                       0,
                       0,
                       CREATE_ALWAYS,
                       0,
                       0);
SetFilePointer(hf, size, 0, FILE_BEGIN);
SetEndOfFile(hf);
CloseHandle(hf);
}__finally{
    ShowMessage("Finished");
    exit(0);

und die Antwort war so gleich wie .net Ergebnisse.

, sondern mit Hilfe von fsutil.exe es dauert nur weniger als Dauer oben oder .net Ansätze sagen, dass es 2-mal schneller ist

Beispiel: zum Schreiben von 400mb mit .net dauert es ca. 40 Sekunden die gleiche Menge mit fsutil.exe um 20secs oder weniger stattfinden wird.

Gibt es eine Erklärung darüber? oder welche Funktion fsutil.exe tut Gebrauch, die diese Bedeutung Geschwindigkeit hat zu schreiben?

War es hilfreich?

Lösung

Ich weiß nicht genau, was fsutil tut, aber ich weiß von zwei Möglichkeiten, eine große Datei zu schreiben, die schneller sind als das, was Sie oben getan haben (oder die Suche nach der Länge Sie wollen und eine Null zu schreiben, die hat das gleiche Ergebnis).

Das Problem mit diesen Ansätzen ist, dass sie Null-füllen Sie die Datei zu der Zeit Du den Schreib tun.

Sie können die Nullfüllung entweder vermeiden:

  1. eine spärliche Datei erstellen. Die Größe markiert ist, wo Sie es wollen, aber die Daten nicht tatsächlich auf der Festplatte vorhanden ist, bis Sie es schreiben. Alle lesen die ungeschriebenen Bereiche werden Nullen zurück.
  2. Mit dem SetFileValidData Funktion stellen Sie die gültige Datenlänge ohne die Datei zuerst Nullstellung. Aufgrund von möglichen Sicherheitsproblemen, dieser Befehl erfordert erhöhten Berechtigungen.

Andere Tipps

ich mit dem letzten Kommentar zustimmen. Ich war mit einem Minifilter-Treiber zu experimentieren und IRP_MJ_WRITE IRPs in Rückruf wurde einzufangen. Als ich in die Datei von cmd Linie oder Win32-Anwendung erstellen oder schreiben, kann ich sehen, schreibt herab. Aber wenn ich eine Datei mit „fsutil Datei createnew ...“ erstellt Befehl, ich sehe keine Schreibvorgänge. Ich sehe dieses Verhalten auf win2k8 r2 auf NTFS-Volume. Und ich glaube nicht, (nicht sicher, 100% though) eine Datei mit geringer Dichte ist entweder. Es ist wahrscheinlich die Größe Eigenschaften in MFT Einstellung, ohne die Cluster zugeordnet werden. fsutil tun, um die verfügbare freie Speicherplatz überprüfen, so dass, wenn die Dateigröße größer als freier Speicherplatz auf der Festplatte ist, erhalten Sie Fehler 1.

Ich lief auch Programm Sening FSCTL_GET_RETRIEVAL_POINTERS- auf die Datei, und ich bekam ein Maß für die gesamte Größe der Datei. Aber ich glaube, es wird alle Daten bekommen

Das ist etwas, das sein könnte

  • Geschrieben in Assembler (Raw Verblindung Geschwindigkeit)
  • ein native C / C ++ Code zu tun, um diesen
  • Möglicherweise ein nicht dokumentiertes Systemaufruf diesen oder einen Trick zu tun, die nicht überall dokumentiert ist.

Die drei oben genannten Punkte einen großen signifikanten Faktor haben könnten - wenn man darüber nachdenkt, wenn ein .NET-Code geladen wird, ist es von der Laufzeit (Ok jit'ted wird, würde der Faktor Zeit nicht spürbar sein, wenn Sie eine haben schnelle Maschine prallt -. auf einem niedrigen Ende pentium, wäre es spürbar, träge Belastung sein)

Mehr als wahrscheinlich es entweder in C / C geschrieben wurde, konnte ++. Es mag Sie überraschen, wenn es in Assembler geschrieben wurde.

Sie können dies selbst überprüfen - sehen Sie die Dateigröße der ausführbaren Datei und vergleichen Sie es mit einer ausführbaren .NET. Man könnte argumentieren, dass die Datei komprimiert ist, was ich bezweifle es wäre und daher geneigt sein, dies auszuschließen, würde Microsoft nicht so weit geht ich mit dem Komprimieren Executables Geschäft rechnen.

Hope dies Ihre Frage beantwortet, Freundliche Grüße, Tom.

fsutil ist nur schnell auf NTFS und exFAT, nicht auf FAT32, FAT16 Dies liegt daran, dass einige Dateisystem eine „initialisierte Größe“ concespt haben und somit eine schnelle Dateiinitialisierung unterstützen. Diese behält nur die Cluster aber nicht Null sie nicht aus, weil es in dem Dateisystem stellt fest, dass keine Daten in die Datei geschrieben wurden und gültig liest würde alle 00 gefüllte Puffer zurück.

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