De fleste virksomheder har efterhånden bevist, at AI virker.
Pilotprojekter leverer resultater. Medarbejdere bruger generative AI-værktøjer. Nye use cases dukker op på tværs af organisationen.
if "størrelsen af alle filer i bibl" < "minmaxstørrelse" then begin copyfile(blah,"mappe"); //eller hvad du nu skal med mappen ? :) end;
størrelsen af alle filer i et bib. kan du finde ved hjælp at et api kald der giver dig størrelsen på 1 fil du specificerer, så kan du bare bruge det API kald på alle filerne i bibl. og lægge dem sammen. jeg kan ikke lige huske hvad det API kald hedder, men prøv at se om du selv kan finde det, jeg har desværre ikke lige Delphi ved hånden i øjeblikket :)
heh, håber du forstår den lidt kryptiske hentydning i if sætningen :)
type TForm1 = class(TForm) buGetSize: TButton; DriveComboBox1: TDriveComboBox; DirectoryListBox1: TDirectoryListBox; Label1: TLabel; procedure DriveComboBox1Change(Sender: TObject); procedure buGetSizeClick(Sender: TObject); private { Private declarations } Function DirSize(Directory : String) : LongInt; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.DriveComboBox1Change(Sender: TObject); begin DirectoryListBox1.Drive := DriveComboBox1.Drive; end;
function TForm1.DirSize(Directory: String): LongInt;
Function GetFileSize(FileName : String) : LongInt; Var F : File Of Byte; Begin Try AssignFile(F, FileName); Reset(F); Result := FileSize(F); CloseFile(F); Except // Indsæt exception handling her, fx. for allerede åben fil mv. End; End;
Var sr : TSearchRec; Temp : LongInt; // Result kan ikke benyttes - overskrives i GetFileSize. begin Temp := 0;
If FindFirst(Directory+'\*.*', faAnyFile, sr) = 0 then Begin If (Copy(sr.Name, 1, 1)<>'.') And (sr.Attr And faDirectory = 0) Then Temp := GetFileSize(sr.Name);
While FindNext(sr) = 0 Do Begin If (Copy(sr.Name, 1, 1)<>'.') And (sr.Attr And faDirectory = 0) Then Temp := Temp + GetFileSize(sr.Name) End; FindClose(sr); End; Result := Temp; End;
procedure TForm1.buGetSizeClick(Sender: TObject); Var Dir : String; DSize : Real; begin Dir := DirectoryListBox1.Directory; DSize := DirSize(Dir) / 1000000; Label1.Caption := 'Size of dir: ' + FloatToStrF(DSize, ffFixed, 15, 3) + ' MBytes'; end;
end.
Unit1.DFM som text:
object Form1: TForm1 Left = 283 Top = 107 Width = 268 Height = 329 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 8 Top = 232 Width = 88 Height = 13 Caption = 'No dir selected yet' end object buGetSize: TButton Left = 32 Top = 264 Width = 153 Height = 25 Caption = '&Get Dir size' TabOrder = 0 OnClick = buGetSizeClick end object DriveComboBox1: TDriveComboBox Left = 8 Top = 208 Width = 241 Height = 19 TabOrder = 1 OnChange = DriveComboBox1Change end object DirectoryListBox1: TDirectoryListBox Left = 8 Top = 8 Width = 241 Height = 193 ItemHeight = 16 TabOrder = 2 end end
Håber det kan bruges. Der er temmelig nemt at lave funktionen rekursiv: Der hvor der testes på om sr.Attr er et directory, kan du bare kalde funktionen rekursivt med sr.Name som parameter. Dvs: If (Sr.Attr and faDirectory > 0) Then Temp := Temp + DirSize(sr.Name) Else Temp := Temp + GetFileSize(sr.Name);
Hvordan mener du med, hvor stor den max må være? Det er fx. ikke umiddelbart muligt at begrænse pladsen, som et enkelt direktory fylder på en HD, hvis det ikke gøres af den rutine/det program, der gemmer dataene.
Dette kan fx. gøres mens data gemmes: (Psudokode)
Procedure StoreFile(Source : PathStr; Destination : DirStr); Begin If GetFileSize(Source) + DirSize(Destination) > MaxSize Then CreateException('Dir Size Error') Else MoveFile(Source, Destination); End;
Denne løsning kan bruges i et system, hvor filen først er gemt (uploadet) i et temp dir, for derefter at blive flyttet til permanent (bruger) dir. Er filen for stor, sendes fx. en advarsel/email/... til brugeren.
Man kan lave noget tilsvarende, hvis filen ikke først er uploadet, men genereres af et program
Function StoreData(DataRec : TSomeRecord) : Boolean; // Husk exception handling og Try-Finally block. Begin Result := True; OpenFile();
IF SizeOf(TSomeRecord) + DirSize() > MaxSize Then Begin CreateException(); Result := False; End Else Write(File, DataRec); CloseFile; End;
Men hvis brugerne har direkte adgang til directory'et, fx. med Exploreren, så skal der helt andre virkemidler til. Det bliver vel noget med at lave en driver der overvåger Windows File-Save/Write metoder..... DET ER IKKE NEMT!
NiP
Synes godt om
Ny brugerNybegynder
Din løsning...
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.