2012-08-17 212 views
3

好的,我已经看到了很多关于这个问题的问题,但仍然没有人回答我的问题。实际上,我看到的每个问题都与另一个不同,这种访问方式似乎确实让程序员很烦恼。访问路径...被拒绝

请查看代码:

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->属性 - >安全 - >编辑 - >添加 - >键入每个人(在输入对象名称来选择) - >确定 - >全控制给每个人手动更改权限。 (我也看到了我的用户帐户有完全控制权以及)

任何提示将深表赞赏

+0

使用管理员角色试用此代码.. – 2012-08-17 12:37:09

+0

@raman:你能解释一下吗,你的意思是像添加清单,并以管理员身份运行应用程序? – vexe 2012-08-17 12:47:57

+0

有两个问题 - (a)您是否尝试过使用Windows资源管理器手动创建这些子目录(并执行此操作) - 然后您是否遇到任何问题?和(b)这段代码是如何执行的?我的意思是,这段代码是作为exe的一部分(在它自己的进程中)运行,还是作为dll的一部分(在某些主机进程中)运行,也许作为一种服务(在这种情况下,帐户是可配置的)? – PeteH 2012-08-17 12:52:25

回答

3

虽然这是一个拒绝访问异常,这听起来像文本文件正在使用,不能因为移动有对该文件的开放引用。

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(); 
    } 
    } 
+0

谢谢你,它解决了它。但最奇怪的是我实际上已经想过了,并且实际上是在昨天对它进行了编码,并且它没有改变任何内容,而我只是写信告诉你它并不奏效,但是在我删除Dir1并重新创建了所有内容后,它工作:) 我想删除一切后,我关闭了所有打开的句柄(流) – vexe 2012-08-17 13:14:55

+1

顺便说一句。 'fs.Close()'在这里是不必要的 - 你有'using'语句自动关闭并处理一个流 – Nickon 2013-11-28 12:53:36

1

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

我想象你的问题可能是,虽然这样做是固定的:

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

问题能否解决,那么问题是你要移动它到DIR1的子目录。

+0

这导致我解决了一个我遇到的问题。我有一个完整的文件路径(C:\ pathname)存储为一个字符串,并将其包装在一个新的DirectoryInfo()中,并访问其FullName属性修复了我的拒绝访问错误。 – b0redom 2015-03-02 17:08:32

0

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