从目录中删除只读属性
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");
【讨论】:
我们想从中删除只读标志。不仅仅是显示它是否是只读文件/文件夹!以上是关于从目录中删除只读属性的主要内容,如果未能解决你的问题,请参考以下文章