![]() |
FileSize einer von anderem Prozess geöffneten Datei
Hallo zusammen,
ich möchte die Größe einer Datei ermitteln, welche aber von einem anderen Prozess geöffnet ist. Dieses Thema (von 2004) habe ich hierzu gefunden ... ![]() Leider funktioniert auch die Lösung 5 nicht richtig (sollte auch für von anderem Prozess geöffnete Dateien gehen). Erst wenn der andere Prozess die Datei schließt/freigibt erhalte ich einen richtigen Wert für die Dateigröße. Vielleicht hat ja jemand einen Tipp, wie ich das Problem lösen kann. (Ich verwende Delphi 2007, Windows7) Grüße, Seven Hiermit habe ich getestet (Lösung 5) ...
Code:
function GetFileSize(const AFileName: string): Int64;
var SearchRec: TSearchRec; OldMode: Cardinal; Size: TULargeInteger; begin Result := -1; OldMode := SetErrorMode(SEM_FAILCRITICALERRORS); try if FindFirst(AFileName, faAnyFile, SearchRec) = 0 then begin Size.LowPart := SearchRec.FindData.nFileSizeLow; Size.HighPart := SearchRec.FindData.nFileSizeHigh; Result := Size.QuadPart; SysUtils.FindClose(SearchRec); end; finally SetErrorMode(OldMode); end; end; |
AW: FileSize einer von anderem Prozess geöffneten Datei
Zitat:
Wenn das so korrekt beschrieben ist, dann wirst Du vermutlich nichts ändern können. Der schreibende Prozess entscheidet selber darüber wann er Daten schreibt. Was zeigt denn der Explorer bei den Dateieigenschaften an, während der Prozess die Datei offen hält? |
AW: FileSize einer von anderem Prozess geöffneten Datei
Zitat:
Mein Programm reagiert in Verbindung mit dem Explorer: Ich ermittel zyklisch alle 1s die Dateigröße. Ich bekomme in meinem Programm dann die wahrscheinlich richtigen Werte, wenn ich mit dem Explorer in das Verzeichnis gehe, aber auch nur wieder einmalig. Das hängt also irgendwie zusammen. Wird der Prozess beendet bzw. die Datei geschlossen, zeigt sowohl der Explorer wie auch mein Programm sofort den richtigen Wert an. |
AW: FileSize einer von anderem Prozess geöffneten Datei
Ich meinte die Eigenschaften-Seite (-> rechte Maustaste "Eigenschaften"). Ich denke das Problem liegt in den Tiefen von Windows. Die Verzeichnisinformationen werden halt nur dann ständig aktuell gehalten, wenn der schreibende Prozess die Datei entsprechend geöffnet hat (CreateFile -> FILE_FLAG_WRITE_THROUGH).
Nach Deiner Beschreibung müsste es so sein, dass Du immer dann wenn Du mit der rechten Maustaste die Eigenschaften abrufst einen aktuellen Wert für die Dateigröße bekommst. Vielleicht kannst Du Windows ja dazu überreden Dir auch aktuelle Informationen zu liefern, indem Du versuchst die Datei zum Lesen zu öffnen. Da der schreibende Prozess die Datei ja anscheinend leider exklusiv geöffnet hat, läuft das auf einen Fehler. Den ignorierst Du einfach und rufst erneut die Dateigröße ab. |
AW: FileSize einer von anderem Prozess geöffneten Datei
Zitat:
Zitat:
|
AW: FileSize einer von anderem Prozess geöffneten Datei
Hallo,
NTFS cacht die Schreibzugriffe und zusätzlich werden auch die Directory-Informationen (mindestens das Änderungsdatum der Dateien) gecacht. Da kann man nichts machen. ![]() |
AW: FileSize einer von anderem Prozess geöffneten Datei
Doch, kann man. Ich habe dafür schlicht eine DLL geschrieben, in den schreibenden Prozess injiziert und dann Hooks auf CreateFile und WriteFile gesetzt. So habe ich jeden Schreibzugriff 1:1 mitbekommen und konnte zudem aus dem Prozess heraus auch Abfragen über das bekannte Dateihandle machen.
Den Quelltext kann ich leider nicht veröffentlichen, aber Beispiele für Hooks gibt es für Delphi ja einige... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz