请教:为什么ShFileOperation函数不能复制文件??(100分)

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

tgangt

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:<br>&nbsp; 我编了一个小程序,调用ShFileOperation函数,内容如下:<br>function TForm1.Win_Copy(fFROM,fTO:String):boolean;<br>var FData : TShFileOpStruct;<br>begin<br>&nbsp; &nbsp;Fdata.pFrom := PChar(fFrom);<br>&nbsp; &nbsp;fdata.pTo := PChar(fTo);<br>&nbsp; &nbsp;fdata.wFunc := FO_COPY ;<br>&nbsp; &nbsp;FData.Wnd := application.Handle ;<br>&nbsp; &nbsp;fData.lpszProgressTitle := '正在复制';<br>&nbsp; &nbsp;fData.fFlags := FOF_ALLOWUNDO OR FOF_NOCONFIRMMKDIR or FOF_SILENT ;<br>&nbsp; &nbsp;result:=ShFileOperation( FData ) = 0 &nbsp;;<br>end;<br>但我复制一个文件时,会出现“无法复制文件:文件系统错误(1026)”<br>不知道为什么??
 
<br>fFrom 和 fTo 必须是用 2个 0 结束的,改成下面的:<br>&nbsp; &nbsp;fTo:=fTo+#0#0;<br>&nbsp; &nbsp;fFrom:=fFrom+#0#0;<br>&nbsp; &nbsp;Fdata.pFrom := PChar(fFrom);<br>&nbsp; &nbsp;fdata.pTo := PChar(fTo);<br>
 
这个,好象不完全是Pipi.说的情况吧?<br>如果只拷一个文件的话,好象不用加#0来做分隔吧?<br><br>是不是你要拷的文件根本不存在或是正在使用中?<br>比如你要拷的是数据库表,但表文件正好打开了?
 
不!只有一个文件名字也要用两个0结束,因为系统不知道你究竟有几个文件名在里面,所以<br>固定是碰到2个0才结束的
 
接受答案了.
 
这个,还是不完全同意Pipi.的看法,<br>我试了一下,如果只拷贝一个文件的话,<br>起码在2000下是不用加#0地。也就是说,上面的tgangt的程序在2000下是可以成功地。<br><br>还有就是 &nbsp;<br>&nbsp; &nbsp;fTo:=fTo+#0#0;<br>&nbsp; &nbsp;fFrom:=fFrom+#0#0;<br>&nbsp; &nbsp;Fdata.pFrom := PChar(fFrom);<br>&nbsp; &nbsp;fdata.pTo := PChar(fTo);<br>好象只用加一个#0就可以了,后面直接PChar自己又会加#0的。<br><br><br><br>
 
如果你用cpu窗口看的话,因为内存的很多地方都是0<br>所以你没有加上足够多的0的话,虽然你可能开发的时候不出问题,那只是运气好<br>碰巧你的字符串后面没用到的内存刚好是0,给系统能结束,但是不等于它就是合法的,<br>可能在别的系统、或者在下一次编译之后,内存分配到不同的地方,后面就没有0了<br>至于说是不是原来已经有一个0,再加一个0就可以了?我一贯小心谨慎,我加了2个0,<br>那肯定就合法了,它要多出1个0来也没什么影响,但是万一不是你想象的,少了1个0,就会出错
 
为什么要2个0,SHFileOperation 是可以支持一次多个文件操作的,比如<br>fFrom:='file1'#0'file2'#0'file3'#0#0<br>这个函数并没有地方告诉他fFrom总共带了几个文件,它是判断,出现了连续的2个0,<br>后面就没有了。所以即使是1个文件,也要用2个0来结束,你看看msdn的例子也是这样
 
呵呵,看来是我一贯运气好啊!怎么不去抽奖呢? [:D]<br>拷一个文件我一直不加#0,拷一堆文件时到加是#0分隔了,<br>一直没出什么问题,今天看了一下MSDN,果然和Pipi.说得一样,汗...<br>改代码ing ... 还好用得比较少。 :)
 
后退
顶部