gpt4 book ai didi

c - Windows API MoveFile() 不适用于运行 exe

转载 作者:可可西里 更新时间:2023-11-01 11:11:23 27 4
gpt4 key购买 nike

这里有一个简单的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() 卡在那里,然后我可以自由地剪切和粘贴这个 exe。

但是当我取消对 MoveFile(argv[0], "dst.exe"); 的注释时,我希望它可以将自己移动到 dst.exe,结果它有一个 dst。 exe,而 program.exe 仍然存在,就像 CopyFile() 一样。

据我所知,在 Windows 中,当 exe 运行时我可以重命名它,移动它,但不能删除它,MoveFile() 的行为就像 CopyFile() 的组合DeleteFile()

也可以从 Microsoft 文档中查看 MoveFileEx .

BOOL WINAPI MoveFileEx(
_In_ LPCTSTR lpExistingFileName,
_In_opt_ LPCTSTR lpNewFileName,
_In_ DWORD dwFlags
);

dwFlags 有一个选项 MOVEFILE_COPY_ALLOWED

the file is to be moved to a different volume, the function simulates the move by using the CopyFile and DeleteFile functions. If the file is successfully copied to a different volume and the original file is unable to be deleted, the function succeeds leaving the source file intact. This value cannot be used with MOVEFILE_DELAY_UNTIL_REBOOT.

进一步证实了我的猜测,我用 MoveFileEx() 和选项 MOVEFILE_REPLACE_EXISTING 进行了测试,重新编译程序,运行它,现在 MoveFileEx() 刚刚返回失败,甚至没有生成 dst.exe。

但我绝对可以在运行时剪切和粘贴那个 exe,MoveFileEx() 应该这样做,为什么???

如果他们做不到,我应该怎么做才能让它像剪切和粘贴一样。

最佳答案

如果目标位置在同一个卷上,MoveFile 只会更新相应的目录条目。文件的 MFT 记录没有改变,它的索引保持不变,它的内容没有被触及。因为文件根本不受影响,所以即使文件正在使用中,您也可以在同一目录(即重命名)或同一卷内移动它(注意:对于正在执行的文件是这样;一般来说,这是真的仅当使用 FILE_SHARE_DELETE 打开文件时)。

如果目标目录在另一个卷上,系统需要复制它(如果文件以独占模式打开会失败)并在旧卷上删除它(如果文件正在使用会无条件失败)。

剪切和粘贴在同一卷内可以正常工作,但在不同卷上则不行。原因是文件剪贴板操作使用了与文本剪贴板操作不同的技术。

当您选择一个文本并按下 Ctrl-X 时,该文本字符串被移动到分配的全局内存块中,该 block 被传递给 Windows。该程序不再拥有它。文本实际位于 Windows 剪贴板中,您可以根据需要多次粘贴。

当您在文件上按 Ctrl-X 时,它不会移动到剪贴板。剪贴板将收到一个文件描述符,其中包含有关文件和请求的操作的信息(此技术称为延迟渲染)。当您按下 Ctrl-C 时,剪贴板将只要求对象所有者(即 Windows 资源管理器)执行请求的操作。 Explorer 将使用完全相同的 MoveFile 执行它。

请注意,您只能粘贴一次剪切文件,因为第一个 Ctrl-C 会使剪贴板中的描述符无效。复制的文件可以多次粘贴。

关于c - Windows API MoveFile() 不适用于运行 exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49015860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com