C# File.Open 使用 FileMode.Create 的只读文件
Posted
技术标签:
【中文标题】C# File.Open 使用 FileMode.Create 的只读文件【英文标题】:C# File.Open a read-only file with FileMode.Create 【发布时间】:2011-12-26 07:17:53 【问题描述】:我想要做的是覆盖一个只读文件。带有读/写文件。
如果我使用File.Open(file, FileMode.Create)
,则使用读/写文件,然后如果文件存在,则将其删除并创建一个新文件。 (虽然我怀疑如果它存在,那么它只是打开文件并删除内容,这就是它无法处理它遇到的读/写文件的原因)。
我尝试过使用不同的 FileAccess
枚举,但它们似乎都没有帮助我(我不断收到 UnauthorizedAccessException
)。
解决方法是我只是在尝试File.Open
并创建一个新文件之前将文件设置为读/写,这是唯一的方法吗?
谢谢
【问题讨论】:
文档说要使用 Create 打开文件,您需要写入权限。我不认为抛出异常是一件坏事,因为我宁愿 .NET 告诉我它是一个只读文件。您的解决方法对我来说似乎是一个完全有效的明确解决方案。 抛出异常不是坏事,但我只需要每次都能覆盖它。 【参考方案1】:考虑ReadOnly
的用途。这是为了停止对文件的更改。你想要做的是改变文件(在这种情况下通过覆盖它)。
我想你需要做的是设置文件属性:
File.SetAttributes(filePath, FileAttributes.Normal);
在写入文件之前。
【讨论】:
正如我对@Frantisek 所说,我一直认为我可以删除只读文件,而不是更改其内容! :p 嗯,我想答案是先删除标志。谢谢【参考方案2】:是的,这是一种设计行为。您不能写入只读文件,因此也不能覆盖它。
因此,唯一且完全有效的选择是首先删除 ReadOnly 标志。
【讨论】:
嗯,奇怪,因为我可以毫无问题地从 Windows 资源管理器中删除只读文件!我一直认为只读是为了停止更改,而不是完全删除!感谢您的澄清。【参考方案3】:使用 FileInfo 将文件的属性从 ReadOnly 更改(如果您有权限),然后覆盖该文件。
【讨论】:
【参考方案4】:是的,您需要在写入之前删除 readonly 属性。这里有一些文件工具可以检测文件是否为只读,然后设置非只读属性。
public static bool IsReadOnly(string file)
return (File.GetAttributes(file) & FileAttributes.ReadOnly) ==
FileAttributes.ReadOnly;
public static void SetNonReadOnlyAttributes(string file)
try
FileAttributes attrs = File.GetAttributes(file);
File.SetAttributes(file, attrs & ~FileAttributes.ReadOnly);
catch (Exception ex)
throw new Exception(
string.Format(
"Error setting non-readonly attributes to file 0: 1",
file, ex.Message));
【讨论】:
以上是关于C# File.Open 使用 FileMode.Create 的只读文件的主要内容,如果未能解决你的问题,请参考以下文章