【问题标题】:Win32 API for rename a file in CWin32 API 用于在 C 中重命名文件
【发布时间】:2010-12-22 18:14:01
【问题描述】:

如果源目录和目标目录,MoveFile 实际上会将源文件复制到目标文件中,这意味着我最终会看到两个文件。

这是实现重命名的最佳方式吗?

【问题讨论】:

  • 你到底是什么意思? MoveFileExMOVEFILE_COPY_ALLOWED 不会给你两个文件 - 如果两个文件在不同的卷上,它会调用 CopyFile 然后 DeleteFile。
  • 我想我见过 MoveFile() 会执行 CopyFile() + DeleteFile() 的实例,但源文件仍被某人锁定,因此其状态将设置为 Delete Pending;然后当它被解锁时它神奇地消失了。或者也许我正在编造这个;不记得了。
  • 如果程序崩溃或断电,非原子移动(AKA 复制删除)可能会导致不一致。

标签: c winapi file-rename


【解决方案1】:

MoveFile 函数确实是您想要的。来自文档:

MoveFile 函数将移动(重命名)同一目录中或跨目录的文件或目录(包括其子目录)。

如果源位置和目标位置都在同一个卷上,则执行原子重命名操作。如果它们位于不同的卷上,则改为执行复制/删除操作(这是您能做的最好的)。

【讨论】:

  • MoveFileEx 默认只移动,它不会不复制,除非你传递MOVEFILE_COPY_ALLOWED 标志。
【解决方案2】:

试试

#include <stdio.h>

int Result = rename( oldname , newname );

if (Result)
   // "Error occurred." );
else
   // "File was successfully renamed!";

【讨论】:

    【解决方案3】:

    您的代码是什么样的?我有这个:

    if(MoveFile(_T("c:\\hold\\source"),_T("c:\\hold\\dest")))
    {
        printf("succeeded\n");
    }else
    {
        printf("Error %d\n",GetLastError());
    }
    

    而且它不会留下源头。

    【讨论】:

    • 这在我加入后有效:#include &lt;Windows.h&gt; #include &lt;winbase.h&gt; #include &lt;Tchar.h&gt;
    【解决方案4】:

    您可能想尝试在不指定 MOVEFILE_COPY_ALLOWED 的情况下使用 MoveFileEx() API,看看这是否提供了您正在寻找的行为。

    【讨论】:

    • 未指定 MOVEFILE_COPY_ALLOWED 仅表示跨卷移动将失败。这不是 OP 想要的。 “通过复制/删除模拟”是指跨卷移动不能像同卷移动那样通过简单地重写磁盘元数据来执行。
    • @David:我认为 OP 要求重命名操作只有通过仅更改文件元数据而不是复制/删除重命名模拟来完成才能成功(我想问题是我有点不清楚)。
    • 公平地说,这个问题的提出非常糟糕,因此,通常情况下,人们只能猜测意图是什么。也许你的解释是正确的!
    猜你喜欢
    • 2015-01-24
    • 2011-02-08
    • 2011-03-14
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多