AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi FileSize einer von anderem Prozess geöffneten Datei

FileSize einer von anderem Prozess geöffneten Datei

Ein Thema von SevenOfNine · begonnen am 19. Mär 2017 · letzter Beitrag vom 20. Mär 2017
Antwort Antwort
SevenOfNine

Registriert seit: 11. Jan 2007
Ort: Giessen, Mittelhessen
41 Beiträge
 
Delphi 7 Professional
 
#1

FileSize einer von anderem Prozess geöffneten Datei

  Alt 19. Mär 2017, 09:25
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;
Mein Kindheitstraum: Die 32bit Farbpalette als Bundstiftsammlung.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#2

AW: FileSize einer von anderem Prozess geöffneten Datei

  Alt 19. Mär 2017, 11:42
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?
  Mit Zitat antworten Zitat
SevenOfNine

Registriert seit: 11. Jan 2007
Ort: Giessen, Mittelhessen
41 Beiträge
 
Delphi 7 Professional
 
#3

AW: FileSize einer von anderem Prozess geöffneten Datei

  Alt 19. Mär 2017, 13:05
...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.
Mein Kindheitstraum: Die 32bit Farbpalette als Bundstiftsammlung.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#4

AW: FileSize einer von anderem Prozess geöffneten Datei

  Alt 19. Mär 2017, 19:59
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.
  Mit Zitat antworten Zitat
SevenOfNine

Registriert seit: 11. Jan 2007
Ort: Giessen, Mittelhessen
41 Beiträge
 
Delphi 7 Professional
 
#5

AW: FileSize einer von anderem Prozess geöffneten Datei

  Alt 19. Mär 2017, 20:14
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.
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.
Mein Kindheitstraum: Die 32bit Farbpalette als Bundstiftsammlung.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: FileSize einer von anderem Prozess geöffneten Datei

  Alt 20. Mär 2017, 13:20
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: FileSize einer von anderem Prozess geöffneten Datei

  Alt 20. Mär 2017, 13:53
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...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 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