Avatar billede lojmann Nybegynder
19. november 1999 - 18:24 Der er 18 kommentarer og
1 løsning

MAX størrelse på en mappe???

Hejsa...

Er der nogle som har en kode, som bestemmer hvor mange megabyte som bestemte mapper må fylde!

Håber i kan hjælpe...,-)

--
Thomas L. Jørgensen.
lojmann@lojmann.dk
www.lojmann.dk
Avatar billede dj Nybegynder
19. november 1999 - 19:06 #1
kan du ikke bare lave noget lign.

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 :)

Mvh. _DJ_
Avatar billede lojmann Nybegynder
20. november 1999 - 10:39 #2
Jeg er med på hvad du mener, og det kan man da sagtens gøre - det er bare lige koden...;-)

Hvis der er nogle som lige har den, må de meget gerne poste den her...;-)
Avatar billede dj Nybegynder
20. november 1999 - 15:33 #3
Kan du ikke bare selv lave den ??

Nu har jeg da vist dig vejen, så kan det vel ikke være så svært at udføre det...

Du skal ihvertifald op på mere end 15 point for at jeg gidder og sætte mig ned og lave koden til dig!
Avatar billede lojmann Nybegynder
20. november 1999 - 16:05 #4
Ja ja, det er da bare i orden, du kan få 60 point mere, HVIS koden i koden selv bestemmer hvilke mappe det er, som der må have en MAX størrelse!

Når diret er på 200Mb, så skal den skrive "ryd op i din mappe!!!"

Det gølder selvfølgelig også andre som vil lave en kode....;-)
Avatar billede lojmann Nybegynder
20. november 1999 - 16:07 #5
Æh..

der var vidst lige et par "typoer", så om igen...

Ja ja, det er da bare i orden, du kan få 60 point mere, HVIS man i koden selv bestemmer hvilke mappe det er som man vil give en MAX størrelse!

Når diret er på 200Mb, så skal den skrive "ryd op i din mappe!!!"

Det gælder selvfølgelig også andre som vil lave en kode....;-)
Avatar billede delphi Nybegynder
22. november 1999 - 09:41 #6
Kan du bruge det her? 
Det er et lille eksempel som jeg har lige kogte sammen.

Kode til Unit1:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, FileCtrl;

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);

NiP/Delphi

Avatar billede delphi Nybegynder
25. november 1999 - 10:03 #7
Halloooo.....

NiP/Delphi
Avatar billede lojmann Nybegynder
25. november 1999 - 17:11 #8
Sorry, jeg har ikke haft så meget tid til at se på det, men jeg har ikke glemt dig...,-)

Ser på det i weekenden, regner jeg med...,-)
Avatar billede lojmann Nybegynder
30. november 1999 - 19:08 #9
Så fik jeg tid til at se på det, men jeg kan ikke lige umidlbart få det til at virke!!!

Kan du ikke sende hele sourcen til mig???

--
Thomas.
Avatar billede delphi Nybegynder
01. december 1999 - 09:06 #10
Jo da, hvis jeg stadig har den.

Hvem er du (email please).

NiP
Avatar billede delphi Nybegynder
08. december 1999 - 14:06 #11
Hallo....

NiP/Delphi
Avatar billede lojmann Nybegynder
12. december 1999 - 14:11 #12
DOH!!!

Jeg har ikke lige været så vågen her på det sidste, min mail adr. er lojmann@lojmann.dk
Avatar billede snorga Nybegynder
15. december 1999 - 10:32 #13
Der er NiP/Delphi vist heller ikke.. Din email står oppe i spørgsmålet :)
Avatar billede delphi Nybegynder
15. december 1999 - 12:45 #14
Mere DOH!

Jeg kigger på sagen - Jeg håber jeg får tid idag...

NiP
Avatar billede delphi Nybegynder
15. december 1999 - 12:56 #15
Filen er afsendt - Jeg saksede bare her fra siden og det virkede fint.

NiP
Avatar billede lojmann Nybegynder
16. december 1999 - 16:36 #16
Hm... Jeg har set på det men jeg kan ikke bruge det til noget, men det virker som det sikkert skal, så du kan da bare få de 15 point...

Måske finder jeg ud af at bruge det til noget andet...,-)
Avatar billede delphi Nybegynder
16. december 1999 - 16:46 #17
Hmm - du sagde da 75 point...
15 point og sener 60 point mere!

NiP
Avatar billede lojmann Nybegynder
16. december 1999 - 16:52 #18
Joo, det er korrekt, MEN det var hvis jeg fik koden til et program, som kunne bestemme hvor stort en mappe MAX måtte blive....,-)

Du lavede jo "bare" noget som kunne vise størrelsen...
Men den anden kode er nu 100 point værd...,-)
Avatar billede delphi Nybegynder
17. december 1999 - 07:44 #19
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester