下面是一个简单的C程序来说明:
#include <windows.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
//MoveFile(argv[0], "dst.exe");
getchar();
return 0;
}从上面的代码中创建一个test.exe。
现在执行test.exe,test.exe由于getchar()而挂在那里,然后test.exe可以自由地剪切和粘贴这个exe。
但是当我取消对MoveFile(argv[0], "dst.exe");的评论时,我希望它能移动到dst.exe,结果发现它有一个dst.exe,而program.exe还在那里,就像CopyFile()一样。
据我所知,在Windows运行时,我可以重命名它,移动它,但不删除它,MoveFile()的行为是CopyFile()和DeleteFile()的组合
也可以从Microsoft MoveFileEx上看到这一点。
BOOL WINAPI MoveFileEx(
_In_ LPCTSTR lpExistingFileName,
_In_opt_ LPCTSTR lpNewFileName,
_In_ DWORD dwFlags
);dwFlags有一个选项MOVEFILE_COPY_ALLOWED
该文件将被移动到不同的卷中,该函数通过使用CopyFile和DeleteFile函数模拟移动。如果成功地将文件复制到另一个卷,并且无法删除原始文件,则函数将成功地保持源文件完整。此值不能与MOVEFILE_DELAY_UNTIL_REBOOT一起使用。
进一步证实了我的猜测,我用选项MoveFileEx()测试了MOVEFILE_REPLACE_EXISTING,重新编译了程序,运行了它,现在MoveFileEx()作为失败返回,甚至没有生成dst.exe。
但是我肯定可以在运行的时候剪切粘贴,MoveFileEx()应该这么做,为什么?
如果他们不能,我应该做什么使它就像剪切和粘贴。
发布于 2018-02-27 19:14:21
如果目标目标位于同一个卷上,MoveFile只需更新相应的目录条目。该文件的MFT记录没有更改,其索引保持不变,其内容未被触摸。因为文件根本不受影响,所以您可以在同一个目录(即重命名)中或在同一卷内移动它,即使该文件正在使用(注意:对于正在执行的文件,这是正确的;通常,只有当该文件用FILE_SHARE_DELETE打开时才是正确的)。
如果目标目录位于另一个卷上,则系统需要复制它(如果文件以独占模式打开,系统将失败),并在旧卷上删除它(如果使用该文件,系统将无条件地失败)。
剪切和粘贴可以在同一卷内工作,而不是在不同的卷上。原因是文件剪贴板操作使用与文本操作不同的技术。
当您选择一个文本并按下Ctrl时,文本字符串将被移动到一个分配的全局内存块中,并将该块传递给Windows。这个程序不再拥有它了。文本物理上位于Windows剪贴板中,您可以随意多次粘贴它。
当您按下文件上的Ctrl时,它不会移动到剪贴板。剪贴板将接收一个文件描述符,其中包含有关文件和请求的操作的信息(这种技术称为延迟呈现)。当您按Ctrl时,剪贴板将只要求对象所有者(即Windows )执行所请求的操作。资源管理器将使用完全相同的MoveFile来执行它。
注意,您只能粘贴一次剪切文件,因为第一个Ctrl将使剪贴板中的描述符失效。复制的文件可以粘贴几次。
https://stackoverflow.com/questions/49015860
复制相似问题