Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi FileSize nicht für Textdateien? (https://www.delphipraxis.net/58452-filesize-nicht-fuer-textdateien.html)

JPSelter 7. Dez 2005 10:07


FileSize nicht für Textdateien?
 
Wieso sind Textdateien ausgeschlossen? Hat das einen logischen Grund? Wie bekomme ich alternativ die Grösse einer Textdatei?

RavenIV 7. Dez 2005 10:24

Re: FileSize nicht für Textdateien?
 
keine Ahnung.
aber warum benutzt du nicht
Delphi-Quellcode:
FileUtil.GetFileSize

JPSelter 7. Dez 2005 10:34

Re: FileSize nicht für Textdateien?
 
Weils das anscheinend nicht mit Delphi5 gibt :D

Luckie 7. Dez 2005 10:45

Re: FileSize nicht für Textdateien?
 
Delphi-Quellcode:
function GetFileSize(szFile: PChar): Int64;
var
  fFile                 : THandle;
  wfd                   : TWIN32FINDDATA;
begin
  result := 0;
  if not FileExists(szFile) then exit;
  fFile := FindFirstfile(pchar(szFile), wfd);
  if fFile = INVALID_HANDLE_VALUE then exit;
  result := (wfd.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;

RavenIV 7. Dez 2005 10:48

Re: FileSize nicht für Textdateien?
 
aber die WinAPI-Funktionen kannst du doch verwenden.
schau mal in der MSDN oder online-MSDN nach...

/edit: siehe vorhergenden Beitrag, ich war zu langsam.

Peter Wolf 7. Dez 2005 10:50

Re: FileSize nicht für Textdateien?
 
Hallo,

so sollte es gehen:

Delphi-Quellcode:
function GetSize(Datei: AnsiString): Integer;
var
  F : TFileStream;
  Size : integer;
begin
  result:= 0;
  try
    F := TFileStream.Create(Datei, fmOpenRead or fmShareDenyWrite);
  except
    Exit;
  end;
  result := F.Size;
  F.Free;
end;
Grüße Peter

dataspider 7. Dez 2005 11:03

Re: FileSize nicht für Textdateien?
 
Es sollte auch ohne den Umweg über den STream gehen:
Delphi-Quellcode:
function GetFileSize(const FileName: string): DWord;
var
  fd: TWIN32FindData;
begin
  if Windows.FindClose(Windows.FindFirstFile(PChar(FileName), fd)) then
    Result := fd.nFileSizeLow
  else
    Result := 0;
end;
Frank

JPSelter 7. Dez 2005 11:04

Re: FileSize nicht für Textdateien?
 
Perfekt, dat lüppt, besten Dank!

Muetze1 7. Dez 2005 11:04

Re: FileSize nicht für Textdateien?
 
Zitat:

Zitat von JPSelter
Wieso sind Textdateien ausgeschlossen? Hat das einen logischen Grund? Wie bekomme ich alternativ die Grösse einer Textdatei?

Warum kann ich dir sagen: FileSize() der alten Dateiroutinen gibt als Grösse immer einen Wert an, der den Typ der Datei beachtet und immer die Anzahl der Elemente zurück gibt. Wenn du nun z.B. einen Record hast und einen Dateityp vom Typ des Records (File Of TRecord), dann gibt dir FileSize() an, wieviele Records in der Datei sind - also die Grösse der Datei in Bytes geteilt durch die Grösse des Records (SizeOf(TRecord)). Ist bei File Of Word und anderen Typen nicht anders und bei den Textdateien müsste er dir somit die Anzahl der Textzeilen zurück geben, aber das kann er nicht. Dafür müsste er die gesamte Textdatei scannen und die Zeilenumbrüche verarbeiten und auswerten. Auch hätten die Borländer schlecht bei einer Textdatei die Grösse in Bytes zurückgeben können, weil es zum einen dem Verhalten bei den anderen Dateitypen widerspricht und zum anderen hilft dir eine Byte Angabe nichts, wenn du abzählen willst wann denn EOF() ist, da schliesslich ein LF mal nur auf einem LF oder auch aus einem CR+LF bestehen kann und die Routinen ReadLn() automatisch beide Typen beachten aber dir keine Chance bieten herauszubekommen, wieviel Bytes denn nun für das Zeilenende "draufgingen".

Ähnliches gilt daher auch für FilePos() bei Textdateien.

JPSelter 7. Dez 2005 11:20

Re: FileSize nicht für Textdateien?
 
Danke für die ausführliche Antwort. Wo wir schon bei eof sind, da kommt mein nächstes Problem. Ich bekomme eine Exception, wenn ich eof(meinetextdatei) aufrufe (ich will die letzten 1000 Zeilen einer Backup-Textdatei sichern, die backup-Datei löschen wenn sie zu gross geworden ist und diese Zeilen wieder einfügen)

Code:
    AssignFile(t, datei);
    Reset(t);
    while not eof(t) do
    begin
      readln(t, temp);
      tempstr.add(temp);
    end;
    CloseFile(t);


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 Uhr.
Seite 1 von 2  1 2      

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