delphi 4 中如何进行文件copy, 送50大洋(50分)

  • 主题发起人 主题发起人 canna
  • 开始时间 开始时间
procedure Tmain_form.CopyFile(Sender: Tobject;Const InFile,OutFile : TFileName;sw : Boolean);
begin
AssignFile(FromF,InFile);
Reset(FromF,1);
AssignFile(ToF,OutFile);
ReWrite(ToF,1);
for_ii :=0;
Repeat
BlockRead(FromF,buf,SizeOf(Buf),NumRead);
if (for_ii = 0) and sw then
begin
Str_temp := OutFile;
while Pos('/',Str_temp)<>0 do
Str_temp := Copy(Str_temp,Pos('/',Str_temp)+1,Length(Str_temp)-Pos('/',Str_temp));
for for_ii := 1 to Length(Str_temp)-4 do
buf[4+for_ii]:=Str_temp[for_ii];
buf[5+for_ii]:=#0;
for_ii :=1;
end;
BlockWrite(ToF,buf,NumRead,NumWrite);
until (NumRead=0) or (NumWrite<>NumRead);
System.CloseFile(FromF);
System.CloseFile(ToF);
end;
本COPY函数还支持DBASE数据库的MDX拷贝,SW=TRUE;
 
function CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL;

lpExistingFileName: 源文件名
lpNewFileName: 目标文件名
bFailIfExists: 目标文件已经存在的处理, true-不复制返回失败, false-覆盖目标文件
 
来迟了。
用CopyFile是一个很方便快捷的办法。但在大量的时候不能出现类似
资源管理器那样的界面(有画的那个)。所以看你的需要可以选用API
函数SHFileOperration,C的定义:
WINSHELLAPI int WINAPI SHFileOperation(
LPSHFILEOPSTRUCT lpFileOp
);
在DELPHI中在USE中使用SHELLAPI即可用之。
具体用法您可以参见已答问题以节约积分。
参见:
<a href="dispq.asp?LID=75726">#1</a>
<a href="dispq.asp?LID=92662">#2</a>
<a href="dispq.asp?LID=104668">#3</a>
<a href="dispq.asp?LID=105927">#4</a>
看了这些问题应该会对该API有很大程度的了解。
 
Boolean CopyFile(
PChar lpExistingFileName,
PChar lpNewFileName,
Boolean bFailIfExists );//调用失败,返回false

BOOL CopyFileEx(
PChar lpExistingFileName,
PChar lpNewFileName,
LPPROGRESS_ROUTINE lpProgressRoutine, // 用于返回文件有关信息
LPVOID lpData, // LPPROGRESSROUTINE的参数
LPBOOL pbCancel, // 用于中途取消拷贝
DWORD dwCopyFlags // COPY_FILE_FAIL_IF_EXISTS 显然
// COPY_FILE_RESTARTABLE 拷贝失败可重新开始
);

具体可以参考Delphi提供的Win32 programmer's Reference/files/copying and moving files
 
1.sherman的答案有一个小小的问题,在源文件为只读属性将出错,解决办法如下:
在Reset源文件时先设置FileMode,其意义如下:
0 ReadOnly
1 WriteOnly
2 ReadWrite
既 FileMode := 0;
//注:实际使用最好加上出错处理。
2.用API或ShellAPI也是很好的解决办法;
3.用流
var
S, D: TFileStream;
begin
S := TFileStream.Create('Source', fmOpenRead);
try
D := TFileStream.Create('Dest', fmOpenWrite);
try
D.CopyFrom(S, S.Size);
finally
D.Free;
end;
finally
S.Free;
end
end;
 
本题的最好答案是3h的,送上50分,其他各位见谅了
巧合的是,本人在提出本题后,随即在中计报主页上看到恰是回答本题的
一篇文章,文中列举了5种方法,强力推荐的正是3h的方法。经本人测试,
确是如此,此法简单易用,与OS结合紧密。
谢谢大家!
 
后退
顶部