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 的只读文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 清除文本文件的内容

C#数据库导出(入)TXT

如何在 C# 中使用 GZipStream 解压缩?

在c#中打开文件进行读取时出错

NPOI设置水平垂直居中

如何在 C# 中将 Excel 文件的一部分转换为简化的 DataSet?