错误:Delphi 7 CopyFile函数中的文件名目录名或卷标语法不正确
我想使用CopyFile功能将文件从一个文件夹复制到另一个文件夹。源文件路径存储在名为“itemsDB”的ClientDataSet中。代码是:错误:Delphi 7 CopyFile函数中的文件名目录名或卷标语法不正确,delphi,tclientdataset,file-copying,Delphi,Tclientdataset,File Copying,我想使用CopyFile功能将文件从一个文件夹复制到另一个文件夹。源文件路径存储在名为“itemsDB”的ClientDataSet中。代码是: Var Source, Dest : String; Begin itemsDB.First; While Not itemsDB.EOF do Begin Source := itemsDB.FieldValues['FileN']; Dest := 'C:\NewDir\'+ExtractFileName(Source)
Var Source, Dest : String;
Begin
itemsDB.First;
While Not itemsDB.EOF do
Begin
Source := itemsDB.FieldValues['FileN'];
Dest := 'C:\NewDir\'+ExtractFileName(Source);
if Not CopyFile(PChar(Source), PChar(Dest), False) then
Showmessage(SysErrorMessage(getlasterror()));
itemsDB.Next;
end;
end
当我执行代码时,会收到错误消息“文件名目录名或卷标语法不正确”。
我验证了数据集中的所有文件路径,它们是正确的。
在我的示例中,我的clientdataset包含两个JPG图像“c:\test1.JPG”和“c:\test2.JPG”
当我尝试source:=“c:\test1.jpg”时,它工作得非常好,但当我从clientdataset获取它时,它失败了
提前感谢您能否记录FileName和Dest的值,以准确查看传递给CopyFile的内容 另外,看起来您使用的不是源代码,而是文件名,在您发布的代码片段中似乎没有定义文件名。您想使用源代码吗?更新的答案。。。 (如……) 在注释字段中进行了一些讨论后,发现错误是
源
字符串中的无效尾随空格字符
如果FileN
字段定义为FixedChar
字符串字段,则Source
将包含这些尾随空格
在对象检查器中将
FixedChar
设置为False
,或使用Source:=Trim(Source)删除尾随空格字符代码>如果在源代码中有一个:
作为路径的一部分,则会出现此错误。
您可能有一个当然像c:\
但是c:\Test:Folder\Text.txt
会给您错误文件名、目录名或卷标语法不正确
编辑1
另一个无效字符是?。我不知道您是否在Delphi中使用Unicode,或者您的数据源是否是Unicode,但有时未知的Unicode字符会被翻译成?
编辑2
source中驱动器号前的空格也会出现同样的错误。此错误是发生在source还是Dest中?@riad:赋值后“source”的内容是什么?您可以发布一个导致错误消息的示例吗?它不应该是CopyFile(PChar(源)、PChar(Dest)、False)
?哪里定义了FileName
?错误发生在源文件而非目标文件中Orry my error,它是“CopyFile(PChar(source),PChar(Dest),False)”而不是文件名Orry my error,它是“CopyFile(PChar(source),PChar(Dest),False)”,数据集中的文件是图像的简单路径,如“c:\test1.jpg,c:\test2.jpg…只有在源文件不存在(或者您没有读取它的权限)或者目标目录不存在(或者您没有写入它的权限)的情况下,CopyFile才会真正失败。尝试记录您正在传递的实际值并从命令promptI执行copy
命令。我尝试了fileExists函数,它说“源不存在”,但文件在那里。当我尝试source:=“c:\test.jpg”时,它可以工作,但当我从clientdataset获取它时,它失败了ShowMessage('-->'+Source+'好的,我试过trim(Source),现在我遇到了另一个错误,它说:“找不到指定的路径”,而fixedchar是false。它可以工作,你是对的,问题出在源变量末尾的空格中,trim(Source)解决了问题调试应用程序,并在复制失败时查看源包含什么。我放了一条showmessage(Source)在循环内部,它显示了正确的路径c:\test1.jpg和c:\test2.jpg,非常奇怪