root/trunk/CopyFileUnit.pas

Revision 4, 7.1 kB (checked in by sagrer, 1 year ago)

Исходник помещен в trunk

  • Property svnmailer:content-charset set to cp1251
Line 
1 ///////////////////////////////////////////////////////////
2 //                        EiEdit                         //
3 //      Ðåäàêòîð ÷àñòè ðåñóðñîâ Ïðîêëÿòûõ Çåìåëü         //
4 //             Copyright (C) 2002 Gipat Group            //
5 //              Ðàñïðîñòðàíÿåòñÿ íà óñëîâèÿõ             //
6 //    Gipat Group's opened EI-editor-utility license     //
7 //                      âåðñèè 1.0                       //
8 //                                                       //
9 //                  www.gipatgroup.org                   //
10 ///////////////////////////////////////////////////////////
11
12 //Ê ðàáîòå íàä äàííûì ôàéëîì ïðèëîæèëè ðóêè, íîãè.... êîðî÷å àôôòàðû:
13 // 1) Sagrer (sagrer@yandex.ru)
14
15 ////////////////////////////////////////////////////////////////////////
16
17 unit CopyFileUnit;
18
19 interface
20
21 uses
22   Windows, messages, KOL, ComCtrls;
23
24 type
25   RFileCopyInfo = record
26     CopyFrom : string;
27     CopyTo : string;
28     UseBar : boolean;
29     Result : boolean;
30   end;
31
32   LongRec = packed record    //Ñòÿíóòî èç SysUtils
33     case Integer of
34       0: (Lo, Hi: Word);
35       1: (Words: array [0..1] of Word);
36       2: (Bytes: array [0..3] of Byte);
37   end;
38
39 var
40   BarMax, BarPos, BarMaxThr, BarPosThr, BarPosOld, BarMaxOld : int64;
41   FileCopyThread : PThread;
42   CopySynMethod : TThreadMethod;
43   FileCopyInfo : RFileCopyInfo;
44   BarUpdated, BarUpdatedThr, BarReseted, BarResetedThr : boolean;
45
46 Function FileCopyThr(const CopyFrom, CopyTo : string; UseBar : boolean): boolean;
47 Function FileCopy(Dummy:Pointer; Sender: PThread): Integer;
48 Procedure CopySyn;
49 //Function PathMinusDir(const Path : string) : string;
50 function FileGetDate(Handle: Integer): Integer;  //Ñòÿíóòî èç SysUtils
51 function FileSetDate(Handle: Integer; Age: Integer): Integer; //Ñòÿíóòî èç SysUtils
52 Function VCLCopyFile(const CopyFrom, CopyTo : string; DoReplace, UseBar : boolean; PointToBar : TProgressBar) : boolean;
53
54 implementation
55
56 const
57   RazmBuf: Longint = 8192;
58
59 var
60   FileOldStream, FileNewStream : PStream;
61
62 function FileGetDate(Handle: Integer): Integer;
63 //Ôóíêà âçÿòà èç SysUtils
64 {$IFDEF MSWINDOWS}
65 var
66   FileTime, LocalFileTime: TFileTime;
67 begin
68   if GetFileTime(THandle(Handle), nil, nil, @FileTime) and
69     FileTimeToLocalFileTime(FileTime, LocalFileTime) and
70     FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
71       LongRec(Result).Lo) then Exit;
72   Result := -1;
73 end;
74 {$ENDIF}
75 {$IFDEF LINUX}
76 var
77   st: TStatBuf;
78 begin
79   if fstat(Handle, st) = 0 then
80     Result := st.st_mtime
81   else
82     Result := -1;
83 end;
84 {$ENDIF}
85
86 function FileSetDate(Handle: Integer; Age: Integer): Integer;
87 //Ôóíêà âçÿòà èç SysUtils
88 var
89   LocalFileTime, FileTime: TFileTime;
90 begin
91   Result := 0;
92   if DosDateTimeToFileTime(LongRec(Age).Hi, LongRec(Age).Lo, LocalFileTime) and
93     LocalFileTimeToFileTime(LocalFileTime, FileTime) and
94     SetFileTime(Handle, nil, nil, @FileTime) then Exit;
95   Result := GetLastError;
96 end;
97
98 Function VCLCopyFile(const CopyFrom, CopyTo : string; DoReplace, UseBar : boolean; PointToBar : TProgressBar) : boolean;
99 begin
100   //Ñîáñíî íà÷àëüíàÿ ôóíêà äëÿ êîïèðîâàíèÿ.
101   Result := false;  //Òèïà ïî óìîë÷àíèþ ïðîâàë...
102
103   //Òåïåðü - ïðîâåðèòü, íàäî ëè óäàëèòü ñòàðóþ âåðñèþ êîíå÷íîãî ôàéëà.
104   If FileExists(CopyTo) = true then begin
105     If DoReplace = true then begin
106       DeleteFile(PChar(CopyTo));
107     end;
108   end;
109
110   //Òåïåðü - ïîäãîòîâèòü ïîòîê, íó è îñòàëüíóþ èíôó...
111   If UseBar = true then begin
112     //Íàñòðîéêà áàðà...
113     PointToBar.Position := 0;
114     PointToBar.Max := 1;
115     BarPosOld := 0;
116     BarMaxOld := 1;
117   end;
118   FileCopyInfo.CopyFrom := CopyFrom;
119   FileCopyInfo.CopyTo := CopyTo;
120   FileCopyInfo.UseBar := UseBar;
121   FileCopyThread := NewThread;
122   FileCopyThread.AutoFree := true;
123   FileCopyThread.OnExecute := TOnThreadExecute(MakeMethod(nil, @FileCopy));
124
125   //Òåïåðü - ñîáñíî çàïóñêàòü ïîòîê, êîïèðîâàòü è îáíîâëÿòü áàð.
126   FileCopyThread.Resume;
127
128   repeat
129     If BarMaxOld <> BarMax then begin
130       PointToBar.Max := BarMax;
131       PointToBar.Position := BarPos;
132       BarPosOld := BarPos;
133       BarMaxOld := BarMax;
134     end
135     else begin
136       If BarPosOld < BarPos then begin
137         BarPosOld := BarPos;
138         PointToBar.Position := BarPos;
139       end;
140     end;
141     Applet.ProcessMessages;
142   until WaitForSingleObject(FileCopyThread.Handle,0) <> Wait_Timeout;
143 end;
144
145 Function FileCopy(Dummy:Pointer; Sender: PThread): Integer;
146 var
147   CopyFrom : string;
148   CopyTo : string;
149   UseBar : boolean;
150
151 begin
152   //Ãîòîâëþ èíôó. ×òîá ïðîöåäóðà ñîáñíî â ïîòîêå, íå ëåçëà â çàïèñü
153   //ñ èíôîé.
154   CopyFrom := FileCopyInfo.CopyFrom;
155   CopyTo := FileCopyInfo.CopyTo;
156   UseBar := FileCopyInfo.UseBar;
157   //Ãîòîâëþ ñèíõð-ìåòîä
158   CopySynMethod := TThreadMethod(MakeMethod(nil,@CopySyn));
159   FileCopyInfo.Result := FileCopyThr(CopyFrom,CopyTo,UseBar);
160   Result := 1;
161 end;
162
163 Procedure CopySyn;
164
165 begin
166   BarMax := BarMaxThr;
167   BarPos := BarPosThr;
168 end;
169
170 Function FileCopyThr(const CopyFrom, CopyTo : string; UseBar : boolean): boolean;
171 var
172   BytesCopied : int64;
173   CopyBuffer : pointer;
174   sch : integer;
175
176 begin
177   //Ñîáñíî êîïèðîâàíèå ôàéëà â ïîòîêå.
178
179   //Âûäåëèòü ïàìÿòü ïîä áóôôåð...
180   GetMem(CopyBuffer,RazmBuf);
181  
182   try
183     try
184       FileNewStream := NewWriteFileStream(CopyTo); //Íà çàïèñü
185       FileOldStream := NewReadFileStream(CopyFrom); //Íà ÷òåíèå
186
187       //Ïîäãîòîâèòü ïåðåìåííûå.
188       sch := 0;
189       Result := false;
190       //BytesCopied := 0;
191       //TotalCopied := 0;
192       BarPosThr := 0;
193       BarMaxThr := FileOldStream.Size;
194       //Îáíîâèòü èíôó áàðà.
195       FileCopyThread.Synchronize(CopySynMethod);
196
197       //íà÷àòü ðåïèò...
198       repeat
199         BytesCopied := FileOldStream.Read(CopyBuffer^,RazmBuf);
200         If BytesCopied = -1 then begin
201           MsgOK('ReAd ErRoR!!!!');  //Îøèáêà ÷òåíèÿ
202         end;
203         //TotallCopied := TotallCopied+BytesCopied;
204         if BytesCopied > 0 then begin
205           //Åñëè ÷åòî âñåæå ïðî÷èòàëîñü...
206           If (FileNewStream.Write(CopyBuffer^,BytesCopied) <> BytesCopied) then begin
207             //Îøèáêà çàïèñè...
208             MsgOK('WrItE eRrOr!!!');
209           end;
210
211           //Åñëè íàäî - îáíîâèòü èíôó áàðà.
212           If UseBar = true then begin
213             Sch := Sch+1;
214             BarPosThr := BarPosThr+BytesCopied;
215             If Sch = 100 then begin
216               Sch := 0;
217               //BarUpdatedThr := true;
218               //Îáíîâèòü èíôó áàðà.
219               FileCopyThread.Synchronize(CopySynMethod);
220             end;
221           end;
222         end;
223       until BytesCopied < RazmBuf;
224
225       //Ñêîïèðîâàòü âðåìåíà ôàéëà...
226       FileSetDate(FileNewStream.Handle, FileGetDate(FileOldStream.Handle));
227
228       //Ñêîïèðîâàòü àòðèáóòû ôàéëà...
229       SetFileAttributes(PChar(CopyTo),GetFileAttributes(PChar(CopyFrom)));
230
231       //Òèïà îê.
232       Result := true;
233       BarPosThr := BarMaxThr;
234       FileCopyThread.Synchronize(CopySynMethod);
235     except
236       Result := false;
237     end;
238   finally
239     //Îáÿçàòåëüíî óáèòü ñîçäàííûå ïîòîêè (çàêðûòü ôàéëû).
240     FileNewStream.Free;
241     FileOldStream.Free;
242
243     //È îñâîáîäèòü âûäåëåííóþ ïàìÿòü.
244     FreeMem(CopyBuffer,RazmBuf);
245   end;
246 end;
247
248 end.
Note: See TracBrowser for help on using the browser.