从目录中删除只读属性

Posted

技术标签:

【中文标题】从目录中删除只读属性【英文标题】:Remove readonly attribute from directory 【发布时间】:2011-01-19 22:52:59 【问题描述】:

如何以编程方式从 C# 中的目录中删除只读属性?

【问题讨论】:

@Lalit 你想达到什么目的? 请参阅我的某个路径上的只读文件夹。我想复制该文件夹中的一些文件。所以想要临时使其可写意味着删除 readonly ,然后复制文件然后再次将该文件夹设置为只读。你能帮我吗?这是要求。 在 Windows 上,在目录上设置只读属性实际上是毫无意义的。您仍然可以删除、重命名该目录等。请参阅support.microsoft.com/en-us/help/326549/… 了解更多信息。 【参考方案1】:
var di = new DirectoryInfo("SomeFolder");
di.Attributes &= ~FileAttributes.ReadOnly;

【讨论】:

&= --> 附加所以不要触及所有其他属性和 ~ --> 补充所以做相反的只读 这可能是正确的答案。但是,正如 Alastair 对该问题的评论,您应该在使用前阅读support.microsoft.com/en-us/help/326549。它可能不会像你认为的那样做。请注意,“文件属性”对话框中的“只读”选项显示“(仅适用于文件夹中的文件)”。 快速附加说明:您需要在读取/更新属性之前刷新(),因为目录信息被缓存。见:docs.microsoft.com/en-us/dotnet/api/…【参考方案2】:

这里有一个很好的链接,指向使用 c# 修改文件属性的示例

http://www.csharp-examples.net/file-attributes/

根据他们的示例,您可以像这样删除只读属性(我还没有测试过):

File.SetAttributes(filePath, File.GetAttributes(filePath) & ~FileAttributes.ReadOnly);

【讨论】:

@Red Swan:我刚刚测试了它以添加隐藏属性,它也适用于目录。 这适用于文件和目录,因为目录就像具有目录属性集 (FileAttributes.Directory) 的特殊文件。【参考方案3】:

使用-= 赋值运算符很危险,原因有两个: 1) 仅当设置了ReadOnly 属性时才有效,因此需要事先进行测试。 2)它正在执行减法运算,这不是使用二进制标志时的最佳选择。如果条件 1(以上)为真,则减法运算有效,但额外的减法运算将改变 FileAttributes 字段中的其他位!

使用&= ~FileAttributes.ReadOnly; 删除ReadOnly 标志。

使用|= FileAttributes.ReadOnly; 应用ReadOnly 标志。

【讨论】:

【参考方案4】:

如果您尝试删除文件系统中文件的属性,请创建 System.IO.FileInfo 类的实例并将属性 IsReadOnly 设置为 false。

        FileInfo file = new FileInfo("c:\\microsoft.text");
        file.IsReadOnly = false;

【讨论】:

【参考方案5】:

如果某些东西不起作用,则立即包含所有内容的版本

        this._path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My App Settings");

        if (!Directory.Exists(this._path))
        
            Directory.CreateDirectory(this._path);

            DirectoryInfo directoryInfo = new DirectoryInfo(this._path);
            directoryInfo.Attributes &= ~FileAttributes.ReadOnly;

            FileSystemInfo[] info = directoryInfo.GetFileSystemInfos("*", SearchOption.AllDirectories);
            for (int i = 0; i < info.Length; i++)
            
                info[i].Attributes = FileAttributes.Normal;
            
        

【讨论】:

【参考方案6】:

将属性设置为 FileAttributes.Normal文件夹文件 上都对我有用。

【讨论】:

我对这种方法唯一关心的是如果文件夹(或文件)有另一个属性怎么办?如果文件夹是隐藏且只读的,而您只想使其不再是只读的,那么您的方法也将使其不再隐藏。这可能会产生意想不到的后果。【参考方案7】:
    public static void DeleteDirectory(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);
    

【讨论】:

【参考方案8】:

终于明白了。 ;)

class Program

    static void Main(string[] args)
    
        DirectoryInfo di = new DirectoryInfo("c:\\test");

        FileAttributes f = di.Attributes;

        Console.WriteLine("Directory c:\\test has attributes:");
        DecipherAttributes(f);

    

    public static void DecipherAttributes(FileAttributes f)
    
        // To set use File.SetAttributes

        File.SetAttributes(@"C:\test", FileAttributes.ReadOnly);

        if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            Console.WriteLine("ReadOnly");

        // To remove readonly use "-="
        f -= FileAttributes.ReadOnly;

        if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            Console.WriteLine("ReadOnly");
        else
            Console.WriteLine("Not ReadOnly");
    

【讨论】:

我们想从中删除只读标志。不仅仅是显示它是否是只读文件/文件夹!

以上是关于从目录中删除只读属性的主要内容,如果未能解决你的问题,请参考以下文章

如何删除只读文件

dos 下删除文件文件夹

BAT 删除隐藏文件

del

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

IIS的虚拟目录的只读属性去不掉