PDA

View Full Version : سوال: کپی دایرکتورری در دایرکتوری دیگری



darrudi
سه شنبه 13 مهر 1389, 23:09 عصر
کپی دایرکتورری مانند D:\es به E:\fd در دلفی چطور صورت می پذیرد با یک مثال لطفا

Felony
چهارشنبه 14 مهر 1389, 06:45 صبح
تابع آماده ای وجو نداره ، باید لیست فایلهای پوشه مبدا رو بگیرید و تک ، تک داخل پوشه مقصد کپی کنید ، براتون یه تابع نوشتم :

function CopyDir(Source, Dest: String): Boolean;
var
SourceFiles: TSearchRec;
begin
Result:= True;
try
if Source[Length(Source)-1]= '\' then
Source:= Source+ '\';
if Dest[Length(Dest)-1]= '\' then
Dest:= Dest+ '\';
if DirectoryExists(Source) then
begin
if Not DirectoryExists(Dest) then
ForceDirectories(Dest);
if FindFirst(Source+'*.*', faNormal, SourceFiles)= 0 then
repeat
CopyFile(PChar(Source+ SourceFiles.Name), PChar(Dest+ SourceFiles.Name), False);
Application.ProcessMessages;
until (FindNext(SourceFiles)<> 0);
FindClose(SourceFiles);
end;
except
Result:= False;
end;
end;

darrudi
چهارشنبه 14 مهر 1389, 08:00 صبح
تابع آماده ای وجو نداره ، باید لیست فایلهای پوشه مبدا رو بگیرید و تک ، تک داخل پوشه مقصد کپی کنید ، براتون یه تابع نوشتم :

function CopyDir(Source, Dest: String): Boolean;
var
SourceFiles: TSearchRec;
begin
Result:= True;
try
if Source[Length(Source)-1]= '\' then
Source:= Source+ '\';
if Dest[Length(Dest)-1]= '\' then
Dest:= Dest+ '\';
if DirectoryExists(Source) then
begin
if Not DirectoryExists(Dest) then
ForceDirectories(Dest);
if FindFirst(Source+'*.*', faNormal, SourceFiles)= 0 then
repeat
CopyFile(PChar(Source+ SourceFiles.Name), PChar(Dest+ SourceFiles.Name), False);
Application.ProcessMessages;
until (FindNext(SourceFiles)<> 0);
FindClose(SourceFiles);
end;
except
Result:= False;
end;
end;

ممنون از جوابتون اما جواب نداد
به این صورت از اون اسفاده کردم
CopyDir(Edit2.Text,Edit1.Text);
که اولی منبع دایرکتوریمون هست و دومی مقصد

mbshareat
چهارشنبه 14 مهر 1389, 15:26 عصر
با سلام و خدا قوت
با اجازه استاد مجتبی تاجیک بنده کد ایشون رو یه کم تغییر دادم.:خجالت:فایلهایی که در شاخه اصلی باشند نه در زیر شاخه ها می شه با این کد کپی کرد:

function CopyDir(Source, Dest: String): Boolean;
var
SourceFiles: TSearchRec;
begin
Result:= True;
try
if Source[Length(Source)]<> '\' then
Source:= Source+ '\';
if Dest[Length(Dest)]<> '\' then
Dest:= Dest+ '\';
if DirectoryExists(Source) then
begin
if Not DirectoryExists(Dest) then
ForceDirectories(Dest);
if FindFirst(Source+'*.*', faAnyFile, SourceFiles)= 0 then
repeat
CopyFile(PChar(Source+ SourceFiles.Name), PChar(Dest+ SourceFiles.Name), False);
Application.ProcessMessages;
until (FindNext(SourceFiles)<> 0);
FindClose(SourceFiles);
end;
except
Result:= False;
end;
end;

hossein_h62
چهارشنبه 14 مهر 1389, 15:47 عصر
با سلام

فایلهایی که در شاخه اصلی باشند نه در زیر شاخه ها می شه با این کد کپی کرد

یعنی چی که در شاخه اصلی باشند نه در زیر شاخه ها میشه کپی کرد ؟؟؟؟
این کد هیچ مشکلی نداره.
فقط انتهای رشته ای که مقصد رو مشخص میکنه باید کاراکتر '/' وجود داشته باشه.

K.Mohammadreza
چهارشنبه 14 مهر 1389, 20:11 عصر
اين تابع را هم امتحان کن


function CopyDir(const fromDir, toDir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
fFlags := FOF_FILESONLY;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir)
end;
Result := (0 = ShFileOperation(fos));
end;

Delphi7_love
چهارشنبه 14 مهر 1389, 20:25 عصر
اين تابع را هم امتحان کن


function CopyDir(const fromDir, toDir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
fFlags := FOF_FILESONLY;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir)
end;
Result := (0 = ShFileOperation(fos));
end;


دوست عزیز برای TSHFileOpStruct چه کتابخانه ای استفاده میشه ؟

K.Mohammadreza
چهارشنبه 14 مهر 1389, 21:11 عصر
درست يادم نيست ولي جلوي uses اينها بودند البته دلفي در دسترس نبود فايل pas را در notepad باز کردم و متن uses را کپي کردم



uses
Windows,menus,StrUtils,shellApi,FileCtrl,ComObj, Messages,
SysUtils, Classes, Controls, Dialogs,Forms,WinSock,Registry,
StdCtrls,ComCtrls,Graphics, ExtCtrls,imglist,mmsystem,shlobj;

Delphi7_love
چهارشنبه 14 مهر 1389, 21:35 عصر
StdCtrls بود

mbshareat
چهارشنبه 14 مهر 1389, 22:29 عصر
با سلام و درود
من هم همین سوال رو دارم.StdCtrls رو به Uses اضافه کردم باز نوع TSHFileOpStruct رو نمی شناسه.
در جواب این سوال که:

یعنی چی که در شاخه اصلی باشند نه در زیر شاخه ها میشه کپی کرد ؟؟؟؟
باید بگم یعنی اگه شاخه داخل شاخه مبدأ باشه در پوشه مقصد ایجاد نمی شه.

Delphi7_love
چهارشنبه 14 مهر 1389, 22:52 عصر
من هم همین سوال رو دارم.StdCtrls رو به Uses اضافه کردم باز نوع TSHFileOpStruct رو نمی شناسه.


درسته ، من امتحان کردم جواب داد

Delphi7_love
چهارشنبه 14 مهر 1389, 23:05 عصر
یه نمونه برای کپی ، حذف ، انتقال اینجا میذارم
امیدوارم مفید واقع شه.

57860

در ضمن توابع داخل یونیته و باید ازشون استفاده کنید

Felony
پنج شنبه 15 مهر 1389, 07:43 صبح
توسط تابع زیر میتونید لیست فایل ها و زیرپوشه های یک پوشه رو بگیرید ( به صورت درختی ) ، به راحتی با کمک کد قبلی که گزاشتم میتونید تابع کپی مورد نظر رو پیاده کنید :

procedure FindFiles(FilesList: TStringList; StartDir, FileMask: string);
var
SR: TSearchRec;
DirList: TStringList;
IsFound: Boolean;
i: Integer;
begin
if StartDir[length(StartDir)] <> '\' then
StartDir := StartDir + '\';
{ Build a list of the files in directory StartDir
(not the directories!) }
IsFound := FindFirst(StartDir+FileMask, faAnyFile-faDirectory, SR) = 0;
while IsFound do
begin
FilesList.Add(StartDir + SR.Name);
IsFound := FindNext(SR) = 0;
Application.ProcessMessages;
end;
FindClose(SR);
// Build a list of subdirectories
DirList := TStringList.Create;
try
IsFound := FindFirst(StartDir+ '*.*', faAnyFile, SR) = 0;
while IsFound do
begin
if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> '.') then
DirList.Add(StartDir + SR.Name);
IsFound := FindNext(SR) = 0;
Application.ProcessMessages;
end;
FindClose(SR);
// Scan the list of subdirectories
for i := 0 to DirList.Count - 1 do
FindFiles(FilesList, DirList[i], FileMask);
finally
DirList.Free;
end;
end;

mbshareat
پنج شنبه 15 مهر 1389, 22:46 عصر
با سلام
جناب آقای مجتبی تاجیک عزیز
منظور از FileMask چیه؟آیا کارکترهای وحشی و مثلا *.bmp و غیره است؟
چطور می شه این دو کد رو ضمیمه کرد؟ آیا شاخه هم در شاخه مقصد می سازه؟
(اگه کپنم تموم نشده می خوام بپرسم حالتون چطوره!:بامزه:)

Mahmood_M
پنج شنبه 15 مهر 1389, 23:53 عصر
من هم همین سوال رو دارم.StdCtrls رو به Uses اضافه کردم باز نوع TSHFileOpStruct رو نمی شناسه.
TSHFileOpStruct در یونیت ShellApi تعریف شده ...