[Delphi] Kopieeren van een directory met content.

Pagina: 1
Acties:

  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Ik heb dus de directorystructuur op CD:
Document
\_Doc1.txt
\_Doc2.txt
\_Doc3.txt
\_Doc4.txt

En nu is het de bedoeling dat deze naar hardeschijf worden gezet op locatie [xxxxx]. Hoe kan ik dat doen? Heb gezocht maar verder dan directory aanmaken kom ik niet...

=( Protected by witchcraft )=


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:04

Creepy

Tactical Espionage Splatterer

met copyfile() kan je files kopieren. En m.b.v. findfirst() en findnext() kan je alle files in een dir doorlopen, en die files m.b.v. copyfile() kopieren.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Op dinsdag 18 december 2001 13:00 schreef Creepy het volgende:
met copyfile() kan je files kopieren. En m.b.v. findfirst() en findnext() kan je alle files in een dir doorlopen, en die files m.b.v. copyfile() kopieren.
Op zich heel leuk maar als het nou het principe wordt van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Basedir
\_ 10 files
\_ Subdir 1
   \_ 100 files
   \_ Subdir 1.1   
    \_ 20 files
   \_ Subdir 1.2
    \_ 30 files
\_ Subdir 2
   \_ 100 files
   \_ Subdir 2.1   
    \_ 20 files
   \_ Subdir 2.2
    \_ 30 files

Oftwel een base directory met een aantal subdirectories, waar ook weer subdirectories inzitten enz...

=( Protected by witchcraft )=


  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Niemand kan mij helpen :'( :?

=( Protected by witchcraft )=


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Dat werd net al verteld: copyfile, findfirst en findnext.

En dat gaat dan ongeveer zo (maar werkt gegarandeerd niet) >:):
code:
1
2
3
4
5
6
7
8
9
10
procedure copydir(baselocation)
Findfirst (baselocation)
while er zijn nog files do
   findnext;
   if gevondenfile=directory then 
    copydir(gevondenfile)
   else
    copyfile(gevondenfile)
   end;
end;

Recursie heet dat :P

Als ik zometeen thuis ben kan ik je eventueel de complete code geven voor dit, omdat ik wel eens filemanager heb geprogd. ICQ maar even als je 't graag wilt hebben.

Siditamentis astuentis pactum.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:04

Creepy

Tactical Espionage Splatterer

Ik zou je ook complete code kunnen geven.. maar dat is niet leuk :)

Het moet inderdaad met recursie.

Maak een functie die alle bestanden uit 1 dir naar een andere dir kopieert, met als parameters, de originele dir, en de dir waar het naar toe moet.

Als die werkt, breidt je functie dan uit dat als ie een dir i.p.v. een bestand tegenkomt, zichzelf aanroept met de net gevonden dir als ene parameter en de bestemmingsdir+net gevonden dir als de andere en klaar!

Hmm.. het kan ook met behulp van een aantal loops in elkaar zonder recursie. Heb daar geen voorbeeldcode van liggen. Ik gebruik liever recursie voor dit soort dingen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Op dinsdag 18 december 2001 15:30 schreef Varienaja het volgende:
Dat werd net al verteld: copyfile, findfirst en findnext.

En dat gaat dan ongeveer zo (maar werkt gegarandeerd niet) >:):
code:
1
2
3
4
5
6
7
8
9
10
procedure copydir(baselocation)
Findfirst (baselocation)
while er zijn nog files do
   findnext;
   if gevondenfile=directory then 
    copydir(gevondenfile)
   else
    copyfile(gevondenfile)
   end;
end;

Recursie heet dat :P

Als ik zometeen thuis ben kan ik je eventueel de complete code geven voor dit, omdat ik wel eens filemanager heb geprogd. ICQ maar even als je 't graag wilt hebben.
Als je wilt mag je wel even mailen naar dryw.filtiarn@wanadoo.nl kheb op dit moment geen ICQ :(

=( Protected by witchcraft )=


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Op dinsdag 18 december 2001 15:34 schreef Dryw.Filtiarn het volgende:
Als je wilt mag je wel even mailen naar dryw.filtiarn@wanadoo.nl kheb op dit moment geen ICQ :(
Natuurlijk mail ik je dat niet, ik post het hier, dan heeft iemand anders er ook nog wat aan.

Deze code is van 2 februari 1999, toen ik nog NT4.0 draaide. Ik post gewoon de hele unit, waarin de thread zit voor 't kopieren. Ik weet zelf al niet exact meer hoe alles in elkaar zat. Veel plezier ermee >:) ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
unit ThreadSpul;

interface

uses
  StdCtrls, Classes, Forms, Gauges, Graphics, SysUtils, Windows, Settings, DKInclude;

const
   BufSize=65536;
type
  TAction = (Move, Copy, Delete);

  ActionThread = class(TThread)
  private
    NotQuit,VerderGaanOK:boolean;
    ToDo:TAction;
    Source,Dest:string;
    StartTime:TDateTime;
    FilesLeftString:string;

    Files:TStrings;
    Form:TForm;
    Current,Overall:TGauge;
    SRCFile,DSTFile,SRCSize,BPS,OverallInfo,FilesLeft,TimeLeft:TLabel;
    StopButton:TButton;
    Box:TGroupBox;

    procedure ErrorMessage(Bericht,Error:string);
    procedure StopClick(Sender: TObject);
    function GetSize(FS:string):integer;
    function GetName(FS:string):string;
    procedure CopyFile(i:integer);
    procedure DeleteFile(i:integer);
    procedure MoveFile(i:integer);
    procedure ShowProgress;
  protected
    procedure Execute; override;
  public
    constructor Create(Bron,Doel:string; List:TStrings; Action:TAction; TermProc:TNotifyEvent);
  end;

implementation

constructor ActionThread.Create(Bron,Doel:string; List:TStrings; Action:TAction; TermProc:TNotifyEvent);
var i:integer;
    Size:integer;
begin
  Priority:=tpLowest;
  OnTerminate:=TermProc;
  VerderGaanOK:=False;
  Source:=Bron; Dest:=Doel; ToDo:=Action;

  inherited Create(True);
  Self.FreeOnTerminate:=True;
  Form:=TForm.CreateNew(Application);
  Files:=TStringList.Create;
  Box:=TGroupBox.Create(Form);  Box.Parent:=Form;
  StopButton:=TButton.Create(Form); StopButton.Parent:=Form;
  SRCFile:=TLabel.Create(Box);  SRCFile.Parent:=Box;
  SRCSize:=TLabel.Create(Box);  SRCSize.Parent:=Box;
  DSTFile:=TLabel.Create(Box);  DSTFile.Parent:=Box;
  BPS:=TLabel.Create(Box);      BPS.Parent:=Box;
  OverallInfo:=TLabel.Create(Box);  OverallInfo.Parent:=Box;
  Current:=TGauge.Create(Box);  Current.Parent:=Box;
  Overall:=TGauge.Create(Box);  Overall.Parent:=Box;
  TimeLeft:=TLabel.Create(Box);     TimeLeft.Parent:=Box;
  FilesLeft:=TLabel.Create(Box);    FilesLeft.Parent:=Box;

  with Form do begin
     case ToDo of
      Copy   : Caption:=sCopyingB;
      Delete : Caption:=sDeletingB;
      Move   : Caption:=sMovingB;
     end;
     BorderStyle:=bsDialog; Position:=poScreenCenter;
     Width:=380; Height:=205;
     BorderIcons:=[];
  end;

  with Box do begin
     Caption:=sProgressB;
     Top:=0; Left:=8; Width:=356; Height:=139;
  end;

  with StopButton do begin
     Caption:='&Stop'; Width:=74; Left:=153; Top:=146; OnClick:=StopClick;
  end;

  with SRCFile do begin
     Left:=8; Top:=24;
  end;

  with DSTFile do begin
     Top:=24; Alignment:=taRightJustify; Width:=0;
  end;

  with SRCSize do begin
    Top:=40; Left:=8;
  end;

  with OverallInfo do begin
     Left:=8; Top:=80; Caption:=sOverallProgress;
  end;

  with Current do begin
     ForeColor:=clNavy; Left:=8; Height:=18; Width:=340; Top:=56;
  end;

  with Overall do begin
     ForeColor:=clNavy; Left:=8; Height:=18; Width:=340; Top:=96;
  end;

  with FilesLeft do begin
     Left:=8; Top:=120;
  end;

  with TimeLeft do begin
     Top:=120; Alignment:=taRightJustify; Width:=0;
  end;

  with BPS do begin
     Top:=80; Alignment:=taRightJustify; Width:=0;
  end;

  //kopieer spul uit List naar Files
  Overall.MaxValue:=0;
  for i:=List.Count-1 Downto 0 do begin
     Files.Add(List.Strings[i]);
     Size:=GetSize(List.Strings[i]);
     if Size<>DirRecognize then begin
      if ToDo=Delete then
         Overall.MaxValue:=Overall.MaxValue+1
      else
         Overall.MaxValue:=Overall.MaxValue+Size;
     end;
  end;

  Form.Show;
  Resume;
end;

procedure ActionThread.Execute;
var i:integer;
    FileName:string;
    Attr:integer;
begin
  { Place thread code here }
{  while not VerderGaanOK do begin
     Sleep(50);
  end;}
  StartTime:=Time;

  NotQuit:=True;
  i:=Files.Count;
  while (NotQuit) and (i>0) do begin
     //doe Source+Files.Items[i] actie >> Dest
     Current.Progress:=0;
     Current.MaxValue:=GetSize(Files.Strings[i-1]);
     case ToDo of
      Copy   : begin
              if i>1 then
                 FilesLeftString:=' bytes left in '+IntToStr(i)+sSpace+sFiles
              else
                 FilesLeftString:=' bytes left in '+IntToStr(i)+sSpace+sFile;

              if (Settings.Frm.AskOverwrite.Checked or Settings.Frm.AskAlways.Checked) and (FileExists(Dest+GetName(Files.Strings[i-1]))) then begin
                 if Application.MessageBox(sFilePresent_Overwrite,sConfirmOverwrite,MB_ICONQUESTION+MB_YESNO)=IDYes then begin
                  CopyFile(i-1);
                 end;
              end else begin
                 CopyFile(i-1);
              end;
             end;
      Delete : begin
              if i>1 then
                 FilesLeft.Caption:=IntToStr(i)+sSpace+sFiles+sSpace+sLeft
              else
                 FilesLeft.Caption:=IntToStr(i)+sSpace+sFile+sSpace+sLeft;

              Attr:=FileGetAttr(Source+GetName(Files.Strings[i-1]));
              if (Settings.Frm.DelAll.Checked or Settings.Frm.AskAlways.Checked) and ((Attr and faHidden>0) or (Attr and faSysFile>0) or (Attr and faReadOnly>0)) then begin
                 if Application.MessageBox(sSureDelete,sConfirmDelete,MB_ICONQUESTION+MB_YESNO)=IDYes then begin
                  FileSetAttr(Source+GetName(Files.Strings[i-1]),0);
                  DeleteFile(i-1);
                 end;
              end else begin
                 FileSetAttr(Source+GetName(Files.Strings[i-1]),0);
                 DeleteFile(i-1);
              end;
             end;
      Move   : MoveFile(i-1);
     end;
     ShowProgress;
     dec(i);
  end;
  Form.Close;
end;

procedure ActionThread.StopClick(Sender: TObject);
begin
   NotQuit:=False;
   StopButton.Enabled:=False;
end;

function ActionThread.GetSize(FS:string):integer;
var Size:string;
    i:integer;
begin
   i:=Length(FS); Size:=sEmpty;
   while (i>0) and (FS[i]<>sKomma) do begin
    Size:=FS[i]+Size;
    dec(i);
   end;
   GetSize:=StrToInt(Size);
end;

function ActionThread.GetName(FS:string):string;
var i:integer;
begin
   i:=1; Result:=sEmpty;
   while FS[i]<>sKomma do begin
    Result:=Result+FS[i];
    inc(i);
   end;
end;

procedure ActionThread.CopyFile(i:integer);
var SourceFile,DestFile,j,BytesRead:integer;
    Buffer:array[1..BufSize] of char;
    SourceFilename,DestFileName:string;
    CopyError:boolean;
    H,M,S,MS:WORD;
    FSize:integer;
begin
FSize:=GetSize(Files.Strings[i]);
 if FSize=DirRecognize then begin
    CreateDir(Dest+GetName(Files.Strings[i]));
 end else begin
   if DiskFree(Ord(Dest[1])-64)<FSize then begin
    Application.MessageBox(sDiskFull,sErrorCopyingFile,mb_Ok+mb_IconStop);
    CopyError:=True;
   end else begin
    BytesRead:=1;
    SourceFilename:=Source+GetName(Files.Strings[i]);
    DestFilename:=Dest+GetName(Files.Strings[i]);

    SRCFile.Caption:=SourceFilename;
    DSTFile.Caption:=DestFilename; DSTFile.Left:=346-DSTFile.Width;
    SRCSize.Caption:=AJVIntToStr(FSize)+sSpace+'bytes';
    SourceFile:=FileOpen(SourceFilename,fmShareDenyNone);
    DestFile:=FileCreate(DestFilename);
    if SourceFile<0 then begin
       ErrorMessage(sCouldNotOpenSrcFile+sSpace+sQuote+SourceFilename+sQuote,sErrorCopyingFile);
       Overall.Progress:=Overall.Progress+FSize;
    end else begin
       if DestFile<0 then begin
        ErrorMessage(sCouldNotOpenDestFile+sSpace+sQuote+DestFilename+sQuote,sErrorCopyingFile);
        Overall.Progress:=Overall.Progress+FSize;
       end else begin
        while (BytesRead<>0) and (not CopyError) do begin
           BytesRead:=FileRead(SourceFile,Buffer,BufSize);
           FileWrite(DestFile,Buffer,BytesRead);
           Current.Progress:=Current.Progress+BytesRead;
           Overall.Progress:=Overall.Progress+BytesRead;
           FilesLeft.Caption:=AJVIntToStr(Overall.MaxValue-Overall.Progress)+FilesLeftString;
           DecodeTime(Time-StartTime,H,M,S,MS); inc(S);
           BPS.Caption:=AJVIntToStr(Overall.Progress div (H*3600+M*60+S))+' bytes/sec';
           BPS.Left:=346-BPS.Width;
           ShowProgress;
        end;
       end;
    end;
    FileClose(DestFile);
    FileClose(SourceFile);
    FileSetAttr(DestFilename,FileGetAttr(SourceFilename));
   end;
 end;
end;

procedure ActionThread.DeleteFile(i:integer);
var FileNaam:string;
    Size:integer;
begin
   FileNaam:=Source+GetName(Files.Strings[i]);
   Size:=GetSize(Files.Strings[i]);
   SRCFile.Caption:=FileNaam;
   SRCSize.Caption:=AJVIntToStr(GetSize(Files.Strings[i]))+sSpace+'bytes';

   if Size=DirRecognize then begin
    if not SysUtils.RemoveDir(FileNaam) then begin
       ErrorMessage(sCouldNotDeleteDir+sSpace+sQuote+Filenaam+sQuote,sErrorDeletingFile);
    end;
   end else begin
    if SysUtils.DeleteFile(FileNaam) then begin
       Current.Progress:=Size;
       Overall.Progress:=Overall.Progress+1;
    end else begin
       ErrorMessage(sCouldNotDeleteFile+sSpace+sQuote+Filenaam+sQuote,sErrorDeletingFile);
    end;
   end;
end;

procedure ActionThread.MoveFile(i:integer);
begin
   Current.MaxValue:=GetSize(Files.Strings[i]);
   Overall.Progress:=Overall.Progress+Current.MaxValue;
end;

procedure ActionThread.ErrorMessage(Bericht,Error:string);
var Msg:array[0..355] of char;
    Err:array[0..355] of char;
begin
   StrPCopy(Msg,Bericht);
   StrPCopy(Err,Error);
   Application.MessageBox(Msg,Err,mb_Ok+mb_IconWarning);
end;

procedure ActionThread.ShowProgress;
begin
  if Overall.Progress>0 then begin
     TimeLeft.Caption:=sEstim+sSpace+FormatDateTime('n:ss',(Time-StartTime)*((Overall.MaxValue-Overall.Progress)/Overall.Progress));
     TimeLeft.Left:=346-TimeLeft.Width;
  end;
end;

end.

(edit) Oja.. dit hoort er nog bij:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
procedure TFileList.CopyFiles(Dest:string; Func:TNotifyEvent);
var
   FilesToDo:TStrings;

   procedure AddSub(Dr:string);
   var FRec:TSearchRec;
   begin
    FilesToDo.Add(Dr+sKomma+IntToStr(DirRecognize));
    FindFirst(CurrentDir+Dr+sExtAll,faAnyFile,FRec);
    repeat
       if (FRec.Attr and faDirectory>0) then begin
        if ((FRec.Name<>sPoint) and (FRec.Name<>sDirUp)) then begin
           AddSub(Dr+FRec.Name+sBackSlash);
        end;
       end else begin
        FilesToDo.Add(Dr+FRec.Name+sKomma+IntToStr(Frec.Size));
       end;
    until FindNext(FRec)<>0;
    SysUtils.FindClose(FRec);
   end;

var i:integer;
    FileNaam:array[0..256] of char;
begin
   Screen.Cursor:=crHourGlass;
   FilesToDo:=TStringList.Create;
   i:=Files.Items.Count-1;
   while i>=0 do begin
    if Files.Items[i].Selected then begin
       if Files.Items[i].SubItems[0]=sDirStr then begin
       // voeg subdir toe
        AddSub(Files.Items[i].Caption+sBackSlash);
       end else begin
        FilesToDo.Add(Files.Items[i].Caption+sKomma+Files.Items[i].Subitems[0]);
       end;
    end;
    dec(i);
   end;
   ActionThread.Create(CurrentDir,Dest,FilesToDo,Copy,Func);
   FilesToDo.Free;
   Screen.Cursor:=crDefault;
end;

En het is de bedoeling dat je dit als leidraad gebruikt natuurlijk he.. niet letterlijk overnemen! :P

Siditamentis astuentis pactum.


  • Dryw.Filtiarn
  • Registratie: September 2001
  • Laatst online: 18-03 12:10
Op dinsdag 18 december 2001 22:05 schreef Varienaja het volgende:

[..]

Natuurlijk mail ik je dat niet, ik post het hier, dan heeft iemand anders er ook nog wat aan.

Deze code is van 2 februari 1999, toen ik nog NT4.0 draaide. Ik post gewoon de hele unit, waarin de thread zit voor 't kopieren. Ik weet zelf al niet exact meer hoe alles in elkaar zat. Veel plezier ermee >:) ;)
code:
1
2
3
unit ThreadSpul;

[knipmode]Heel veel Delphi-code[/knipmode]

En het is de bedoeling dat je dit als leidraad gebruikt natuurlijk he.. niet letterlijk overnemen! :P
Thanks, was helaas al niet echt meer nodig omdat ik al iets anders had gevonden, maar toch goed te weten dat er GoTters zijn die anderen willen helpen...

=( Protected by witchcraft )=

Pagina: 1