Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi FileSize einer von anderem Prozess geöffneten Datei (https://www.delphipraxis.net/192086-filesize-einer-von-anderem-prozess-geoeffneten-datei.html)

SevenOfNine 19. Mär 2017 08:25

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 ...
http://www.delphipraxis.net/24331-da...ermitteln.html

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;

samso 19. Mär 2017 10:42

AW: FileSize einer von anderem Prozess geöffneten Datei
 
Zitat:

Zitat von SevenOfNine (Beitrag 1364692)
richtigen Wert für die Dateigröße.

Das soll vermutlich bedeuten, dass die Dateigröße zunächst zu klein ist und wenn der schreibende Prozess die Datei geschlossen hat, ist die Dateigröße so wie Du sie erwartest?

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?

SevenOfNine 19. Mär 2017 12:05

AW: FileSize einer von anderem Prozess geöffneten Datei
 
Zitat:

Zitat von samso (Beitrag 1364704)
...Was zeigt denn der Explorer bei den Dateieigenschaften an, während der Prozess die Datei offen hält?

Wenn der Explorer das entprechende Verzeichnis anzeigt und der Prozess die Datei erzeugt und dort "langsam" Daten hinzufügt, zeigt der Explorer die Datei und die Größe 0 an. Gehe ich aus dem Verzeichnis raus und wieder rein, zeigt der Explorer die (anscheinend) richtige Größe an, aber auch nur einmalig. Er aktualsisiert nicht, solange ich im Verzeichnis bin.

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.

samso 19. Mär 2017 18:59

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.

SevenOfNine 19. Mär 2017 19:14

AW: FileSize einer von anderem Prozess geöffneten Datei
 
Zitat:

Zitat von samso (Beitrag 1364771)
Ich meinte die Eigenschaften-Seite (-> rechte Maustaste "Eigenschaften").

Das müsste ich nochmal testen, aber ich vermute es wird dann genauso korrekt angezeigt, wie wenn ich das Verzeichnis neu anzeige.
Zitat:

Zitat von samso (Beitrag 1364771)
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.

Gute Idee, das werde ich mal probieren.

hoika 20. Mär 2017 12:20

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.

https://blogs.msdn.microsoft.com/old...226-00/?p=8813

jaenicke 20. Mär 2017 12:53

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 16:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz