1

我正在使用Directory.Move(oldDir, newDir)重命名目录。时不时地我会IOException说“访问路径'oldDir'被拒绝”。但是,如果我右键单击资源管理器中的目录,我可以重命名它而不会出现任何问题。

所以我的问题是:有没有其他方法可以在不使用的情况下重命名目录Directory.Move

我曾想过使用命令 shell ( Process.Start()),但这应该是我最后的做法。


更多详细信息

程序仍在运行,我得到了异常并且可以在 Windows 资源管理器中手动重命名它(右键单击 -> 重命名),而我的光标暂停在 catch 块中的断点上。我还尝试在 处设置断点Directory.Move,成功地在资源管理器中重命名目录(然后再次返回),跨过Directory.Move并最终进入catch (IOException)了。

这是我的代码

public bool Copy()
{
    string destPathRelease = ThisUser.DestPath + "\\Release";

    if (Directory.Exists(destPathRelease))
    {
        try
        {
            string newPath = ThisUser.DestPath + '\\' + (string.IsNullOrEmpty(currBuildLabel) ? ("Release" + '_' + DateTime.Now.ToString("yyyyMMdd_HHmmss")) : currBranchName) + '.' + currBuildLabel;
            Directory.Move(destPathRelease, newPath);
        }   
        catch (IOException)
        {
           // Breakpoint
        }
    }
}

如您所见,我刚刚输入了该方法。我以前从未接触过程序中的目录。

由于这种方式对我不起作用,我需要找到另一种方式来做到这一点。


解决方案

public bool Copy()
{
    string destPathRelease = ThisUser.DestPath + "\\Release";

    SHFILEOPSTRUCT struc = new SHFILEOPSTRUCT();

    struc.hNameMappings = IntPtr.Zero;
    struc.hwnd = IntPtr.Zero;
    struc.lpszProgressTitle = "Rename Release directory";
    struc.pFrom = destPathRelease + '\0';
    struc.pTo = ThisUser.DestPath + '\\' + (string.IsNullOrEmpty(this.currBuildLabel) ? ("Release" + '_' + DateTime.Now.ToString("yyyyMMdd_HHmmss")) : this.currBranchName) + '.' + this.currBuildLabel + '\0';
    struc.wFunc = FileFuncFlags.FO_RENAME;

    int ret = SHFileOperation(ref struc);
}

请注意,使用pTopFrom作为零分隔的双零终止字符串很重要。

4

2 回答 2

2

您可以尝试使用 P/Invoke 调用SHFileOperationAPI(或IFileOperation接口)。这是 Explorer 理论上使用的,因此它应该更直接地复制功能。

于 2013-05-15T09:49:35.273 回答
0

尝试使用 DirectoryInfo.MoveTo() 而不是 Directory.Move()。

另外,请检查这个旧的 SO 问题:它似乎没有您正在弄清楚的相同异常,但您可以找到一些好的建议。

于 2013-05-15T09:42:01.143 回答