好吧,我已经看到了很多关于这件事的问题,但仍然没有人回答我的问题。事实上,我看到的每一个问题都不同,这个访问的事情似乎真的是困扰程序员。
请查看代码:
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:usersvexedocumentsvisual studio 2010ProjectsDirectory_ClassDirectory_ClassProgram.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 -> 属性 -> 安全性 ->编辑 -> 添加 ->键入每个人(在输入要选择的对象名称中)-> ok -> 完全控制每个人。(我还看到我的用户帐户也有完全控制权)
任何提示将不胜感激
拒绝访问异常,但听起来文本文件正在使用中,无法移动,因为存在对文件的开放引用。
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();
}
}
首先,你应该使用 Path.Combine 而不是做字符串连接。
其次,堆栈跟踪不如引发的异常有用。
我想您的问题可能会通过这样做来解决:
Directory.Move(Dir1.FullName, Dir2.FullName);
如果这解决了它,那么问题出在您尝试将其移动到的 DIR1 子目录上。
作为调试,步骤应在两个文件夹上设置失败审核(在高级安全设置下)。只需将每个人都设置为审核所有故障,然后重试操作。根据您运行的操作系统版本,您应该获取用于操作的用户帐户以及缺少的权限。还要确保没有对文件夹设置拒绝权限,因为它们会覆盖所有其他权限。您需要查看安全事件日志。如果操作没有失败审核,则不是权限问题。
,Windows喜欢无缘无故地阻止目录的删除(重命名)。我确定它有一个,但我不在乎它是什么。我发现删除目录的内容,然后删除空文件夹每次都可以工作。它也适用于以下重命名。
我想出了这个,因为 windows 让我可以访问 FROM 目录的路径被拒绝。我只是在应用程序中重命名它,而不是真正移动位置。无论如何,根据上述信息,我想出了这个并且它有效。
public static void MoveTo_BruteItAsNecessary(this DirectoryInfo FROM, string TO, bool recycle = false)
{
try
{
FROM.MoveTo(TO);
}
catch (IOException ex)
{
if (ex.Contains($"Access to the path '{FROM.FullName}' is denied."))
{ // Contains checks the Message & InnerException.Message(s) recursively
System.IO.Directory.CreateDirectory(TO);
foreach (var dir in FROM.GetDirectories())
dir.MoveTo(Path.Combine(TO, dir.Name));
foreach (var file in FROM.GetFiles())
file.MoveTo(Path.Combine(TO, file.Name));
if (recycle)
FROM.Recycle();
else
FROM.Delete();
}
else
throw;
}
}