=( Protected by witchcraft )=
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
Op zich heel leuk maar als het nou het principe wordt van: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.
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 )=
Dat werd net al verteld: copyfile, findfirst en findnext.
En dat gaat dan ongeveer zo (maar werkt gegarandeerd niet) >:):
Recursie heet dat
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.
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
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.
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.
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
Als je wilt mag je wel even mailen naar dryw.filtiarn@wanadoo.nl kheb op dit moment geen ICQOp 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 10procedure 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
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.
=( Protected by witchcraft )=
Natuurlijk mail ik je dat niet, ik post het hier, dan heeft iemand anders er ook nog wat aan.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
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!
Siditamentis astuentis pactum.
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...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!
=( Protected by witchcraft )=
Pagina: 1