N
nuaalisa
Unregistered / Unconfirmed
GUEST, unregistred user!
论坛上的各位朋友,小妹准备做一个目录增量备份的东西,下面的代码是从论坛上搜索来的代码,但小妹水平有限,不知道如何才能将下面的两段代码结合起来使用,从而实现同步两个文件夹的内容,请各位朋友给点提示,谢谢!
nutian (2003-06-15 2:44:00)
好了,终于全部搞定了,实现的功能是:2个文件夹同步,用stringlist装入pfrom中没问题。比较文件速度很快,千多个文件的目录也1秒钟比较完成。
下面给出比较文件的函数和复制文件的函数供大家参考,也算对大富翁论坛的一点点回报:
==============================================================================
//比较文件时间
function DoCopyDir(sDirName:String;sToDirName:String):Boolean;
var
hFindFile,toFindFile:Cardinal;
t,tfile:String;
sCurDir:String[255];
FindFileData,ToFileData:WIN32_FIND_DATA;
begin
//先保存当前目录
sCurDir:=GetCurrentDir;
ChDir(sDirName);
hFindFile:=FindFirstFile('*.*',FindFileData);
if hFindFile<>INVALID_HANDLE_VALUE then //如果找到了文件
begin
if not DirectoryExists(sToDirName) then
ForceDirectories(sToDirName); //目标目录不在就创建
repeat
tfile:=FindFileData.cFileName;
if (tfile='.') or (tfile='..') then
Continue;
if FindFileData.dwFileAttributes=
FILE_ATTRIBUTE_DIRECTORY then //如果文件是子目录
begin
t:=sToDirName+'/'+tfile;
if not DirectoryExists(t) then //子目录不在就创建
ForceDirectories(t);
if sDirName[Length(sDirName)]<>'/' then
DoCopyDir(sDirName+'/'+tfile,t)
else
DoCopyDir(sDirName+tfile,sToDirName+tfile);
end
else //如果是文件,这里是核心
begin
t:=sToDirName+'/'+tFile;
//CopyFile(PChar(tfile),PChar(t),True);
toFindFile:=FindFirstFile(Pchar(t),ToFileData);//寻找目标文件
if toFindFile<>INVALID_HANDLE_VALUE then //如果在就比较时间
begin
if (FindFileData.ftLastWriteTime.dwHighDateTime<>toFileData.ftLastWriteTime.dwHighDateTime)
or (FindFileData.ftLastWriteTime.dwLowDateTime<>toFileData.ftLastWriteTime.dwLowDateTime)
then NameList.Add(GetCurrentDir+'/'+tFile); //如果2个文件时间不同
end
else //如果目标目录没有该文件
NameList.Add(GetCurrentDir+'/'+tFile);
//显示搜寻到的文件的修改时间
//form1.memo1.Lines.Add(inttostr
// (FindFileData.ftLastWriteTime.dwHighDateTime));
//form1.GetFileLastAccessTime(PChar(tfile),PChar(t));
//进度条进一格
form1.ProgressBar1.Position:=form1.ProgressBar1.Position+1;
form1.ProgressBar1.Repaint;
end;
until FindNextFile(hFindFile,FindFileData)=false;
windows.FindClose(hFindFile);
windows.FindClose(ToFindFile);
end
else //一个文件都没找到则
begin
ChDir(sCurDir);
result:=false;
exit;
end;
//回到原来的目录下
ChDir(sCurDir);
result:=true;
end;
==================================================================
function CopyFile(SourceName, TargetName: string): Boolean;
var
F: TShFileOpStruct;
Index: Integer;
Fromdir,Todir,ToFile:string;
begin
for Index := 0 to namelist.Count - 1 do
begin
Fromdir := fromdir+namelist[index]+#0;//从namelist中取出文件名,用#0隔开
ToFile :=TargetName+ copy(namelist[index],length(SourceName)+1,
length(namelist[index])-length(SourceName));//转换为目标路径
Todir :=Todir+ToFile+#0;
end;
F.wnd := Form1.Handle;
F.wFunc := FO_COPY; {操作方式}
F.pFrom := PChar(fromdir+#0);
F.pTo := PChar(Todir+ #0);
F.fFlags:= FOF_NOCONFIRMATION or FOF_MULTIDESTFILES
F.fAnyOperationsAborted:= true;
if ShFileOperation(F)<>0 then showmessage('文件没复制完');
if IOResult<>0 then showmessage('文件没复制完');
end;
==============================================
说明:namelist为函数外部定义的一个全局变量,里面装的是需拷贝的文件列表,定义如下
var namelist:Tstringlist;
nutian (2003-06-15 2:44:00)
好了,终于全部搞定了,实现的功能是:2个文件夹同步,用stringlist装入pfrom中没问题。比较文件速度很快,千多个文件的目录也1秒钟比较完成。
下面给出比较文件的函数和复制文件的函数供大家参考,也算对大富翁论坛的一点点回报:
==============================================================================
//比较文件时间
function DoCopyDir(sDirName:String;sToDirName:String):Boolean;
var
hFindFile,toFindFile:Cardinal;
t,tfile:String;
sCurDir:String[255];
FindFileData,ToFileData:WIN32_FIND_DATA;
begin
//先保存当前目录
sCurDir:=GetCurrentDir;
ChDir(sDirName);
hFindFile:=FindFirstFile('*.*',FindFileData);
if hFindFile<>INVALID_HANDLE_VALUE then //如果找到了文件
begin
if not DirectoryExists(sToDirName) then
ForceDirectories(sToDirName); //目标目录不在就创建
repeat
tfile:=FindFileData.cFileName;
if (tfile='.') or (tfile='..') then
Continue;
if FindFileData.dwFileAttributes=
FILE_ATTRIBUTE_DIRECTORY then //如果文件是子目录
begin
t:=sToDirName+'/'+tfile;
if not DirectoryExists(t) then //子目录不在就创建
ForceDirectories(t);
if sDirName[Length(sDirName)]<>'/' then
DoCopyDir(sDirName+'/'+tfile,t)
else
DoCopyDir(sDirName+tfile,sToDirName+tfile);
end
else //如果是文件,这里是核心
begin
t:=sToDirName+'/'+tFile;
//CopyFile(PChar(tfile),PChar(t),True);
toFindFile:=FindFirstFile(Pchar(t),ToFileData);//寻找目标文件
if toFindFile<>INVALID_HANDLE_VALUE then //如果在就比较时间
begin
if (FindFileData.ftLastWriteTime.dwHighDateTime<>toFileData.ftLastWriteTime.dwHighDateTime)
or (FindFileData.ftLastWriteTime.dwLowDateTime<>toFileData.ftLastWriteTime.dwLowDateTime)
then NameList.Add(GetCurrentDir+'/'+tFile); //如果2个文件时间不同
end
else //如果目标目录没有该文件
NameList.Add(GetCurrentDir+'/'+tFile);
//显示搜寻到的文件的修改时间
//form1.memo1.Lines.Add(inttostr
// (FindFileData.ftLastWriteTime.dwHighDateTime));
//form1.GetFileLastAccessTime(PChar(tfile),PChar(t));
//进度条进一格
form1.ProgressBar1.Position:=form1.ProgressBar1.Position+1;
form1.ProgressBar1.Repaint;
end;
until FindNextFile(hFindFile,FindFileData)=false;
windows.FindClose(hFindFile);
windows.FindClose(ToFindFile);
end
else //一个文件都没找到则
begin
ChDir(sCurDir);
result:=false;
exit;
end;
//回到原来的目录下
ChDir(sCurDir);
result:=true;
end;
==================================================================
function CopyFile(SourceName, TargetName: string): Boolean;
var
F: TShFileOpStruct;
Index: Integer;
Fromdir,Todir,ToFile:string;
begin
for Index := 0 to namelist.Count - 1 do
begin
Fromdir := fromdir+namelist[index]+#0;//从namelist中取出文件名,用#0隔开
ToFile :=TargetName+ copy(namelist[index],length(SourceName)+1,
length(namelist[index])-length(SourceName));//转换为目标路径
Todir :=Todir+ToFile+#0;
end;
F.wnd := Form1.Handle;
F.wFunc := FO_COPY; {操作方式}
F.pFrom := PChar(fromdir+#0);
F.pTo := PChar(Todir+ #0);
F.fFlags:= FOF_NOCONFIRMATION or FOF_MULTIDESTFILES
F.fAnyOperationsAborted:= true;
if ShFileOperation(F)<>0 then showmessage('文件没复制完');
if IOResult<>0 then showmessage('文件没复制完');
end;
==============================================
说明:namelist为函数外部定义的一个全局变量,里面装的是需拷贝的文件列表,定义如下
var namelist:Tstringlist;