正如 Damien_The_Unbeliever 所提到的,如果我们查看 FILE_ATTRIBUTE_READONLY 的 Win32 API,它会提到:
目录不支持此属性。
另请参阅:http: //go.microsoft.com/fwlink/p/ ?linkid=125896
因此,您似乎确实可以使用 win32 或资源管理器简单地删除此类目录。然而,.NET 似乎会在删除目录之前检查它们的标志。例如,您可以在 Directory.Delete 上使用 DotPeek 或 Reflector 来查看这一点。这就是导致您的“访问被拒绝”错误的原因。
编辑:
我对此进行了更详细的研究,似乎不是 .NET 引发了拒绝访问错误。考虑以下测试代码:
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace ReadOnlyDirTest
{
class Program
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false)]
extern static bool RemoveDirectory(string path);
static String CreateTempDir()
{
String tempDir;
do
{
tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
} while (Directory.Exists(tempDir));
Directory.CreateDirectory(tempDir);
return tempDir;
}
static void Main(string[] args)
{
var tempDir = CreateTempDir();
// Set readonly.
new DirectoryInfo(tempDir).Attributes |= FileAttributes.ReadOnly;
try
{
Directory.Delete(tempDir);
}
catch (Exception e)
{
Console.WriteLine("Directory.Delete: " + e.Message);
}
if (!Directory.Exists(tempDir))
Console.WriteLine("Directory.Delete deleted directory");
try
{
if (!RemoveDirectory(tempDir))
Console.WriteLine("RemoveDirectory Win32 error: " + Marshal.GetLastWin32Error().ToString());
}
catch (Exception e)
{
Console.WriteLine("RemoveDirectory: " + e.Message);
}
if (!Directory.Exists(tempDir))
Console.WriteLine("RemoveDirectory deleted directory");
// Try again without readonly, for both.
tempDir = CreateTempDir();
Directory.Delete(tempDir);
Console.WriteLine("Directory.Delete: removed normal directory");
tempDir = CreateTempDir();
if (!RemoveDirectory(tempDir))
Console.WriteLine("RemoveDirectory: could not remove directory, error is " + Marshal.GetLastWin32Error().ToString());
else
Console.WriteLine("RemoveDirectory: removed normal directory");
Console.ReadLine();
}
}
}
在我的机器上运行它(win 7)我得到以下输出:
Directory.Delete:拒绝访问路径“C:\...\Local\Temp\a4udkkax.jcy”。
删除目录 Win32 错误:5
Directory.Delete:删除正常目录
RemoveDirectory:删除正常目录
我们看到我们得到错误代码 5,根据http://msdn.microsoft.com/en-gb/library/windows/desktop/ms681382(v=vs.85).aspx,这是一个拒绝访问错误。
然后我只能假设资源管理器在删除目录之前取消设置只读属性,这当然很容易完成。该命令rmdir
还删除标记为只读的目录。
由于文档表明 readonly 标志不应该在目录上得到尊重(即使它似乎在 Win 7 中),我不会依赖这种行为。换句话说,我不会依靠 readonly 来阻止任何事情。