怎样实现复制一个目录下的所有目录和文件到另外一个目录 ( 积分: 100 )

  • 主题发起人 主题发起人 ganbaba
  • 开始时间 开始时间
G

ganbaba

Unregistered / Unconfirmed
GUEST, unregistred user!
我的问题是把一个目录下的所有文件和所有子目录下的文件复制到另外一个目录,但源目录结构和目标目录结构不用一模一样的,只要把所有文件复制到新的一个目录中就可以了,不知道大家明白我的意思没?
 
正巧我刚做了个自动备份的程序要用到这个函数
function tform1.DoCopyDir(sDirName:String;sToDirName:String):Boolean;
var
hFindFile:Cardinal;
t,tfile :String;
sCurDir:String[255];
FindFileData:WIN32_FIND_DATA;
begin
//记录当前目录
sCurDir:=GetCurrentDir;
ChDir(sDirName);
if not DirectoryExists(sToDirName) then
ForceDirectories(sToDirName)
else
begin
DelTree(sToDirName);
//rmdir(sToDirName);
end;
hFindFile:=FindFirstFile('*.*',FindFileData);
if hFindFile<>INVALID_HANDLE_VALUE then
begin
if not DirectoryExists(sToDirName) then
ForceDirectories(sToDirName);
{else
begin
DelTree(sToDirName);
rmdir(sToDirName);
end;}
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);
end;
until FindNextFile(hFindFile,FindFileData)=false;
/// FindClose(hFindFile);
end
else
begin
ChDir(sCurDir);
result:=false;
exit;
end;
//回到当前目录
ChDir(sCurDir);
result:=true;
end;
 
递归法检索文件,对每个文件都进行相同的复制工作,并检测同名文件是否存在。
 
hFindFile:=FindFirstFile('*.*',FindFileData);
报错Missing operator or semicolon
 
FindFirstFile
HRESULT FindFirstFile(
[in, string] LPCWSTR wsSearchFile
[out] LPWIN32_FIND_DATAW pFindFileData
[out] LPHANDLE pSearchHandle
);

Searches a directory for a file whose name matches the specified file name on the destination site identified by this object. It examines subdirectory names as well as file names.

wsSearchFile
Address of a null-terminated string that contains the file name to find.
pFindFileData
Address of a WIN32_FIND_DATA structure that receives information about the file or subdirectory that has been found.
pSearchHandle
Address of a variable that receives a handle that can be used for subsequent calls to the FindNextFile and FindClose functions.
 
用这个函数SHFileOperation,具体使用查看windows帮助
 
procedure MoveFile(SDir,DDir: string);
var
SHFileOpStruct: TSHFileOpStruct;
begin
with SHFileOpStruct do
begin
Wnd := 0;
wFunc := FO_MOVE ;
pFrom := Pchar(SDir+ #0);
pTo := Pchar(DDir+ #0);
fFlags :=FOF_NOCONFIRMATION + FOF_NOERRORUI;
hNameMappings := nil;
lpszProgressTitle := '移动文件';
fAnyOperationsAborted := False;
end;
SHFileOperation(SHFileOpStruct);
end;
 
用这个函数SHFileOperation就可以,
我是用这个实现的
 
唉,大家都没明白我的意思
 
怎么会报错?我在系统中的调用,就没有错误D7+XP环境下的
if DoCopyDir(str,'D:/mysql/data/mesc30') then
begin
FileSetAttr('D:/mysql/data/mesc30', 0);
//FileSetAttr('D:/mysql/data/mesc30', faArchive); //去掉文件只读属性

screen.Cursor:=crDefault;
label17.Caption:='数据恢复完毕';
end;
 
那就是我人品问题了
 
弱弱的说一句,其实有个更简单的复制方法,就是使用CreateOleObject('Scripting.FileSystemObject') 这样的方法来建立一个OleVariant对象,然后直接用它的CopyFolder方法就可以直接复制了。我认为这种方法简单又实在,复制的速度也不错。嘿嘿
 
各位过路的神仙,救救我~
 
你这样提问可能很难得到答案的。
1.题意不大明确:“源目录结构和目标目录结构不用一模一样的”-一样行不行?不一样又该怎样?是不是都复制到一个目录下?遇到同名文件要求如何处理?
2.“唉,大家都没明白我的意思”-既然大家不明白,就应该进一步解释。
3.人家给出代码了,你试过没有?有没有问题?哪里不符合你的要求?
你不给大家说清楚,“各位过路的神仙”如何救你?
 
function TForm1.CopyDirectory(SourcePath,TargetPath: string): Boolean; //copy整个目录
var
search: TSearchRec;
ret: integer;
key: string;
begin
if TargetPath[Length(TargetPath)] <> '/' then
TargetPath := TargetPath + '/';
if SourcePath[Length(SourcePath)] <> '/' then
SourcePath := SourcePath + '/';

key := SourcePath + '*.*';
ret := findFirst(key, faanyfile, search);
while ret = 0 do begin
if ((search.Attr and fadirectory) = faDirectory)
then begin
if (Search.Name <> '.') and (Search.name <> '..') then
CopyDirectory(SourcePath + Search.name,TargetPath);
end else begin
if ((search.attr and fadirectory) <> fadirectory) then
begin

copyfile(pchar(SourcePath+search.name),pchar(TargetPath+search.Name),False);
end;
end;
ret := FindNext(search);
end;
findClose(search);
result := True;
end;
 
后退
顶部