Überprüfen Sie die Datei-Größe, ohne öffnen der Datei in C++?
Ich versuche, die Dateigröße eine große Datei (12gb+) und ich will nicht, um die Datei zu öffnen, so zu tun, als ich behaupte, dass das Essen eine Menge von Ressourcen. Gibt es eine gute API zu tun? Ich bin in einer Windows-Umgebung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie rufen
GetFileSizeEx
, die ist einfacher zu bedienen als die älterenGetFileSize
. Sie benötigen zum öffnen der Datei durch den AufrufCreateFile
aber das ist eine billige operation. Ihre Annahme, dass das öffnen einer Datei ist teuer, auch eine 12GB-Datei, die falsch ist.Könnte man folgende Funktion verwenden, um den job zu erledigen:
Gibt es andere API-Aufrufe, werden Sie wieder die Größe der Datei, ohne Sie zu zwingen, erstellen Sie eine Datei behandeln, insbesondere
GetFileAttributesEx
. Jedoch, es ist völlig plausibel, dass diese Funktion nur die Datei öffnen hinter die kulissen.Wenn Sie kompilieren mit Visual Studio und wollen vermeiden, aufrufen von Win32-APIs können Sie dann
_wstat64
.Hier ist ein
_wstat64
basierte version der Funktion:Wenn die Leistung wurde jemals ein Problem für Sie, dann sollten Sie mal die verschiedenen Optionen auf allen Plattformen, die Sie Ziel, um eine Entscheidung zu treffen. Gehen Sie nicht davon aus, dass die APIs, die nicht brauchen, die Sie anrufen
CreateFile
schneller sein wird. Sie sein könnte, aber Sie werden nicht wissen, bis Sie es zeitlich.CreateFile()
kann ziemlich langsam sein, wenn Sie öffnen die Datei, die sich auf langsamen Medien wie Netzwerk-Festplatten, aber die Langsamkeit wäre aufgrund der Speicher-Zugriffs-Latenzzeiten und nicht wegen der Tatsache, dass die Datei riesig ist.std::wstring
Argumente als const-Referenz... du machst den Speicher kopiert bei jedem Aufruf :Sconst wchar_t*
als alles, was Sie wirklich wollen, ist zu nennen.c_str()
jedenfalls lassen die user entscheiden, wo und wenn Sie wollen, ein memcpy.GetCompressedFileSize
haben, die Datei zu öffnen, auch wenn das dauert ein Dateiname und nicht ein Datei-handle?Ich habe auch lebte mit der Angst, den Preis für das öffnen einer Datei und schließen Sie es nur, um seine Größe. Und beschlossen, zu Fragen der performance counter^ und sehen, wie teuer die Vorgänge wirklich sind.
Dies ist die Anzahl der Zyklen, die es nahm, um zu führen 1 Größe der Datei Abfrage auf die gleiche Datei mit den drei Methoden. Getestet auf 2 Dateien: 150 MB und 1,5 GB. Habe +/- 10% Schwankungen, so dass Sie scheinen nicht betroffen zu sein durch die tatsächliche Dateigröße. (offensichtlich das hängt von der CPU, aber es gibt Ihnen einen guten Aussichtspunkt)
CreateFile
,GetFileSizeEx
,CloseHandle
GetFileAttributesEx
FindFirstFile
,FindClose
Der KERN mit dem code, der verwendet wird^ ist hier erhältlich.
Als wir sehen können, aus diesem sehr wissenschaftlich 🙂 test, langsamste ist eigentlich die Datei opener. 2. der langsamste ist der Datei-finder, während der Gewinner ist der Attribute-reader. Nun, in Bezug auf Zuverlässigkeit,
CreateFile
soll der anderen vorgezogen 2. Aber ich weiß immer noch nicht wie das Konzept des öffnens einer Datei nur zum Lesen seiner Größe... es sei denn, ich mache size kritischen Sachen, ich werde gehen, für die Attribute.PS: Wann werde ich Zeit haben, werde ich versuchen zu Lesen Größen der Dateien, die geöffnet sind, und Schreibe. Aber nicht jetzt...
Andere option mit der FindFirstFile Funktion
ULARGE_INTEGER
statt von Anpassungen dieULONGLONG
bits manuell, zB:ULARGE_INTEGER ul; ul.LowPart = FindFileData.nFileSizeLow; ul.HighPart = FindFileData.nFileSizeHigh; ULONGLONG FileSize = ul.QuadPart;
. Auch%u
erwartet eine 32-bit -unsigned int
unter Windows verwenden, benötigen Sie%Lu
stattdessen für eine 64-bit-Ganzzahl.Als C++17, es ist Dateigröße als Teil der standard-Bibliothek. (Dann wird der implementor wird, um zu entscheiden, wie man es effizient!)
Was GetFileSize Funktion?
GetFileSize()
erfordert die Datei zuerst geöffnet werden, dann verwendet er diesen Griff, um zu bestimmen, wo die Datei liegt im Dateisystem, so dass Sie es greifen kann, die Größe. Wenn SieFindFirstFile()
stattdessen fragt es das Dateisystem, ohne die Datei zu öffnen.