使用C#删除目录上的只读属性

Dot*_*ude 16 .net c# .net-3.5 c#-4.0

我使用以下代码片段成功删除了文件的只读属性:

在main.cs中

FileSystemInfo[] sqlParentFileSystemInfo = dirInfo.GetFileSystemInfos();

foreach (var childFolderOrFile in sqlParentFileSystemInfo)
{
    RemoveReadOnlyFlag(childFolderOrFile);
}

private static void RemoveReadOnlyFlag(FileSystemInfo fileSystemInfo)
{
    fileSystemInfo.Attributes = FileAttributes.Normal;
    var di = fileSystemInfo as DirectoryInfo;

    if (di != null)
    {
        foreach (var dirInfo in di.GetFileSystemInfos())
            RemoveReadOnlyFlag(dirInfo);
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不适用于文件夹.运行代码后,当我转到该文件夹​​时,右键单击并执行属性,这是我看到的:

替代文字

虽然只读标志从它下面的文件中删除了,但仍然会检查它.这会导致进程无法删除此文件夹.当我手动删除标志并重新运行进程(bat文件)时,它可以删除该文件(所以我知道这不是bat文件的问题)

如何在C#中删除此标志?

Mar*_*ius 8

您还可以执行以下操作,以递归方式清除指定父目录中所有目录和文件的readonly(和archive等):

private void ClearReadOnly(DirectoryInfo parentDirectory)
{
    if(parentDirectory != null)
    {
        parentDirectory.Attributes = FileAttributes.Normal;
        foreach (FileInfo fi in parentDirectory.GetFiles())
        {
            fi.Attributes = FileAttributes.Normal;
        }
        foreach (DirectoryInfo di in parentDirectory.GetDirectories())
        {
            ClearReadOnly(di);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此你可以这样称呼它:

public void Main()
{
    DirectoryInfo parentDirectoryInfo = new DirectoryInfo(@"c:\test");
    ClearReadOnly(parentDirectoryInfo);
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*B R 6

尝试使用DirectoryInfo而不是FileInfo

DirectoryInfo di = new DirectoryInfo(@"c:\temp\content");
di.Attributes = FileAttributes.Normal;
Run Code Online (Sandbox Code Playgroud)

清理档案上的遗产 -

foreach (string fileName in System.IO.Directory.GetFiles(@"c:\temp\content"))
{
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);
    fileInfo.Attributes = FileAttributes.Normal;
}
Run Code Online (Sandbox Code Playgroud)