我正在使用Directory.Move(oldDir, newDir)
重命名目录。我不时地得到一个IOException
说“访问路径”oldDir“被拒绝”。但是,如果我右键单击资源管理器中的目录,我可以重命名它,没有任何问题。怎么样?我怎样才能让它发挥作用?
修改
程序仍在运行,我得到异常,并且可以在断点处暂停光标时手动重命名。我还尝试在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
}
}
}
}
如您所见,我刚刚输入了该方法。我以前从未触及过程序中的目录。还有其他方法可以重命名目录吗?
答案 0 :(得分:3)
如果没有看到更多代码我会说您的应用程序正在锁定目录中的文件,您可以使用Process explorer
查看正在访问目录的内容从简介到流程资源管理器:
有没有想过哪个程序有特定的文件或目录打开?现在你可以找到。 Process Explorer显示有关已打开或加载哪些句柄和DLL进程的信息。
也许值得确保没有别的东西是从/到该目录复制文件 - 例如Dropbox的。我最近遇到了一个问题,即visual studio会因文件锁定而停止调试 - 最后它会在暂时锁定文件的驱动器上编制索引。进程资源管理器只是部分帮助,因为它显示'system'具有文件锁定而不是另一个应用程序。
答案 1 :(得分:0)
您需要检查运行.net应用程序的用户。它没有权限执行重命名。
这是:
答案 2 :(得分:0)
如果目标目录的父目录不存在,则Directory.Move
操作失败。我一直在试图找出与此大致相似的东西。
答案 3 :(得分: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;
}
}