簡體   English   中英

Windows API MoveFile()無法運行exe

[英]Windows API MoveFile() not working for running exe

這是一個簡單的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,由於getchar()導致test.exe掛在那里,然后我可以自由地剪切和粘貼此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

如果要將文件移動到其他卷,則該函數通過使用CopyFile和DeleteFile函數模擬移動。 如果文件已成功復制到其他卷,並且無法刪除原始文件,則該函數將成功完成,而源文件將保持完整。 該值不能與MOVEFILE_DELAY_UNTIL_REBOOT一起使用。

進一步證實了我的猜測,我使用帶有選項MOVEFILE_REPLACE_EXISTING MoveFileEx()進行了測試,重新編譯了程序,運行它,現在MoveFileEx()只是作為失敗返回,甚至沒有生成dst.exe。

但是我絕對可以在運行時剪切並粘貼該exe, MoveFileEx()應該這樣做,為什么?

如果他們做不到,我應該怎么做才能像剪切和粘貼一樣

如果目標位置在同一卷上,則MoveFile僅更新相應的目錄條目。 該文件的MFT記錄未更改,其索引保持不變,其內容未觸及。 由於該文件完全不受影響,因此即使文件正在使用中,也可以將其移動到同一目錄(即重命名)或同一卷中(請注意:對於正在執行的文件,這是正確的;通常,這是正確的。僅當使用FILE_SHARE_DELETE打開文件時)。

如果目標目錄在另一個卷上,則系統需要復制它(如果以獨占模式打開文件將失敗),並在舊卷上將其刪除(如果正在使用文件,則將無條件失敗)。

剪切和粘貼可以在相同的體積內正常工作,而不能在不同的體積內工作。 原因是文件剪貼板操作使用的操作不同於文本操作。

當您選擇文本並按Ctrl-X時,文本字符串將移動到分配的全局內存塊中,並將該塊傳遞給Windows。 該程序不再擁有它。 文本實際上在Windows剪貼板中,您可以根據需要將其粘貼多次。

當您在文件上按Ctrl-X時,該文件不會移動到剪貼板。 剪貼板將收到一個文件描述符,其中包含有關文件和請求的操作的信息(此技術稱為延遲渲染 )。 當您按Ctrl-C時,剪貼板將簡單地要求對象所有者(即Windows資源管理器)執行所請求的操作。 資源管理器將使用完全相同的MoveFile執行該操作。

請注意,您只能粘貼一個剪切文件,因為第一個Ctrl-C會使剪貼板中的描述符無效。 復制的文件可以粘貼多次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM