AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateigröße ermitteln, wie geht Ihr vor?

Ein Thema von Fukiszo · begonnen am 25. Jan 2018 · letzter Beitrag vom 27. Jan 2018
Antwort Antwort
Fukiszo
(Gast)

n/a Beiträge
 
#1

Dateigröße ermitteln, wie geht Ihr vor?

  Alt 25. Jan 2018, 21:29
Hi, hier ein beispiel wie ich es mit Delphi mache

Delphi-Quellcode:
// return -1 if file not found else size in byte
function lwFileSize(sFileToExamine: string) : Longint;
var
  fFile : file of Byte;
begin
  Result := -1;
  if FileExists(sFileToExamine) then
  try
    FileMode := 0;
    AssignFile(fFile, sFileToExamine);
    Reset(fFile);
    Result := FileSize(fFile);
  finally
    Close(fFile);
  end;
end;
ist diese art und weise veraltet und überholt?

Grüße

ps: ich wusst nicht wohin deshalb ist es hier gelandet.
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Dateigröße ermitteln, wie geht Ihr vor?

  Alt 25. Jan 2018, 21:41
So ist es um einiges schneller

Delphi-Quellcode:
function lwFileSize(const aFileName: string): Int64;
var
 FileInfo: TWin32FileAttributeData;
begin
 Result := -1;

 FillChar(FileInfo, SizeOf(FileInfo), 0);
 if GetFileAttributesEx(PChar(aFileName), GetFileExInfoStandard, @FileInfo) then
  begin
   Int64Rec(Result).Hi := FileInfo.nFileSizeHigh;
   Int64Rec(Result).Lo := FileInfo.nFileSizeLow;
  end;
end;
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#3

AW: Dateigröße ermitteln, wie geht Ihr vor?

  Alt 25. Jan 2018, 23:06
danke für deinen vorschlag, ich versuche das was jetzt kommt in eine delphi ide vcl variante umzubauen,
das liest ein verzeichniss ein und gibt dateien in eine ListView mit icon und paar info's wieder.

Delphi-Quellcode:
procedure GetFiles(const hLV: HWND; Path, Mask: String);
var
  finddata : TWin32FindData;
  hFile : cardinal;
  Loop : dword;
  lvi : TLVItem;
  buf : array[0..25]of char;
  tile : TLVTileInfo;
  fi : TSHFileInfo;
  LVIMark : TLVInsertMark;
  tmp : String;
  i : integer;
begin
 hFile := FindFirstFile(PChar(IncludeTrailingPathDelimiter(Path) + Mask), finddata);
  if(hFile <> INVALID_HANDLE_VALUE) then begin
   LockWindowUpdate(hDlg);
   LastFolder := IncludeTrailingPathDelimiter(Path);
   Loop := 0;
    repeat
     if(finddata.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) then begin

      ZeroMemory(@fi, sizeof(TSHFileInfo));
      ListView_SetImageList(hLV,
       SHGetFileInfo(PChar(IncludeTrailingPathDelimiter(Path) + finddata.cFilename), 0,
       fi, sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_SMALLICON), LVSIL_SMALL);

      ZeroMemory(@fi, sizeof(TSHFileInfo));
      ListView_SetImageList(hLV,
       SHGetFileInfo(PChar(IncludeTrailingPathDelimiter(Path) + finddata.cFilename), 0,
       fi, sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_ICON), LVSIL_NORMAL);

      lvi.mask := LVIF_TEXT or LVIF_IMAGE;
      lvi.iItem := Loop;
      lvi.iSubItem := 0;
      lvi.pszText := finddata.cFileName;
     i := 0;
      lvi.iImage := fi.iIcon;
      ListView_InsertItem(hLV, lvi);

      tmp := IntToStr(finddata.nFileSizeLow)+' byte';
      if (finddata.nFileSizeLow / 1024) > 1 then tmp := FloatToStr((finddata.nFileSizeLow / 1024),-1,2)+' kb';
      if (finddata.nFileSizeLow / 1024 / 1024) > 1 then tmp := FloatToStr((finddata.nFileSizeLow / 1024 / 1024),-1,2)+' mb';
      if (finddata.nFileSizeLow / 1024 / 1024 / 1024) > 1 then tmp := FloatToStr((finddata.nFileSizeLow / 1024 / 1024 / 1024),-1,2)+' gb';
      lvi.mask := LVIF_TEXT;
      lvi.iSubItem := 1;
      lvi.pszText := pChar(tmp);
      ListView_SetItem(hLV, lvi);

      lvi.mask := LVIF_TEXT;
      lvi.iSubItem := 2;
      lvi.pszText := fi.szTypeName;
      ListView_SetItem(hLV, lvi);

// ZeroMemory(@buf, sizeof(buf));
// wvsprintf (buf, '%u byte', pchar(@finddata.nFileSizeLow));
      lvi.mask := LVIF_TEXT;
      lvi.iSubItem := 3;
      lvi.pszText := pChar(IntToStr(finddata.nFileSizeLow)); //buf;
      ListView_SetItem(hLV, lvi);

     if GetOSVersion = osXP then begin
      tile.cbSize := sizeof(TLVTileInfo);
      tile.iItem := Loop;
// tile.cColumns := length(colArray);
      tile.puColumns := @colArray[0];
      ListView_SetTileInfo(hLV, tile);
     end;
    LVIMark.cbSize := sizeof(TLVInsertMark);
    LVIMark.dwFlags := LVIM_AFTER;
    LVIMark.iItem := Loop;
    LVIMark.dwReserved := 0;
    ListView_SetInsertMark(hLV, LVIMark);
    if LowerCase(ExtractFileName(SelectedFile)) = LowerCase(finddata.cFileName) then
    begin
{    if LowerCase(ExtractFileName(SelectedFile)) = LowerCase(finddata.cFileName) then
      ListView_SetItemState(hLV, Loop, 0, LVIS_SELECTED);}

      lvi.stateMask := LVIS_SELECTED;
      lvi.state := LVIS_SELECTED;
      SendMessage(hLV, LVM_SETITEMSTATE, Loop, Longint(@lvi))
    end;
    Inc(Loop);
   end;
  until (not FindNextFile(hFile, finddata));
   FindClose(hFile);
  LockWindowUpdate(0);
 end;
end;
vielleicht kann man das auch "tunen" ?

Grüße
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Dateigröße ermitteln, wie geht Ihr vor?

  Alt 25. Jan 2018, 23:32
Hier würde ich ein VirtualStringTree verwenden.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.114 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Dateigröße ermitteln, wie geht Ihr vor?

  Alt 26. Jan 2018, 09:41
Ich mache es haargenau gleich wie LTE5

Delphi-Quellcode:
class function TFileHelper.GetSize(const fileName: String): Int64;
var
   info: TWin32FileAttributeData;
begin
   if not TFile.Exists(fileName) then
      raise EFileNotFoundException.CreateRes(@SFileNotFound);

   // Quelle: http://stackoverflow.com/a/1642355/2298252
   if not GetFileAttributesEx(
      PChar(fileName),
      WinApi.Windows.GetFileExInfoStandard,
      Addr(info)
   ) then RaiseLastOSError();

   Result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32);
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.202 Beiträge
 
Delphi 12 Athens
 
#6

AW: Dateigröße ermitteln, wie geht Ihr vor?

  Alt 26. Jan 2018, 09:58
Warum doppelt abfragen?
Delphi-Quellcode:
class function TFileHelper.GetSize(const fileName: String): Int64;
var
   info: TWin32FileAttributeData;
begin
   if not GetFileAttributesEx(PChar(fileName), GetFileExInfoStandard, @info) then
     RaiseLastOSError;
   Result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32);
end;
Wenn es aber unbedingt EFileNotFoundException sein soll, dann halt
Delphi-Quellcode:
class function TFileHelper.GetSize(const fileName: String): Int64;
var
   info: TWin32FileAttributeData;
begin
   if not GetFileAttributesEx(PChar(fileName), GetFileExInfoStandard, @info) then
     if GetLastError in [ERROR_FILE_NOT_FOUND, ERROR_PATH_NOT_FOUND] then
       raise EFileNotFoundException.CreateRes(@SFileNotFound)
     else
       RaiseLastOSError;
   Result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 03:11 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