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
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
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;
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
Dat snelle was maar toevallig. Bedankt ook voor jouw eigen antwoord. Zo heb ik er ook weer een manier bij geleerd.
Groeten
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.
Dit zou ik maar niet gebruiken. Ik heb gemerkt dat de waarde niet altijd accuraat is!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;
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óg vaker crashen en bestanden vernachelen dan het nu al doet.
1+1=b
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;
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
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
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
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
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
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:
aInternalName en aFileVersion worden uitgelezen...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;
Omer
Last edited by Marcel; 05-May-05 at 23:50.
- Code tussen tags gezet, zie Sourcecode op het forum plaatsen
Marcel
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks