AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Dateigrössen
Thema durchsuchen
Ansicht
Themen-Optionen

Dateigrössen

Ein Thema von busybyte · begonnen am 21. Feb 2008 · letzter Beitrag vom 22. Feb 2008
Antwort Antwort
busybyte
Registriert seit: 15. Sep 2006
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
I love DiscCat
 
Muetze1
 
#2
  Alt 22. Feb 2008, 02:03
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?
  Mit Zitat antworten Zitat
Nuclear-Ping
 
#3
  Alt 22. Feb 2008, 06:41
Mir ist auch nicht klar, was die Funktion bringen soll.

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! ^^
  Mit Zitat antworten Zitat
busybyte
 
#4
  Alt 22. Feb 2008, 15:21
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:34 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