C#如何以只读方式打开文件并使用FileMode.Create?

3
我想做的是覆盖只读文件,使用读/写文件。对于可读/写文件,如果我使用 File.Open(file, FileMode.Create),那么如果该文件已存在,则该文件将被删除并创建新文件。(虽然我怀疑如果文件已经存在,它只会打开文件并删除内容,这就是它无法应对遇到的可读/写文件的原因)。我尝试了不同的FileAccess枚举,但没有一个能帮助我(我一直收到UnauthorizedAccessException)。 解决方法是在尝试File.Open和创建新文件之前将文件设置为可读/写。 这是唯一的方法吗? 谢谢

文档说明使用Create打开文件需要具备写入权限。如果.NET提示我这是只读文件,我并不认为抛出异常是件坏事。你的解决方法对我来说似乎是一个完全有效的显式解决方案。 - starskythehutch
抛出异常并不是一件坏事,但我需要每次都能够覆盖它。 - Thomas Clayson
4个回答

4
考虑一下“ReadOnly”的作用。它的作用是阻止对文件进行更改。你想要做的是更改文件(在这种情况下是通过覆盖它)。我想你需要做的是设置文件属性:
File.SetAttributes(filePath, FileAttributes.Normal);

在你写入文件之前。


就像我对@Frantisek所说的那样,我一直认为我可以删除只读文件,但不能更改其内容! :p 哎呀,好吧,我想答案应该是先删除标志。谢谢。 - Thomas Clayson

1

是的,这是一种设计行为。您无法向只读文件中写入内容,因此也无法覆盖它。

因此,唯一且完全有效的选项是首先删除 ReadOnly 标志。


嗯,奇怪,因为我可以在Windows资源管理器中删除只读文件而没有任何问题!我一直以为只读是为了防止更改,但不是完全删除!感谢您的澄清。 - Thomas Clayson

1
使用FileInfo对象来更改文件的属性,例如只读属性(如果您有权限),然后覆盖该文件。

0

是的,在写入之前,您需要删除只读属性。这里有一些文件工具可以检测文件是否为只读,然后设置为非只读属性。

    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));
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接