Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Dateigrössen (https://www.delphipraxis.net/108960-dateigroessen.html)

busybyte 21. Feb 2008 23:29


Dateigrössen
 
Ich habe es satt gehabt immer die unterschiedlichen Dateigrössen vom Windos-Explorer
und den üblichen Methoden zu erhalten und deswegen mal angefangen, das ganze
in eine Function zu packen.
Ihr könnt damit machen, was Ihr wollt, wäre schön wenn Ihr auch was anbieten könntet.

Delphi-Quellcode:
unit MyToolsU;
//V 1.1
//by BusyByte

interface
Type TFSRes=Record
i64Res_:int64;
iRes_:integer;
dRes_:Double;
SRes_1:String;
SRes_2:String;
end;

function MyGetFileSize(const FileName: String): TFSRes;


implementation
Uses Windows,SysUtils;

function MyGetFileSize(const FileName: String): TFSRes;
var FileHandle: Cardinal; var Data: WIN32_FIND_DATA;
Tmp:String;
L1:integer;
begin
 
  Result.iRes_ := -1; Result.i64Res_:=-1; Result.dRes:=-1;
  Result.SRes_1:=''; Result.SRes_2:='';
 
  FileHandle := FindFirstFile(PChar(FileName), Data);
  try
    if FileHandle > 0 then
   with Result do
    begin
    iRes_:=(Data.nFileSizeLow + 1023) div 1024;

   //Werde die Stringumwandlungen später noch in eine Function auslagern=Speedmode
    dRes_:=iRes_;
    Tmp:=Format('%n', [dRes_]);
    L1:=Length(Tmp);
    Delete(Tmp,L1-2,L1);
    SRes_1:=Tmp+' KB';


    Int64Rec(Result.i64Res_).Hi := Data.nFileSizeHigh;
    Int64Rec(Result.i64Res_).Lo := Data.nFileSizeLow;

    dRes_:=Result.i64Res_;
    Tmp:=Format('%n', [dRes_]);
    L1:=Length(Tmp);
    Delete(Tmp,L1-2,L1);
    SRes_2:=Tmp+' Bytes';

    end;
  finally Windows.FindClose(FileHandle);
  end;
end;

end.
//EDIT
dRes wird eigentlich nur für die Umsetzung mit Format() benötigt und könnte auch temporär gehalten werden.
Aufruf z.B. mit

Delphi-Quellcode:
Uses MyToolsU;
.
.
.
with MyGetfileSize(Filename_) do
Label1.Caption:=SRes_1+'(' +SRes_2+')';
22.02.2008 1.30Uhr : Neue Version V1.1 eingestellt

Muetze1 22. Feb 2008 02:03

Re: Dateigrössen
 
1. Ein Result als Rückgabewert ist meistens nicht gut, weil in den seltensten Fällen nutzt der Aufrufer eine Variable vom selben Typ zur Zuweisung. Statt dessen wird die Funktion meist häufiger aufgerufen um dann immer nur einen Teil des Rückgabewertes zu nutzen.
2. Man erkennt nicht von aussen auf Anhieb, ob die angegeben Daten im Record valide sind. Statt dessen muss man auf -1 oder Leerstring testen. Warum nicht einfach einen boolschen Rückgabewert? Dann kann ich direkt eine If Anweisung schreiben mit dem Aufruf und habe somit immer gültige Ergebnisse.
3. Dokumentiere die Angaben welche in dem Record zurück gegeben werden. Die Bezeichner sind so gut wie gar nicht aussagekräftig. Wenn dies (wie hier) schon der Fall ist, dann wenigstens jeden kommentieren.
4. Ich habe trotz deiner (recht kurzen) Beschreibung noch nicht kapiert, was mir diese Funktion bringen sollte. Was für unterschiedliche Angaben und was soll dein Code nun erreichen? Das der Explorer kürzt bzw. z.T. ungenau ist, ist bekannt. Aber bildet dein Code nun die Fehler des Explorers nach?

Nuclear-Ping 22. Feb 2008 06:41

Re: Dateigrössen
 
Mir ist auch nicht klar, was die Funktion bringen soll. :mrgreen:

Ganz egal, welche Funktion du benutzt, um eine Dateigröße zu bekommen: Mir ist es noch nie passiert, dass zwei unterschiedliche Funktionen für die gleiche Datei zwei unterschiedliche Größen geliefert hätten. Also für programminterne Zwecke bekommst du von Windows afaik IMMER die richtige Dateigröße.

Und im Explorer interessierts ja keinen, ob die Datei nun "3,2MB" oder "3072 KBytes" groß ist. Zumal: Total Commander ftw! ^^

busybyte 22. Feb 2008 15:21

Re: Dateigrössen
 
Na ja für mich ist es schon interessant,da ich manchmal Dateien anhand der Explorer-Dateigrösse in meiner Liste wiederfinden
will,aber auch manchmal die "echte" Grösse benötige um z.B. Streams auszulesen,oder ich verwende eine Listview-Demo Variante
und daneben eben ein Listview ohne ShellItem-Objekt und es sieht schon bescheuert aus, wenn in jeder Liste eine andere Grösse,
der selben Datei steht.

-Jetzt hab ich endlich mal die Listview-Demo zerpflückt und mit einem Code für Dateien >4G
kombiniert (Autoren sind unbekannt,falls jemand evtl. ein Bruchstück seines Codes wiederkennen sollte,bitte melden,dann werde ich sie oder ihn natürlich
erwähnen.

-Wer's brauchen kann gut ,wer nicht, eben nicht, kein Problem.
Von irgendwelchen Fehlern, die nachgebildet werden, kann hier keine Rede sein, da die Borland Listview die selbe Berechnung
für das Ergebniss, wie ich für iRes, verwendet,wobei mir der Unterschied auch nicht klar ist und eigentlich auch wurscht.
i64Res enthält die genaue Grösse die z.B. für das Auslesen der Datei verwendet werden kann.

-Wer die Funktion nicht anwenden kann,braucht sie auch nicht wirklich,die Anderen dürfen gerne Verbesserungen und Modifikationen
vornehmen.Für mich war die Umsetzung mit 1000er Trennzeichen in Strings sehr wichtig.Listviews eben.

Ein Boolean-Result kann sich jeder selbst hinzufügen,da eh kein Interesse besteht.
Ich werde deswegen wohl auch keine weiteren Open-Source-Modifikationen vornehmen.

Sehr gut z.B. für Audioplayer-Frontends geeignet.

//Edit
Die Borland-Listview Demo verwendet allerdings noch
folgende Zeile im Anschluss
Delphi-Quellcode:
 
if iRes<1 then iRes:=1


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