Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateigröße ermitteln, während die Datei ausgeführt wird??? (https://www.delphipraxis.net/53087-dateigroesse-ermitteln-waehrend-die-datei-ausgefuehrt-wird.html)

romber 9. Sep 2005 19:44


Dateigröße ermitteln, während die Datei ausgeführt wird???
 
Hallo!

folgende Funktion benutze ich, wenn ich Größe einer Datei auf der Fesplatte ermitteln möchte:

Delphi-Quellcode:
function CheckFileSize(aFilename: string): integer;
var
   f: file of Byte;
   size: Longint;
begin
 AssignFile(f, aFilename);
 Reset(f);
 try
   size := FileSize(f);
 finally
   CloseFile(f);
 end;
 Result := size;
end;
Leider hängt die Funktion, wenn die zu prüfende EXE-Datei gerade läuft. Liegt sicher an AssignFile, weil die Datei bereits "besetzt" ist. Gibt es eine alternative Funktion, die mein Problem löst?

Karl-Heinz 9. Sep 2005 20:19

Re: Dateigröße ermitteln, während die Datei ausgeführt wird?
 
So gehts ohne Angrabbeln der Datei mit WinAPI:

Delphi-Quellcode:
Function WinFilesize(afile: string): integer;

Var
  tmpW32FD : WIN32_FIND_DATA;
  FindHandle : THandle;
Begin
  FindHandle := FindFirstFile(PCHAR(afile), tmpW32FD);
  If FindHandle <> INVALID_HANDLE_VALUE Then
  Begin
    Result := (tmpW32FD.nFileSizeHigh Shl 32) +
      tmpW32FD.nFileSizeLow;
    FindClose(FindHandle);
  End Else
    Result := 0;
End;
Bis denn,
Karl-Heinz

[edit=Luckie]Wir haben hier Delphi-Tags. ;) Mfg, Luckie[/edit]

Karl-Heinz 9. Sep 2005 20:23

Re: Dateigröße ermitteln, während die Datei ausgeführt wird?
 
Oder noch einfacher:

Delphi-Quellcode:
function myfilesize(afile: string): integer;
var
  FileHandle: THandle;
begin
  FileHandle := FileOpen(FFileName, fmOpenRead or fmShareDenyWrite);
  result := -1; // Fehler
  if FileHandle <> 0 then
  try
    result := GetFileSize(FileHandle, nil);
  finally
    CloseHandle(FileHandle);
  end;
end;
Die Fileopen-Attribute entscheiden über das Gelingen der Datei, falls schon geöffnet:
fmOpenRead or fmShareDenyWrite sollte gehen, guck nochmal in die Hilfe zu den verschiedenen Attributen.

Grüßle,
Karl-Heinz

[edit=Luckie]Das nöächste mal setzt bitte die Delphi-Tags selber! Mfg, Luckie[/edit]

Luckie 9. Sep 2005 20:26

Re: Dateigröße ermitteln, während die Datei ausgeführt wird?
 
Und wenn du es doch mit AssignFile machen willst, setzte vorher den FileMode:
Zitat:

The FileMode variable determines the access mode to use when typed and untyped files (not text files) are opened using the Reset procedure.

The default FileMode is 2 (Read/Write access). Assigning another value to FileMode causes all subsequent Resets to use that mode.
Da standard mäßig eine Datei auch schreibend geöffnet wird, dürfte es eben bei exklusiv geöffneten Dateien nicht gehen. Desweiteren beachte man die Beschrämkung auf nicht Textdateien, deswegen ist die Methode von Karl-Heinz vorzuziehen.

Karl-Heinz 9. Sep 2005 21:02

Re: Dateigröße ermitteln, während die Datei ausgeführt wird?
 
Hallo nochmal,
ich bin etwas unsicher geworden :-) Ich nutze eine ähnliche Funktion selbst in einer Bibliothek immer wieder und habe nochmal nachgeguckt. Ich habe es damals nicht mit der Windows-Api gemacht, sondern mit TFileStream:

Delphi-Quellcode:
function FSize(fname: String): int64;
var
   t : tfilestream;
begin
   result := - 1;
     try
        t := tfilestream.create(fname,fmopenread or fmShareDenyNone);
       result := t.size;
       t.free;
     except
        exit;
     end;
end;
fmShareDenyNone ist wichtig.

Karl-Heinz Krönig

romber 9. Sep 2005 21:08

Re: Dateigröße ermitteln, während die Datei ausgeführt wird?
 
Danke! Habe FileMode gesetzt, klappt wieder :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:30 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