首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows ()不适用于运行exe

Windows ()不适用于运行exe
EN

Stack Overflow用户
提问于 2018-02-27 18:46:29
回答 1查看 857关注 0票数 3

下面是一个简单的C程序来说明:

代码语言:javascript
复制
#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上看到这一点。

代码语言:javascript
复制
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()应该这么做,为什么?

如果他们不能,我应该做什么使它就像剪切和粘贴

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-27 19:14:21

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

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

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

当您选择一个文本并按下Ctrl时,文本字符串将被移动到一个分配的全局内存块中,并将该块传递给Windows。这个程序不再拥有它了。文本物理上位于Windows剪贴板中,您可以随意多次粘贴它。

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

注意,您只能粘贴一次剪切文件,因为第一个Ctrl将使剪贴板中的描述符失效。复制的文件可以粘贴几次。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49015860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档