PDA

View Full Version : کپی کردن یک فولدر



Gladiator
پنج شنبه 15 اسفند 1381, 17:12 عصر
با سلام
چطوری میشه یه فولدر رو با همه فایلهای داخلش کپی کرد ؟
مثلا از سی دی به هارد ؟؟؟؟
مرسی .

و اگر میشه توضیح بدین که انجام این عملیات رو چطور میشه با یک ProgressBar نشون بدیم .

بازم مرسی .

RezaBS
پنج شنبه 15 اسفند 1381, 19:49 عصر
با سلام
کد زیر خیلی راحت این کار را براتون انجام میده. در صورتی که تمایل به استفاده از چنین روشی نداشتید بفرمایید تا روش بعدی رو بنویسم که از طریق API هست و البته یک روش دیگر هم هست.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FindFile, Filectrl, ShellApi, ExtCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
Button1: TButton;
Button2: TButton;
FindFile1: TFindFile;
Image1: TImage;
Image2: TImage;
ListBox1: TListBox;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure Image2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1 : TForm1;
Path,
Path2 : string;

implementation

{$R *.DFM}


procedure CopyRecursive(srcDir, dstDir: string);

var
cmd : string;
begin
cmd:='/c xcopy '+srcDir+' '+dstDir+' /E';
ShellExecute(Application.handle,'open','command',P Char(cmd),nil,SW_SHOW);
end;

procedure TForm1.Button2Click(Sender: TObject);

var
Salida : TextFile;
AppPath : string;
begin
AppPath := ExtractFilePath(Application.ExeName);
AssignFile(Salida,AppPath+'\'+'Copia.ini');
Rewrite(Salida);
Writeln(Salida,Path);
Writeln(Salida,Path2);
CloseFile(Salida);
Application.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if ((Path='') or (Path2='')) then
begin
ShowMessage('Error... No hay directorio Source/Target');
//no source directory
end
else
begin
Path := Edit1.Text;
Path2 := Edit2.Text;
if FileExists(Path2) then CopyRecursive(Path,Path2)
else
begin
MkDir(Path2);
CopyRecursive(Path,Path2);
end;
end;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
Path := ExtractFilePath(Application.ExeName);
SelectDirectory(Path, [sdAllowCreate,sdPerformCreate,sdPrompt],1000);
FindFile1.Path := Path;
ListBox1.Items := FindFile1.SearchForFiles;
Form1.Edit1.text := Path;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
Path2 := ExtractFilePath(Application.ExeName);
SelectDirectory(Path2, [sdAllowCreate,sdPerformCreate,sdPrompt],1000);
FindFile1.Path := Path2;
ListBox1.Items := FindFile1.SearchForFiles;
Form1.Edit2.text := Path2;
end;

procedure TForm1.FormCreate(Sender: TObject);

var
Entrada : TextFile;
AppPath : string;
InpSt,
OutSt : string;
begin
AppPath := ExtractFilePath(Application.ExeName);
if FileExists(AppPath+'\'+'Copia.ini') then
begin
AssignFile(Entrada, AppPath+'\'+'Copia.ini');
reset(Entrada);
readln(Entrada, InpSt);
readln(Entrada, OutSt);
Edit1.Text := InpSt;
Edit2.Text := OutSt;
Path := InpSt;
Path2 := OutSt;
CloseFile(Entrada);
end
else
begin
Edit1.Text := '';
Edit2.Text := '';
Path := '';
Path2 := '';
end;
end;

end.

این کد تست شده است.
شاد و پیروز باشید ...

Gladiator
پنج شنبه 15 اسفند 1381, 23:39 عصر
سلام دوست عزیز

من فرمایشات جنابعالی رو فردا صبح امتحان میکنم .

از پاسخ شما متشکرم .

گلادیاتور :wink:

nasr
سه شنبه 20 مرداد 1383, 08:37 صبح
سلام
من این کد را تست کردم ولی جواب نداد

لطفا راهنمایی کنید که چطور مراحل کپی کردن فولدر را نمایش داد حالا یا با Progress یا همون کپی کردن در ویندوز

ممنون

_alish_
سه شنبه 20 مرداد 1383, 09:14 صبح
دوست عزیز فکر کنم خیلی راحتتر باشد از دو تابع


CopyFile(فایل مبدا,فایل مقصد,آیا replace انجام شود یا نه);
MkDir(نام پوشه برای ساختن آن);

FileListBox1.Directory=MainFrm.exePath+Src;
FilesCount=FileListBox1.Count; برای پیدا کردن تعداد فایلها برای Max PrograssBar

داداش من با C++ Builder آنرا نوشتم راحت می تونی آنرا تغییر بدی
c_str معادل Pchar دلفی است

ProgressBar1->Max=FilesCount;
ProgressBar1->Min=0;
ProgressBar1->Position=0;

for (int i=0;i<FilesCount;i++)
{
FileListBox1->ItemIndex=i;
CopyFile(FileListBox1->FileName.c_str(),(Des+"\\"+FileListBox1->Items->Strings[FileListBox1->ItemIndex]).c_str(),True);

ProgressBar1->Position=i+1;;
}

nasr
سه شنبه 20 مرداد 1383, 10:56 صبح
ممنون