Wie öffnest du das File-
Handle für GetFileInformationByHandle? Man kann bei
WinAPI.Windows.CreateFile() statt GENERIC_READ ein FILE_READ_ATTRIBUTES mitgeben. Dann ist CreateFile um einiges schneller. Und der Defender weiß, dass du dich nicht für den Inhalt der Datei interessierst.
Ein Test mit 69669 Dateien liefert bei mir:
Mit FILE_READ_ATTRIBUTES (Kalt):
CreateFile | 1,696 Sekunden |
GetFileInformationByHandle | 0,275 Sekunden |
CloseHandle | 0,353 Sekunden |
Mit GENERIC_READ (Kalt) (Defender braucht einen ganzen CPU-Kern):
CreateFile | 217,032 Sekunden |
GetFileInformationByHandle | 0,451 Sekunden |
CloseHandle | 0,428 Sekunden |
Übrigens die JclNTFS.pas NtfsGetHardLinkInfo Funktion nutzt GENERIC_READ, was sie somit auch extrem langsam macht, wenn ein Virenscanner vorhanden ist.
Hier der korrigierte JclNTFS.pas Code:
Delphi-Quellcode:
function NtfsGetHardLinkInfo(const FileName: string; var Info: TNtfsHardLinkInfo): Boolean;
var
F: THandle;
FileInfo: TByHandleFileInformation;
begin
Result := False;
F := CreateFile(PChar(FileName), {-->}FILE_READ_ATTRIBUTES{<--}, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if F <> INVALID_HANDLE_VALUE then
try
ResetMemory(FileInfo, SizeOf(FileInfo));
if GetFileInformationByHandle(F, FileInfo) then
begin
Info.LinkCount := FileInfo.nNumberOfLinks;
Info.FileIndexHigh := FileInfo.nFileIndexHigh;
Info.FileIndexLow := FileInfo.nFileIndexLow;
Result := True;
end;
finally
CloseHandle(F);
end
end;