【问题标题】:Access To The Path ... Is Denied访问路径...被拒绝
【发布时间】:2012-08-17 12:34:18
【问题描述】:

好的,我已经看到很多关于这件事的问题,但仍然没有人回答我的问题。其实我看到的每一个问题都不尽相同,这个访问的东西真的是在困扰程序员。

请查看代码:

DirectoryInfo Dir1 = Directory.CreateDirectory(Desktop + "\\DIR1");
DirectoryInfo Dir2 = Directory.CreateDirectory(Desktop + "\\DIR2");
//* Lets Create a couple of SubDirs in DIR1
for (int i = 0; i < 5; i++)
{
  // this will create 5 SubDirs in DIR1, named Sub1, Sub2 ... Sub5.
  Dir1.CreateSubdirectory("Sub" + (i + 1).ToString()); 
  //* lets create 5 text files in each SubDir:
  for (int j = 0; j < 5; j++)
  {
    File.Create(Dir1.FullName + "\\Sub"+(i+1).ToString() + "\\text"+(j+1).ToString() + ".txt"); 
  }
}

//* Lets Move all what we created in DIR1 to DIR2 (THIS IS WHERE I'M GETTING THE EXCEPTION
Directory.Move(Dir1.FullName, Dir2.FullName + "\\DIR1");
// I also Tried Dir1.MoveTo(Dir2.FullName + "\\DIR1");

堆栈跟踪:

at System.IO.DirectoryInfo.MoveTo(String destDirName)
at Directory_Class.Program.Main(String[] args) in c:\users\vexe\documents\visual studio 2010\Projects\Directory_Class\Directory_Class\Program.cs:line 207
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

当然,我尝试了通常的做法:

DirectorySecurity DirSec = Dir1.GetAccessControl();
string user = Environment.UserName;
DirSec.ResetAccessRule(new FileSystemAccessRule(user, FileSystemRights.FullControl, AccessControlType.Allow));
Dir1.SetAccessControl(DirSec);

但一点都没变!

我还尝试手动更改权限,方法是右键单击 dir1 -> 属性 -> 安全 -> 编辑 -> 添加 -> 键入每个人(在输入对象名称中选择)-> 确定 -> 对每个人进行完全控制。 (我还看到我的用户帐户也拥有完全控制权)

任何提示将不胜感激

【问题讨论】:

  • 使用管理员角色尝试此代码..
  • @raman:你能解释一下吗,你的意思是像添加清单内容并以管理员身份运行应用程序?
  • 两个问题 - (a) 您是否尝试过使用 Windows 资源管理器手动创建这些子目录(并进行移动) - 那么您有什么问题吗? (b) 这段代码是如何执行的?我的意思是,这段代码是作为 exe 的一部分(在它自己的进程中)运行,还是作为 dll 的一部分(在某些主机进程中)运行,或者作为服务运行(在这种情况下,帐户是可配置的)?跨度>
  • @Pete:a-手动移动它们没有问题(通过 WE)b-此代码是 exe 的一部分(不是 dll 的一部分)它只是一个小型控制台应用程序的代码。跨度>
  • 另外,msdn 说如果目标目录已经存在,DirectoryInfo.MoveTo 和 Directory.Move 可以抛出异常。那么,您是否会通过预先手动创建 Dir2 来引起问题? (我必须承认你在做的事情在我看来是合理的)

标签: c# access-denied directory-permissions


【解决方案1】:

虽然这是一个拒绝访问异常,但听起来文本文件正在使用中并且无法移动,因为有对该文件的打开引用。

File.Create 方法返回一个 FileStream 对象,我认为在修改文件之前必须关闭/处置该对象。

为您的内部循环尝试以下操作:

  for (int j = 0; j < 5; j++)
  {
    using(var fs = File.Create(Dir1.FullName + "\\Sub"+(i+1).ToString() + "\\text"+(j+1).ToString() + ".txt"))
    {
        //fs.WriteByte(...);
        fs.Close();
    }
  }

【讨论】:

  • 谢谢大佬,解决了。但最奇怪的是我真的想过它,昨天真的编码了它并没有改变任何东西,我只是写信告诉你它不起作用,但是在我删除 Dir1 并重新创建所有内容之后,它工作:) 我想在删除所有内容后,我关闭了所有打开的句柄(流)
  • 顺便说一句。 fs.Close() 在这里是不必要的 - 你有 using 自动关闭和处理流的语句
【解决方案2】:

首先,您应该使用 Path.Combine 而不是进行字符串连接。
其次,堆栈跟踪不如抛出的异常有用。

我想你的问题可以通过这样做来解决:

Directory.Move(Dir1.FullName, Dir2.FullName);

如果这样可以解决问题,那么问题出在您尝试将其移动到的 DIR1 子目录中。

【讨论】:

  • 这使我找到了解决我遇到的问题的方法。我将完整的文件路径 (C:\pathname) 存储为字符串,并将其包装在新的 DirectoryInfo() 中并访问其 FullName 属性修复了我的访问被拒绝错误。
【解决方案3】:

作为调试步骤,您应该在两个文件夹上设置故障审核(在高级安全设置下)。只需设置每个人都审核所有故障,然后再次尝试您的操作。根据您正在运行的操作系统版本,您应该获取用于操作的用户帐户以及缺少的权限。还要确保没有在文件夹上设置拒绝权限,因为它们会覆盖所有其他权限。您将需要查看安全事件日志。如果操作没有失败审核,则不是权限问题。

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多