C# - 重命名目录的方法

时间:2013-05-15 09:01:33

标签: c# directory rename ioexception

我正在使用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作为零分隔双零终止字符串非常重要。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

另外,请检查this old SO question:它似乎没有找到相同的例外情况,但你可以找到一些好的建议。