Файл C #. Откройте файл только для чтения с FileMode.Create - PullRequest
3 голосов
/ 10 ноября 2011

Я хочу перезаписать файл только для чтения. С файлом для чтения / записи.

Для файлов чтения / записи, если я использую File.Open(file, FileMode.Create), то, если файл существует, он удаляется и создается новый. (Хотя я подозреваю, что если он существует, он просто открывает файл и удаляет его содержимое, поэтому он не может справиться с файлами, которые он встречает в режиме чтения / записи).

Я пробовал с разными FileAccess перечислениями, но ни один из них, похоже, не помог мне (я продолжаю получать UnauthorizedAccessException).

Обходной путь заключается в том, что я просто устанавливаю файл для чтения / записи, прежде чем пытаюсь File.Open и создаю новый файл, это единственный способ сделать это?

Спасибо

Ответы [ 4 ]

4 голосов
/ 10 ноября 2011

Рассмотрим цель ReadOnly. Это остановить изменения в файле. То, что вы пытаетесь сделать, это изменить файл (в данном случае, перезаписав его).

То, что вам нужно сделать, это установить атрибут файла:

File.SetAttributes(filePath, FileAttributes.Normal);

Прежде чем писать в файл.

1 голос
/ 10 ноября 2011

Используйте FileInfo, чтобы изменить атрибуты файла с ReadOnly (если у вас есть разрешения), а затем перезаписать файл.

1 голос
/ 10 ноября 2011

Да, это поведение по проекту. Вы не можете записать в файл, который доступен только для чтения, поэтому вы также не можете перезаписать его.

Таким образом, единственный и совершенно правильный вариант - сначала удалить флаг ReadOnly.

0 голосов
/ 10 ноября 2011

Да, вам нужно удалить атрибут readonly перед его записью. Здесь есть несколько файловых утилит, чтобы определить, доступен ли файл только для чтения, а затем установить атрибут non-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));
        }
    }
...