C# 目录。删除不';不行。拒绝访问错误,但在Windows资源管理器下它';没关系

C# 目录。删除不';不行。拒绝访问错误,但在Windows资源管理器下它';没关系,c#,C#,我搜索了SO,但什么也没找到 为什么这不起作用 Directory.Delete(@"E:\3\{90120000-001A-0000-0000-0000000FF1CE}-C"); 上述行将抛出异常“访问被拒绝”。我有管理权限,可以使用资源管理器删除目录 看起来像是一些被禁的魔咒?但是Windows资源管理器可以处理它。我怎样才能删除具有这样名称的目录?您是否尝试创建该类的新实例,然后在删除之前检查是否存在?代码如下所示: System.IO.DirectoryInfo di

我搜索了SO,但什么也没找到

为什么这不起作用

Directory.Delete(@"E:\3\{90120000-001A-0000-0000-0000000FF1CE}-C");
上述行将抛出异常“访问被拒绝”。我有管理权限,可以使用资源管理器删除目录


看起来像是一些被禁的魔咒?但是Windows资源管理器可以处理它。我怎样才能删除具有这样名称的目录?

您是否尝试创建该类的新实例,然后在删除之前检查是否存在?代码如下所示:

        System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"E:\3\{90120000-001A-0000-0000-0000000FF1CE}-C");
        if (dir.Exists)
            dir.Delete(true);
此外,请验证您(运行应用程序的用户)是否有权访问该文件夹。如果这是网络映射驱动器,则运行应用程序的用户需要能够删除它


希望这有帮助

根据您正在使用的目录,您可能需要管理员访问才能删除文件。要测试这一点,请从资源管理器以管理员身份运行应用程序,并查看其是否有效(右键单击.exe并选择“以管理员身份运行”)

如果这样做有效,则在应用程序执行时需要获得管理员权限。您可以通过将以下内容添加到应用程序清单中来完成此操作:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="requireAdministrator" />
    </requestedPrivileges>
  </security>
</trustInfo>

谢谢大家的意见,这有助于我快速找到解决方案

正如Phil所提到的,“Directory.Delete失败,如果是,则不管权限如何(请参阅msdn.microsoft.com/en us/library/…)的底部)”

另外 微软表示:

您可能无法删除该文件 文件夹中的只读属性 使用Windows资源管理器。此外 有些程序可能显示错误 尝试将文件保存到时的消息 文件夹

结论:删除之前,请始终删除所有目录、文件属性(与正常属性不同)。下面的代码解决了这个问题:

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"E:\3\{90120000-0021-0000-0000-0000000FF1CE}-C1");

if (dir.Exists)
{
    setAttributesNormal(dir);
    dir.Delete(true);
}

. . .

function setAttributesNormal(DirectoryInfo dir) {
    foreach (var subDir in dir.GetDirectories())
        setAttributesNormal(subDir);
    foreach (var file in dir.GetFiles())
    {
        file.Attributes = FileAttributes.Normal;
    }
}

我有这种症状,实际上是explorer.exe本身锁定了目录。我使用找到此文件,但也可以使用powershell查找锁定文件的进程:

$lockedFile = "C:\Windows\System32\wshtcpip.dll"
Get-Process | foreach{$processVar = $_; $_.Modules | foreach { if ($_.FileName -like "${lockedFile}*") { $processVar.Name + " PID:" + $processVar.id + " [" + $_.Filename + "]"}}}
$lockedFile = "C:\directory_I_want_to_delete"
Get-Process | foreach{$processVar = $_; $_.Modules | foreach { if ($_.FileName -like "${lockedFile}*") { write-host $processVar.Name + " PID:" + $processVar.id + " [" + $_.Filename + "]" ; write-host "Killing process..." ; stop-process -pid $processVar.id -force }}}
然后你必须决定是否优雅地停止这个过程;修改powershell脚本以尝试终止锁定文件的任何进程将很容易:

$lockedFile = "C:\Windows\System32\wshtcpip.dll"
Get-Process | foreach{$processVar = $_; $_.Modules | foreach { if ($_.FileName -like "${lockedFile}*") { $processVar.Name + " PID:" + $processVar.id + " [" + $_.Filename + "]"}}}
$lockedFile = "C:\directory_I_want_to_delete"
Get-Process | foreach{$processVar = $_; $_.Modules | foreach { if ($_.FileName -like "${lockedFile}*") { write-host $processVar.Name + " PID:" + $processVar.id + " [" + $_.Filename + "]" ; write-host "Killing process..." ; stop-process -pid $processVar.id -force }}}

我使用binball的代码并添加了一行代码来将目录属性也设置为normal

if (dir.Exists)
    {
        setAttributesNormal(dir);
        dir.Delete(true);
    }    

function setAttributesNormal(DirectoryInfo dir)
    {
        foreach (var subDir in dir.GetDirectories())
        {
            setAttributesNormal(subDir);
            subDir.Attributes = FileAttributes.Normal;
        }
        foreach (var file in dir.GetFiles())
        {
            file.Attributes = FileAttributes.Normal;
        }
    }

添加到@binball和@Chuck answer。下面是一个使用BFS遍历目录的
setAttributesNormal()
的快速异步友好实现。 它非常适合深度目录遍历,递归可能会填满调用堆栈

内部静态void SetAttributesNormal(DirectoryInfo路径){
//BFS文件夹权限规范化器
Queue dirs=新队列();
直接排队(路径);
而(dirs.Count>0){
var dir=dirs.Dequeue();
dir.Attributes=FileAttributes.Normal;
Parallel.ForEach(dir.EnumerateFiles(),e=>e.Attributes=FileAttributes.Normal);
foreach(dir.GetDirectories()中的var subDir)
目录排队(子目录);
}
}

目录是否为空?您是否尝试使用sysinternal工具进行“跟踪”?是的,dir为空。我没有想到系统内部。Thx,我将很快尝试更多的测试(但可能有人会更早地发现“错误”)。不要假设目录是只读的吗?目录。如果是,则删除失败,无论权限如何(请参见的底部)。谢谢您的建议。这正是目录中的这个.ReadOnly属性。我被愚弄了,因为标准的WindowsXP行为显示每个文件夹的只读标记。因此,我通过Windows资源管理器“删除”了这个只读属性,但它仍然保留。奇怪的默认WindowsXP设置。。非常感谢。另一个答案:这并不能解决问题,尽管它通常可以解决访问问题。当我尝试这样做时,我会得到“拒绝访问”。我的应用程序调用一个创建目录的进程。在稍后的阶段,我需要删除该目录,并得到“拒绝访问”。有什么解决办法吗?成功!当我在
setAttributesNormal
函数的末尾添加以下行时:
dir.Attributes=FileAttribute.Normal
尝试执行此操作时,我会得到“访问被拒绝”。我的应用程序调用一个创建目录的进程。在稍后的阶段,我需要删除该目录,并得到“拒绝访问”。有任何解决方案吗?请确保该过程不会留下任何与文件的打开连接,否则您将遇到问题。我确信您具有正确的访问级别,如完全控制等。我建议,由于这是一个目录递归操作,您应该将
subDir.Attributes=FileAttributes.Normal
行a移到函数末尾,因为这也将包括目标目录,并将递归执行。成功!当我在
setAttributesNormal
函数末尾添加以下行时:
dir.Attributes=FileAttribute.Normal
。函数缺少主(父)目录。