文件操作问题_简单_50分(50分)

  • 主题发起人 主题发起人 TIDE_LIU
  • 开始时间 开始时间
T

TIDE_LIU

Unregistered / Unconfirmed
GUEST, unregistred user!
谁能告诉我怎么通过 SaveDialog 将一个指定文件拷贝到保存目录下
并改名为保存的文件名!
 
问题问得不清楚。

文件拷贝大致步骤如下:

1)获取源文件名:lpszSrcFileName;

2)用 TSaveDialog 获取目标文件名:lpszDstFileName;
可以预设置文件名:在初始化TSaveDialog 时设置好
Filename 的值:
SaveDialog.FileName = lpszSrcFileName;

3)if SaveDialog.Execute() then
begin
lpszDstFileName := SaveDialog.FileName;
CopyFile(lpszSrcFileName, lpszDstFileName);
end;
 
procedure TForm1.FlatButton1Click(Sender: TObject);
var
DstFilename,SrcFilename:string;
begin
With SaveDialog do
begin
DefaultExt:='dat';
Filter:='数据库(*.dat)|*.dat';
InitialDir:='./data';
Title:='新建数据库';
end;
if SaveDialog.Execute() then
begin
SrcFilename:='../basic.bas';
DstFilename:=SaveDialog.FileName;
CopyFile(SrcFilename,DstFilename);
end;
end;

系统提示
incompatible types:'String' and 'PChar'

是什么问题?我声明的都是string啊!
 
哪来的 CopyFile 函数?
一般拷贝文件可以用 SHFileOperation 函数(WINAPI),还可以删除文件到回收站,功能
多多。
大致方法如下:

var
T:TSHFileOpStruct;
begin
With T do
Begin
Wnd:=0;
wFunc:=FO_Copy;
pFrom:=Pchar(SrcFilename);
pTo:=pchar(DstFilename);
fFlags:=FOF_NOCONFIRMATION+FOF_NOERRORUI+FOF_SILENT;
hNameMappings:=nil;
fAnyOperationsAborted:=False;
End;
SHFileOperation(T);
end;

至于:incompatible types:'String' and 'PChar'
你是从VB转过来的吧?

在 delphi 中 String 和 Pchar 都可以表示字符串,但是 pchar 不会自动分配存储单元。
需要你自已来分配,并且,Pchar 以#0字符作为结尾,它是C语言的标准。在与Windows打交
道的过程中你会经常遇到的。而 String 字符串头中存有字符长度。通常无需你手工分配存
储单元。
你可以采用function StrPCopy(Dest: PChar; const Source: string): PChar;函数将
String转化为Pchar,但是声明Pchar 时需要 pc:array[0..260] of char为它分配存储单元。
也可以直接用Pchar(string)的方法,就像我刚才用的那样。

By the way:
function StrPas(const Str: PChar): string;将pchar 转化为 string
 
CopyFile() 是一个 API 调用:

The CopyFile function copies an existing file to a new file.

BOOL CopyFile(

LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);


Parameters

lpExistingFileName

Points to a null-terminated string that specifies the name of an existing file.

lpNewFileName

Points to a null-terminated string that specifies the name of the new file.

bFailIfExists

Specifies how this operation is to proceed if a file of the same name as that specified by lpNewFileName already exists. If this parameter is TRUE and the new file already exists, the function fails. If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.

在Delphi 代码中,应该改为:

var
lpszSrcFileName: string;
lpszDstFileName: string;
begin
...
CopyFile(PChar(lpszSrcFileName), PChar(lpszDstFileName), False);
//如果不想覆盖现存文件, 则设置最后一个参数为 True;
end;
 
通过copyfile我已经成功完成操作!谢谢两位高手不吝赐教!以后还望多多指教!
 
后退
顶部