Page 1 of 2 1 2 LastLast
Results 1 to 15 of 17

Thread: Bestandsgrootte uit een bestand lezen

  1. #1
    Senior Member McTinus's Avatar
    Join Date
    May 2001
    Location
    Hoek van Holland
    Posts
    389

    Bestandsgrootte uit een bestand lezen

    Hoi,
    het is waarschijnlijk heel simpel, maar ik krijg het nog niet voor elkaar. Ik wil eigenlijk alleen de grootte (in kb's of mb's of bytes, maakt eigenlijk niet uit) van een bestand weten vanuit delphi.
    Iemand een idee?

    Groeten

    Tinus

  2. #2
    De Volgende Code komt uit een van mijn progjes. Ik denk dat je hiermee wel verder komt.

    procedure fileinfo(const filename:string;var filedate,filesz:string);
    var
    i:integer;
    f: file of Byte;
    begin
    {determine fileproperties, size, date}
    if fileexists(filename) then
    begin
    assignfile(f,filename);
    reset(f);
    i:=FileOpen(filename, fmOpenread or fmShareDenyNone);
    i:=filegetdate(i);
    filedate:=formatdatetime('dd-mm-yyyy', filedatetodatetime(i));
    filesz:=inttostr(filesize(f))+' bytes';
    closefile(f);
    end;
    end;

  3. #3
    Senior Member McTinus's Avatar
    Join Date
    May 2001
    Location
    Hoek van Holland
    Posts
    389
    Bedankt Maarten voor je (snelle!) reactie,
    dit had ik net zelf gevonden:
    Code:
    var
       SearchRec: TSearchRec;
    
    begin
       if opendialog1.execute then
       begin
          FindFirst(opendialog1.filename, faAnyFile, SearchRec);
          Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + ' bytes     in size';
          FindClose(SearchRec);
       end;
    end;
    Last edited by Dees; 05-May-05 at 15:38. Reason: code tags

  4. #4
    Dat snelle was maar toevallig. Bedankt ook voor jouw eigen antwoord. Zo heb ik er ook weer een manier bij geleerd.

    Groeten

  5. #5
    Yay: Student(je) af
    Join Date
    Jun 2003
    Location
    Harderwijk
    Posts
    2,621
    Ik zocht naar dezelfde oplossing, maar heb inmiddels iets anders gefabriceerd. Handig als je toch het bestand moet openen, dus voeg ik hem maar toe aan het lijstje met oplossingen...

    Code:
      f := TFileStream.Create(Filenames[i], fmOpenRead);
     // totalSize heb ik maar een Int64 gemaakt, werkt dan ook als de
     // bestanden wat groter worden
      totalSize := totalSize + (f.Size);
      f.Free;
    
      if (totalSize > 1048576) then // 1 mB = 1024 * 1024 bytes
        AttachmentSize.Caption := IntToStr(Round(totalSize / 1048576)) + ' MB';
      if (totalSize < 1048576) then // 1 kB = 1024 bytes
        AttachmentSize.Caption := IntToStr(Round(totalSize / 1024)) + ' kB';
      if (totalSize < 1024) then // b
        AttachmentSize.Caption := IntToStr(totalSize) + ' b';
    My software never contains bugs. Perhaps just undocumented features.

  6. #6
    Originally posted by CompuChip
    Ik zocht naar dezelfde oplossing, maar heb inmiddels iets anders gefabriceerd. Handig als je toch het bestand moet openen, dus voeg ik hem maar toe aan het lijstje met oplossingen...

    Code:
      f := TFileStream.Create(Filenames[i], fmOpenRead);
      totalSize := totalSize + (f.Size);
      f.Free;
    Dit zou ik maar niet gebruiken. Ik heb gemerkt dat de waarde niet altijd accuraat is!

  7. #7
    Waarom zou dit onnauwkeurig zijn? Ik heb daar nog nooit iets van gemerkt.
    Uiteindelijk wordt het opvragen van de size overgelaten aan de SetFilePointer API die de filepointer van de geopende file achteraan neerzet en de positie van de pointer teruggeeft. Ik mag toch aannemen dat dit wel redelijk nauwkeurig is, anders zou Windows wel n&oacute;g vaker crashen en bestanden vernachelen dan het nu al doet.
    1+1=b

  8. #8
    Senior Member
    Join Date
    May 2002
    Location
    Almere-Stad
    Posts
    150
    Ik heb het laatst nog op de win32 manier opgelost (aangezien me programma zo klein mogelijk moest zijn en dus geen gebruik maakte van de standaard delphi stuff)
    Code:
    function GetSize(const Filename: string): integer;
    var
      TestFile: HWND;
    begin
      TestFile := CreateFile(Pchar(Filename),
                             GENERIC_READ,
                             FILE_SHARE_READ,
                             nil,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL,
                             0);
      if TestFile = 0 then
      begin
        result := 0;   // Als die hier komt, kan die het bestand niet openen
        exit;
      end;
      result := GetFileSize(TestFile, 0);
      CloseHandle(TestFile);
    end;

  9. #9
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    En je kan natuurlijk ook SysUtils.FindFirst gebruiken (of Windows.FindFirstFile als je zelfs SysUtils niet wilt gebruiken )... dan hoef je 't bestand niet eens te openen, en in plaats van de gebruikelijke manier van wildcards meegeven geef je gewoon de bestandsnaam ,mee... dan vindt ie dus 1 bestand, en kan je daar de info mooi van gebruiken...
    Qui custodiet ipsos custodes

  10. #10

    Informatie zonder laden

    Hallo

    Kan ik ook zonder het gebruik van filestream informatie
    inwinnen.

    Ik heb bv c:\program file\Borland\Delphi 7\Delphi32.exe
    Als ik erop klik (met bv virtual shelltreeviewex)
    dan moet ik als informatie

    Delphi 7
    aangemaakt: 1 7 2005
    laatste gewijzigd 1 7 2005

    Bedankt

  11. #11
    Jazeker. De FindFirstFile functie. FileExists maakt ook gebruik van deze functie, kijk maar eens in de VCL:
    Code:
    var
      Handle: THandle;
      FindData: TWin32FindData;
    ..
      Handle := FindFirstFile(PChar(FileName), FindData);
      if Handle <> INVALID_HANDLE_VALUE then
        // FindData is een record met heel veel data
      else
        // File niet gevonden.
    
    1+1=b

  12. #12

    Bedankt, een kleinigheidje nog

    Hallo

    Bedankt.

    Je hebt mij al goed geholpen.

    Alleen (en ik denk dat ik deze informatie uit de Registry moet
    halen, maar waar)

    Uitgaande van
    k:\borlsand\delphi 7\delphi32.exe
    wil ik de informatie
    Delphi 7
    (wat ik nu krijg is de filename delphi32.exe)

    Heb de hele morgen al de Registry 'door zitten te bladeren'...

    Kun je mij ook hierbij helpen?

    Bedankt

  13. #13
    Nee, dat is de naam van de applicatie, maar deze is min of meer vastgelegd in de exe-file. Deze kan op diverse manieren worden ingesteld en kan zelfs tijdens het runnen van de applicatie nog wijzigen. Deze informatie is dus niet zomaar te achterhalen, zeker wanneer de applicatie niet actief is.
    1+1=b

  14. #14

    ...toch wel (nou: deels)

    Hallo,

    Met EXE-files geinstalleerd door Windows zelf (tijdens de installatie
    van Windows zelf) lukt dat wel!

    Boke Notepad.exe bv krijg ik Kladblok (ik heb de Nederlandse
    versie van Windows 98SE. Moet het geheel nog met XP (nl)
    uitproberen.Met andere files gaat het inderdaad niet

    Toch nog en wederom Bedankt voor je hulp.

    Hier is de Code:

    Code:
    function GetFileInfo( var aInternalName, aFileVersion: String; FileName: AnsiString ): Boolean;
    var
      VersionInfoSize, VerInfoSize, GetInfoSizeJunk: DWORD;
      VersionInfo, Translation, InfoPointer: Pointer;
      VersionValue: AnsiString;
    begin
      Result := False;
      VerInfoSize := GetFileVersionInfoSize(PChar(FileName), GetInfoSizeJunk);
      if VerInfoSize > 0 then
      begin
        GetMem(VersionInfo, VerInfoSize);
        try
          GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, VersionInfo);
          VerQueryValue(
            VersionInfo, '\\VarFileInfo\\Translation', Translation, VerInfoSize );
          VersionValue :=
            '\\StringFileInfo\\' + IntToHex(LoWord(LongInt(Translation^)), 4) +
            IntToHex(HiWord(LongInt(Translation^)), 4) + '\\';
          VersionInfoSize := 0;
          VerQueryValue(
            VersionInfo, PChar(VersionValue + 'InternalName'), InfoPointer,
            VersionInfoSize );
         aInternalName := AnsiString(PChar(InfoPointer));
    
          aInternalName := AnsiString(PChar(InfoPointer));
          VerQueryValue(
            VersionInfo, PChar(VersionValue + 'FileVersion'), InfoPointer, VersionInfoSize );
          aFileVersion := AnsiString(PChar(InfoPointer));
    
        finally
          FreeMem(VersionInfo);
        end;
        aInternalName := Trim(aInternalName);
        aFileVersion := Trim(aFileVersion);
        Result := (aInternalName <> '') and (aFileVersion <> '');
      end;
    end;
    aInternalName en aFileVersion worden uitgelezen...

    Omer
    Last edited by Marcel; 05-May-05 at 23:50.

  15. #15
    Marcel

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •