2

我正在使用Directory.Move(oldDir, newDir)重命名目录。时不时我会听到“拒绝访问路径“oldDir”IOException的说法” 。但是,如果我右键单击资源管理器中的目录,我可以重命名它而不会出现任何问题。怎么样,我怎样才能让它工作?

编辑

该程序仍在运行,我得到了异常并且可以在我的光标暂停在断点上时手动重命名它。我还尝试在 处设置断点Directory.Move,成功地在资源管理器中重命名目录(然后再次返回),跨过Directory.Move并最终进入catch (IOException)了。所以我不明白为什么我的程序应该锁定目录。一定有别的东西。

有任何想法吗?

编辑 2

这是我的代码

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
            }
        }
    }
}

如您所见,我刚刚输入了该方法。我以前从未接触过程序中的目录。还有另一种重命名目录的方法吗?

4

4 回答 4

3

在没有看到更多代码的情况下,我会说您的应用程序正在锁定目录中的文件,您可以使用Process explorer查看正在访问目录的内容

从介绍到流程资源管理器:

有没有想过哪个程序打开了特定的文件或目录?现在你可以找出答案了。Process Explorer 向您显示有关哪些句柄和 DLL 进程已打开或加载的信息。

确保没有其他东西从该目录复制文件/向该目录复制文件可能也是值得的 - 例如保管箱。我最近遇到了一个问题,Visual Studio 由于文件锁定而停止调试 - 最后它在临时锁定文件的驱动器上建立索引。进程资源管理器仅部分帮助它显示“系统”具有文件锁定而不是另一个应用程序。

于 2013-04-29T13:53:26.543 回答
0

您需要检查正在运行 .net 应用程序的用户。它没有执行重命名的正确权限。

这是:

  • 运行 Web 应用程序的应用程序池的用户
  • 控制台/winforms 应用程序的记录应用程序
  • 为服务或计划任务配置的用户
于 2013-04-29T13:48:43.357 回答
0

这是在跨平台的 C# .NET Core 中重命名目录的最安全方法。

    /// <summary>
    /// Renames a folder name
    /// </summary>
    /// <param name="directory">The full directory of the folder</param>
    /// <param name="newFolderName">New name of the folder</param>
    /// <returns>Returns true if rename is successfull</returns>
    public static bool RenameFolder(string directory, string newFolderName)
    {
        try
        {
            if (string.IsNullOrWhiteSpace(directory) ||
                string.IsNullOrWhiteSpace(newFolderName))
            {
                return false;
            }


            var oldDirectory = new DirectoryInfo(directory);

            if (!oldDirectory.Exists)
            {
                return false;
            }

            if (string.Equals(oldDirectory.Name, newFolderName, StringComparison.OrdinalIgnoreCase))
            {
                //new folder name is the same with the old one.
                return false;
            }

            string newDirectory;

            if (oldDirectory.Parent == null)
            {
                //root directory
                newDirectory = Path.Combine(directory, newFolderName);
            }
            else
            {
                newDirectory = Path.Combine(oldDirectory.Parent.FullName, newFolderName);
            }

            if (Directory.Exists(newDirectory))
            {
                //target directory already exists
                return false;
            }

            oldDirectory.MoveTo(newDirectory);

            return true;
        }
        catch
        {
            //ignored
            return false;
        }
    }
于 2020-04-02T20:49:52.383 回答
0

如果目标目录的父目录不存在,则Directory.Move操作失败。我一直在试图找出与此大致相似的东西。

于 2019-12-10T15:28:09.557 回答