如Damien_The_Unbeliever所提到的,如果我们查看FILE_ATTRIBUTE_READONLY的Win32 API,它会提到:
该属性在目录上不起作用。
另请参阅:
http://go.microsoft.com/fwlink/p/?linkid=125896
因此,似乎您可以使用win32或Explorer简单地删除这些目录。然而,.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();
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");
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: Access to the path 'C:\...\Local\Temp\a4udkkax.jcy' is denied.
RemoveDirectory Win32 error: 5
Directory.Delete: removed normal directory
RemoveDirectory: removed normal directory
我们可以看到错误代码为5,根据http://msdn.microsoft.com/en-gb/library/windows/desktop/ms681382(v=vs.85).aspx的解释,这是一个访问被拒绝的错误。
我只能假设资源管理器在删除目录之前取消了只读属性,这当然很容易实现。命令rmdir
也可以删除标记为只读的目录。
正如文档所建议的那样,只读标志不应该被用于目录(即使在Win 7中似乎是这样),因此我不会依赖这种行为。换句话说,我不会依赖只读属性来防止任何操作。