22. juni 2006 - 11:50Der er
8 kommentarer og 1 løsning
get filesize
Gad vidst - spekulerer på: er det muligt at et program checker filstørrelsen på en fil beliggende i samme dir som programmet og skiver filstøørelsen - evt checker ved en knap tryk på om filstørrelsen er blevet ændret. Måske lidt dårligt forklaret men ....
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Tænkte jeg nok :) men hvordan ? Kan huske fra Pascal- tiderne at man kunne udskruve dir og den slags, men hvis man nu leder efter en spec. fil fx den databasefil man arbejder med i programmet. Alternativt kan man måske 'trylle' det frem i en memo ?. Har gemt en lille programstump jeg fandt engang til filnavnelistning: unit listfilimemo;
type TForm1 = class(TForm) Edit1: TEdit; Memo1: TMemo; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var SR: TSearchRec; begin Memo1.Lines.Clear; if FindFirst(Edit1.Text + '\*.*', faAnyFile, SR) = 0 then while FindNext(SR) = 0 do begin if (SR.Name <> '.') and (SR.Name <> '..') then begin Memo1.Lines.Add(SR.Name); end;
Hjælpen omkr. seachrec giver ikke så meget - på mit niveau. TSearchRec defines file information searched for by FindFirst or FindNext.
Unit
Sysutils
type TSearchRec = record
Time: Integer; Size: Integer; Attr: Integer; Name: TFileName; ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData; end; Men det synes da som muligt som du antyder martinlind, men det er sikkert langtfra så let som man måske skulle tro. Vil gerne forhøje pointsene til 100.
Det her er lidt håbløst pt (mangler at genopfriske mine kundskaber om omdannelse af tal til tekststrene og osse hvordan man adderer strengene) men tankegangen må da være noget i retning af: procedure TForm1.Button1Click(Sender: TObject);
var SR: TSearchRec; streng:string; begin Memo1.Lines.Clear; if FindFirst(Edit1.Text + '\*.*', faAnyFile, SR) = 0 then while FindNext(SR) = 0 do begin if (SR.Name <> '.') and (SR.Name <> '..') then begin streng:=str(SR.size,streng); Memo1.Lines.Add(SR.Name)+(streng); end;
Er der ikke nogen der lige kan justere de dumme fejl - selvom det sikkert er upædagogisk :)
Proceduren findfirst skal vel køres separat mht SR.Size ? monstro Men problemet med at hente filnavnet ind kan let løses ved at placere filen i et sep bibl så det er faktisk 'bare' lige at kunne sjonglere lidt med de strenge der masngler.
Der er 3 oplagte fejl i begge løsninger. 1. Der er en leak, fordi FindClose ikke kaldes til sidst. 2. Der overspringes en fil (directory-entry) pga FindNext lige efter FindFirst. 3. Der er ingen fejlhåndtering. Det skal altid kodes efter følgende skabelon: if FindFirst(Edit1.Text + '\*.*', faAnyFile, SR) = 0 then try repeat { arbejd med SR her } if (SR.Name <> '.') and (SR.Name <> '..') then begin Memo1.Lines.Add(SR.Name + ' ' + IntToStr(SR.size)); end; until FindNext(SR) <> 0; finally FindClose(SR); end; Husket efter hukommelsen, så der tages forbehold for syntaksfejl.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.