線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2052
推到 Plurk!
推到 Facebook!

如何用DELPHI來實現從一個源目錄向二個目錄手复制文件?

尚未結案
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-05 17:34:13 IP:222.160.xxx.xxx 未訂閱
如何用DELPHI來實現從一個源目錄向二個或三個目錄手复制文件? 能否給出個例子,多謝指教
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-06 21:43:50 IP:211.22.xxx.xxx 未訂閱
看看下面這個討論吧~舉一隅以三隅返喔!
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-09 12:04:38 IP:221.9.xxx.xxx 未訂閱
看看下面這個討論吧~舉一隅以三隅返喔! http://delphi.ktop.com.tw/topic.php?topic_id=21922 ---------------------------------------------- We will either find a way, or make one. -Hannibal -。 多謝指教。我是剛學delphi7,這個函數,對于我來說有些難了。 好多參數我不懂。 我也想自編寫一個函數,但我不知道怎么編寫。 這有個复制文件的例了。是用內存流 例子: 采用內存流,內存流可直接將文件數据存放到內存中,代碼簡單,速度很快。 procedure TForm1.Button4Click(Sender: TObject); var SourceFileName,DestFileName: String; begin with TMemoryStream.Create do try LoadFromFile(SourceFileName); SaveToFile(DestFileName); Finally Free; end; end; 我想把它編寫成我自己的函數 Function mycopyfile(SourceFile: AnsiString, FirstFile: AnsiString; SecondFile: AnsiString; ThirdFile : AnsiString): Boolean; SourceFile: AnsiString; /源文件 FirstFile: AnsiString;//每一目標 SecondFile: AnsiString;// 每二目標 ThirdFile : AnsiString;// 每三目標 這只是我的想法,可能不對,即然讀到內存中它沒有釋放,就能复制不知道我的想法對不對?讓您見笑了。 多謝您的回答,多謝指教。
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-09 12:50:47 IP:61.219.xxx.xxx 未訂閱
http://www.delphicorner.f9.co.uk/articles/misc4.htm 你的想法 OK, 讀入內存後, 可以控制 Stream.Position 來重複讀寫... 可是你有沒有想過... 萬一這個檔案有 1GB, 可是你的內存只有256MB 這個做法就出問題了...
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-10 12:45:10 IP:222.161.xxx.xxx 未訂閱
引言:
http://www.delphicorner.f9.co.uk/articles/misc4.htm 你的想法 OK, 讀入內存後, 可以控制 Stream.Position 來重複讀寫... 可是你有沒有想過... 萬一這個檔案有 1GB, 可是你的內存只有256MB 這個做法就出問題了... 多谢您的回答! 我对filelistbox控件了解很少,filelistbox是显示目录文件名的,我可不可以通过复制filelistbox中显示的文件名,来复制其所对应的文件,来达到我所需要复制的文件?
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-10 16:28:15 IP:210.68.xxx.xxx 未訂閱
我對 filelistbox 了解也不多....沒用過...可是    開新專案, 放下列元件     FileListBox1: TFileListBox; DirectoryListBox1: TDirectoryListBox; Button1: TButton; Memo1: TMemo;    將 DirectoryListBox1 的 FileList property 設為 FileListBox1 將 FileListBox1 的 MultiSelect property 設為 True    執行專案, 選擇目錄, FileListBox1, 也會跟著互動, 按 Ctrl 或 Shift 及滑鼠左鍵, 選擇檔案,    按 Button1 就會列出你選的檔案, 要 Copy 到哪裡 隨你喜歡...    
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FileCtrl, StdCtrls;    type
  TForm1 = class(TForm)
    FileListBox1: TFileListBox;
    DirectoryListBox1: TDirectoryListBox;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Disk:' FileListBox1.Drive);
  Memo1.Lines.Add('Directory:' FileListBox1.Directory);
  Memo1.Lines.Add('You selected following files');
  for i:=0 to FileListBox1.Items.Count-1 do
  begin
    if FileListBox1.Selected[i] then
      Memo1.Lines.Add(FileListBox1.Items[i]);
  end;
end;    end.
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-13 08:00:33 IP:222.160.xxx.xxx 未訂閱
引言: 我對 filelistbox 了解也不多....沒用過...可是 開新專案, 放下列元件 FileListBox1: TFileListBox; DirectoryListBox1: TDirectoryListBox; Button1: TButton; Memo1: TMemo; 將 DirectoryListBox1 的 FileList property 設為 FileListBox1 將 FileListBox1 的 MultiSelect property 設為 True 執行專案, 選擇目錄, FileListBox1, 也會跟著互動, 按 Ctrl 或 Shift 及滑鼠左鍵, 選擇檔案, 按 Button1 就會列出你選的檔案, 要 Copy 到哪裡 隨你喜歡... unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FileCtrl, StdCtrls; type TForm1 = class(TForm) FileListBox1: TFileListBox; DirectoryListBox1: TDirectoryListBox; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin Memo1.Lines.Clear; Memo1.Lines.Add('Disk:' FileListBox1.Drive); Memo1.Lines.Add('Directory:' FileListBox1.Directory); Memo1.Lines.Add('You selected following files'); for i:=0 to FileListBox1.Items.Count-1 do begin if FileListBox1.Selected[i] then Memo1.Lines.Add(FileListBox1.Items[i]); end; end; end.
多謝您的回答,謝謝。 老大,我的提問,又出了問題,抱歉! 我的想法是這樣的: 在form1中有4個edit控件兩個filelistbox 5個Button Edit1.text所顯示的目錄有*.rar;*.zip。我使用filelistbox1顯示*.rar Filelistbox2顯示*.zip 我需要將Edit1所指向的目錄下的文件*.rar,分別從Edit1复制到Edit2所指向的目錄下,再將Edit1所指向的目錄下文件*.rar,移動或复制到Edit3指向的目錄下,Edit3的目錄下已有k01---k12,但需要判斷,將Edit1所指向的目錄下的文件*.zip移動到edit4指向的目錄下,Edit4目錄下也存在k01---k12,也需要判斷。這些程序只用一個Button按鈕來完成。 現在我只能复制一個文件。 我想通過判斷filelistbox1所顯示的文件名,來執行循環复制。 或者通過判斷Edit1.text所指向的目錄是否存在,來執行循環复制,我也不知道能不能完成
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-13 09:37:44 IP:203.69.xxx.xxx 未訂閱
再將Edit1所指向的目錄下文件*.rar,移動或复制到Edit3指向的目錄下,Edit3的目錄下已有k01---k12,但需要判斷    要做怎樣的判斷? 月份?
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-14 12:39:56 IP:221.9.xxx.xxx 未訂閱
引言: 再將Edit1所指向的目錄下文件*.rar,移動或复制到Edit3指向的目錄下,Edit3的目錄下已有k01---k12,但需要判斷 要做怎樣的判斷? 月份?
多謝您的回答,多謝! 以上文件名是我舉的例子,現在我最需要解決的問題是如何從edit1向edit2 ,edit3,edit4 复制文件,我不知道如何解決這個問題。 文件還是:*.9012等。
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-14 13:19:45 IP:203.69.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=79489
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-14 18:23:57 IP:222.160.xxx.xxx 未訂閱
引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=79489
開新專案, 並在專案所在目錄建立 TestSrc, TestDest 資料夾 將你要 複製的檔案都放到 TestSrc 資料夾下 執行程式....and Good Luck!! unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI; type TForm1 = class(TForm) Button1: TButton; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var StrDirectory: String; StrDirectory_From: String; StrDirectory_To: String; function CheckAndCreateDirectory(DestDir: String): Boolean; begin Result := False; if not DirectoryExists(DestDir) then Result := ForceDirectories(DestDir) else Result := True; end; function CheckFileFormat(sFile: String): Boolean; begin //在這裡檢查檔案格式是不是符合需求 Result := True; end; procedure TForm1.FormShow(Sender: TObject); var tmpStr: String; i,j: Integer; begin StrDirectory := ExtractFileDir(ParamStr(0)); StrDirectory := IncludeTrailingBackslash(StrDirectory); StrDirectory_From := IncludeTrailingBackslash(StrDirectory 'TestSrc'); StrDirectory_To := IncludeTrailingBackslash(StrDirectory 'TestDest'); end; procedure TForm1.Button1Click(Sender: TObject); var SearchRec: TSearchRec; ExtName: String; mm,dd: String; toPath: String; fFrom,fTo: String; begin if DirectoryExists(StrDirectory_From) then begin //若指定目錄存在時才做 if FindFirst(StrDirectory_From '*.*', faAnyFile, SearchRec) = 0 then begin repeat if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin //如果是檔案才做 if (SearchRec.Attr and faArchive) = faArchive then begin // 檔案名稱符合規格才做 if CheckFileFormat(SearchRec.Name) then begin ExtName := ExtractFileExt(SearchRec.Name); mm := Copy(ExtName,2,2); // 取出月份 dd := Copy(ExtName,4,2); // 取出日期 if (''<>mm) and (''<>dd) then begin toPath := IncludeTrailingBackslash(StrDirectory_To 'k' mm) dd; // 檢查並建立目的目錄 if CheckAndCreateDirectory(toPath) then begin fFrom := StrDirectory_From SearchRec.Name; fTo := IncludeTrailingBackslash(toPath) SearchRec.Name; try CopyFile(PChar(fFrom), PChar(fTo), false); except end; end; end; end; end; end; until FindNext(SearchRec) <> 0; end; FindClose(SearchRec); end; end; end. 老大,多謝您的回答,多謝,您辛苦了。 兄弟始終有個想法,兄弟的底子太差了,有几段我能看懂,有的我看不懂,我始終在网上查閱資料,想看您懂寫的代碼,我想弄明白它。為了以后的學習。我手上也沒有什么書,真心的希望您能解釋一下代碼。兄弟實在是難以啟齒,沒有辦法不會就得問,請您見諒。 可發到我的郵箱:ghost2005ghost@163.com 多謝這些天來您的回答。多謝!多謝!
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-10-14 18:26:35 IP:219.134.xxx.xxx 未訂閱
你用 Delphi 的 Help,搜索:File management routines    里面有关于 File 的操作。    如果要复制 File ,可以考虑用 TFileStream,而非 TMemoryStream. 理由是,如果那个 File Size 有 1G 的话,TMemoryStream 会非常消耗 System memory.    demo:    
procedure copyfile(SourceFile,DestFile_1,DestFile_2:string);
var
  SrcFile,DestFile1,DestFile2:TFileStream;
begin
  SrcFile:=TFileStream.Create(SourceFile,fmOpenRead);
  DestFile1:=TFileStream.Create(DestFile_1,fmCreate);
  DestFile2:=TFileStream.Create(DestFile_2,fmCreate);
  try
    SrcFile.Position:=0;
    DestFile1.LoadFromStream(SrcFile);
    SrcFile.Position:=0;
    DestFile2.LoadFromStream(SrcFile);
  finally
    SrcFile.Free;
    DestFile1.Free;
    DestFile2.Free;
  end;
end;
用上面的方式,可以把一个 File 拷贝到两个地方去。
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-10-15 18:07:46 IP:222.161.xxx.xxx 未訂閱
引言: 你用 Delphi 的 Help,搜索:File management routines 里面有关于 File 的操作。 如果要复制 File ,可以考虑用 TFileStream,而非 TMemoryStream. 理由是,如果那个 File Size 有 1G 的话,TMemoryStream 会非常消耗 System memory. demo: procedure copyfile(SourceFile,DestFile_1,DestFile_2:string); var SrcFile,DestFile1,DestFile2:TFileStream; begin SrcFile:=TFileStream.Create(SourceFile,fmOpenRead); DestFile1:=TFileStream.Create(DestFile_1,fmCreate); DestFile2:=TFileStream.Create(DestFile_2,fmCreate); try SrcFile.Position:=0; DestFile1.LoadFromStream(SrcFile); SrcFile.Position:=0; DestFile2.LoadFromStream(SrcFile); finally SrcFile.Free; DestFile1.Free; DestFile2.Free; end; end; 用上面的方式,可以把一个 File 拷贝到两个地方去。 多谢您的回答。
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-10-16 01:47:07 IP:61.219.xxx.xxx 未訂閱
var
  StrDirectory: String;      // 包含 k1-k12 的目錄
  StrDirectory_From: String; // 來源目錄
  StrDirectory_To: String;   // 目的目錄    // 這個函數會檢查目錄 DestDir 是否存在, 如果不存在就建立他
function CheckAndCreateDirectory(DestDir: String): Boolean;
begin
  Result := False;
  if not DirectoryExists(DestDir) then
    // 如果 DestDir 不存在就建立他, 可能會失敗(也許不小心選到光碟上的目錄)
    Result := ForceDirectories(DestDir)
  else
    Result := True;
end;    function CheckFileFormat(sFile: String): Boolean;
begin
  // 在這裡檢查檔案格式是不是符合需求
  // 就是檢查 sFile 是不是 *.mmdd 的檔案
  Result := True;
end;    procedure TForm1.FormShow(Sender: TObject);
var
  tmpStr: String;
  i,j: Integer;
begin
  // 取出目前目錄
  StrDirectory := ExtractFileDir(ParamStr(0));
  // 目錄最後 補上ㄧ個 "\"
  StrDirectory := IncludeTrailingBackslash(StrDirectory);
  // 以目前 "目錄\TestSrc\" 做來源目錄
  StrDirectory_From := IncludeTrailingBackslash(StrDirectory 'TestSrc');
  // 以目前 "目錄\TestDest\" 做包含 K1-K12 的目錄
  StrDirectory_To := IncludeTrailingBackslash(StrDirectory 'TestDest');
end;
還有哪一段看不懂?
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-10-16 09:22:17 IP:222.161.xxx.xxx 未訂閱
引言: var StrDirectory: String; // 包含 k1-k12 的目錄 StrDirectory_From: String; // 來源目錄 StrDirectory_To: String; // 目的目錄 // 這個函數會檢查目錄 DestDir 是否存在, 如果不存在就建立他 function CheckAndCreateDirectory(DestDir: String): Boolean; begin Result := False; if not DirectoryExists(DestDir) then // 如果 DestDir 不存在就建立他, 可能會失敗(也許不小心選到光碟上的目錄) Result := ForceDirectories(DestDir) else Result := True; end; function CheckFileFormat(sFile: String): Boolean; begin // 在這裡檢查檔案格式是不是符合需求 // 就是檢查 sFile 是不是 *.mmdd 的檔案 Result := True; end; procedure TForm1.FormShow(Sender: TObject); var tmpStr: String; i,j: Integer; begin // 取出目前目錄 StrDirectory := ExtractFileDir(ParamStr(0)); // 目錄最後 補上ㄧ個 "\" StrDirectory := IncludeTrailingBackslash(StrDirectory); // 以目前 "目錄\TestSrc\" 做來源目錄 StrDirectory_From := IncludeTrailingBackslash(StrDirectory 'TestSrc'); // 以目前 "目錄\TestDest\" 做包含 K1-K12 的目錄 StrDirectory_To := IncludeTrailingBackslash(StrDirectory 'TestDest'); end; 還有哪一段看不懂?
多謝您的回答,辛苦了。 SearchRec.Name:代表的是什么? 如果目地目錄已存在,還需要檢測嗎?
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-10-16 18:38:14 IP:61.219.xxx.xxx 未訂閱
檢測目錄只是預防萬一.... 如果您確定都存在當然可以不用檢測.    FindFirst 如果有找到目錄或檔案就會傳回 True, 並將目錄或檔案的資料放在 SearchRec 資料結構內.    SearchRec 宣告為 TSearchRec, 您可以在 Help 中查到....
On Windows:
   type 
   TSearchRec = record
    Time: Integer;
    Size: Integer;
    Attr: Integer;
    Name: TFileName;
    ExcludeAttr: Integer;
    FindHandle: THandle;
    FindData: TWin32FindData;
end;
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-10-17 12:05:50 IP:222.161.xxx.xxx 未訂閱
引言: 檢測目錄只是預防萬一.... 如果您確定都存在當然可以不用檢測. FindFirst 如果有找到目錄或檔案就會傳回 True, 並將目錄或檔案的資料放在 SearchRec 資料結構內. SearchRec 宣告為 TSearchRec, 您可以在 Help 中查到.... On Windows: type TSearchRec = record Time: Integer; Size: Integer; Attr: Integer; Name: TFileName; ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData; end;
多謝您的回答,辛苦了,多謝!
系統時間:2024-05-19 17:11:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!