Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-重命名目录的方法_C#_Directory_Rename_Ioexception - Fatal编程技术网

C#-重命名目录的方法

C#-重命名目录的方法,c#,directory,rename,ioexception,C#,Directory,Rename,Ioexception,我正在使用Directory.Move(oldDir,newDir)重命名目录。我不时会收到一个IOException,上面说“访问路径'oldDir'被拒绝”。但是,如果我右键单击资源管理器中的目录,我可以重命名它,而不会出现任何问题 所以我的问题是:有没有其他方法可以在不使用目录的情况下重命名目录。移动 我曾想过使用命令shell(Process.Start()),但这应该是我做这件事的最后一种方法 进一步详情 程序仍在运行,我得到异常,可以在windows资源管理器中手动重命名它(右键单

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

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

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


进一步详情

程序仍在运行,我得到异常,可以在windows资源管理器中手动重命名它(右键单击->重命名),同时我的光标暂停在catch块的断点上。我还尝试在
目录中设置断点。Move
,成功地在explorer中重命名了目录(并再次返回),跨过
目录。Move
,再次进入
捕获(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);
}

请注意,使用
pTo
pFrom
作为以零分隔的双零结尾字符串非常重要。

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


此外,请检查:它似乎没有与您所发现的相同的异常,但您可以找到一些好的建议。

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

这可能是因为文件夹中的文件是只读的,并且具有一定的权限restricted@Habib不确定您想说什么,因为没有其他方法作为
目录。请在此线程中移动
@如果它们是只读的,为什么我可以在windows资源管理器中重命名它们@你们都读过完整的问题了吗?(没有任何恶意)@theknut你是从VisualStudio以管理员权限运行这段代码的吗?如果不是以管理员身份运行,请检查,并尝试向所有用户授予访问源文件夹和测试的完全权限。我的英雄!你怎么知道这些?只是好奇而已。。。