错误:Delphi 7 CopyFile函数中的文件名目录名或卷标语法不正确

错误: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)

我想使用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);
    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,非常奇怪