如何用DELPHI來實現從一個源目錄向二個目錄手复制文件? |
尚未結案
|
WWW999
一般會員 發表:18 回覆:19 積分:7 註冊:2005-09-26 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
|
WWW999
一般會員 發表:18 回覆:19 積分:7 註冊:2005-09-26 發送簡訊給我 |
看看下面這個討論吧~舉一隅以三隅返喔!
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 發送簡訊給我 |
|
WWW999
一般會員 發表:18 回覆:19 積分:7 註冊:2005-09-26 發送簡訊給我 |
引言:http://www.delphicorner.f9.co.uk/articles/misc4.htm 你的想法 OK, 讀入內存後, 可以控制 Stream.Position 來重複讀寫... 可是你有沒有想過... 萬一這個檔案有 1GB, 可是你的內存只有256MB 這個做法就出問題了... 多谢您的回答! 我对filelistbox控件了解很少,filelistbox是显示目录文件名的,我可不可以通过复制filelistbox中显示的文件名,来复制其所对应的文件,来达到我所需要复制的文件? |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
我對 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 發送簡訊給我 |
引言: 我對 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 發送簡訊給我 |
|
WWW999
一般會員 發表:18 回覆:19 積分:7 註冊:2005-09-26 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
WWW999
一般會員 發表:18 回覆:19 積分:7 註冊:2005-09-26 發送簡訊給我 |
引言: 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 發送簡訊給我 |
你用 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 發送簡訊給我 |
引言: 你用 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
檢測目錄只是預防萬一.... 如果您確定都存在當然可以不用檢測. 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 發送簡訊給我 |
引言: 檢測目錄只是預防萬一.... 如果您確定都存在當然可以不用檢測. 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;多謝您的回答,辛苦了,多謝! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |