首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C#中删除包含只读文件的目录?

如何在C#中删除包含只读文件的目录?
EN

Stack Overflow用户
提问于 2009-03-04 18:47:10
回答 11查看 53.3K关注 0票数 61

我需要删除包含只读文件的目录。哪种方法更好:

使用

  • ManagementObject.InvokeMethod("Delete")?的
  • ,或DirectoryInfo.Delete()

使用DirectoryInfo.Delete()时,我必须手动关闭每个文件的只读属性,但ManagementObject.InvokeMethod("Delete")似乎不需要这样做。有没有哪种情况比另一种更可取?

示例代码(test.txt是只读的)。

第一种方法:

代码语言:javascript
复制
DirectoryInfo dir = new DirectoryInfo(@"C:\Users\David\Desktop\");
dir.CreateSubdirectory("Test");

DirectoryInfo test = new DirectoryInfo(@"C:\Users\David\Desktop\Test\");
File.Copy(@"C:\Users\David\Desktop\test.txt", @"C:\Users\David\Desktop\Test\test.txt");
File.SetAttributes(@"C:\Users\David\Desktop\Test\test.txt", FileAttributes.Archive);
test.Delete(true);

第二种方式:

代码语言:javascript
复制
DirectoryInfo dir = new DirectoryInfo(@"C:\Users\David\Desktop\");
dir.CreateSubdirectory("Test");

DirectoryInfo test = new DirectoryInfo(@"C:\Users\David\Desktop\Test\");
File.Copy(@"C:\Users\David\Desktop\test.txt", @"C:\Users\David\Desktop\Test\test.txt");

string folder = @"C:\Users\David\Desktop\Test";
string dirObject = "Win32_Directory.Name='" + folder + "'";
using (ManagementObject managementObject = new ManagementObject(dirObject))
{
    managementObject.Get();
    ManagementBaseObject outParams = managementObject.InvokeMethod("Delete", null,
    null);
    // ReturnValue should be 0, else failure
    if (Convert.ToInt32(outParams.Properties["ReturnValue"].Value) != 0)
    {
    }
}
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-03-15 16:10:55

下面是一个扩展方法,它递归地将Attributes设置为Normal,然后删除这些项:

代码语言:javascript
复制
public static void DeleteReadOnly(this FileSystemInfo fileSystemInfo)
{
    var directoryInfo = fileSystemInfo as DirectoryInfo;    
    if (directoryInfo != null)
    {
        foreach (FileSystemInfo childInfo in directoryInfo.GetFileSystemInfos())
        {
            childInfo.DeleteReadOnly();
        }
    }

    fileSystemInfo.Attributes = FileAttributes.Normal;
    fileSystemInfo.Delete();
}
票数 96
EN

Stack Overflow用户

发布于 2012-01-03 23:12:23

避免递归调用的最简单方法是在获取FileSystemInfo时使用AllDirectories选项,如下所示:

代码语言:javascript
复制
public static void ForceDeleteDirectory(string path) 
{
    var directory = new DirectoryInfo(path) { Attributes = FileAttributes.Normal };

    foreach (var info in directory.GetFileSystemInfos("*", SearchOption.AllDirectories))
    {
        info.Attributes = FileAttributes.Normal;
    }

    directory.Delete(true);
}
票数 102
EN

Stack Overflow用户

发布于 2010-06-10 03:15:36

尝尝这个,

代码语言:javascript
复制
private void DeleteRecursiveFolder(string pFolderPath)
{
    foreach (string Folder in Directory.GetDirectories(pFolderPath))
    {
        DeleteRecursiveFolder(Folder);
    }

    foreach (string file in Directory.GetFiles(pFolderPath))
    {
        var pPath = Path.Combine(pFolderPath, file);
        FileInfo fi = new FileInfo(pPath);
        File.SetAttributes(pPath, FileAttributes.Normal);
        File.Delete(file);
    }

    Directory.Delete(pFolderPath);
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/611921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档