Файлы не могут быть изменены после распаковки

Звучит как файлы только для чтения, верно? Ну не совсем.

Поэтому моя цель - сделать резервную копию всех файлов из приложения, которое я создал, просто сжав их в файл.zip. Сначала я собираю все файлы и помещаю их в другую папку (например, мне не нужно делать резервную копию.exe-файла). Затем я сжимаю их, используя IO.compression.ZipFile

ZipFile.CreateFromDirectory(backupDirectory, ZipDirectory);

Позже, когда пользователь захочет восстановить резервную копию, я сначала удаляю существующие файлы и каталоги, а затем извлекаю их:

ZipFile.ExtractToDirectory(openFileDialog1.FileName, installDirectory);

Проблема: файлы теперь доступны только для чтения, один файл - это файл.mdf, я больше не могу вносить изменения в таблицы, что делает приложение бесполезным. Я пытался сделать это:

public void Recurse(DirectoryInfo directory)
    {
        foreach (FileInfo fi in directory.GetFiles())
        {
            //fi.Attributes |= FileAttributes.ReadOnly; //this didn't work eather
            fi.IsReadOnly = false;
        }

        foreach (DirectoryInfo subdir in directory.GetDirectories())
        {
            Recurse(subdir);
        }
    }

из этого вопроса. Не сработало И я не ожидаю, что это сработает, поскольку флаг "Только для чтения" не проверяется в свойствах.mdf. Также при просмотре вкладки "Безопасность":

SYSTEM, Admin и User одинаковы, но мне не хватает названия группы "Все" со всеми проверками, установленными на "Разрешено". После ручной настройки этой группы, я вижу некоторые улучшения, однако все еще появляются другие ошибки, такие как невозможность входа в систему, ошибка входа пользователя [текущий пользователь]

Изменить: проблема с вкладкой безопасности выше, потому что я использовал это Recurse метод. Ухудшилось. Таким образом, используя file.IsReadOnly = false для всех файлов это не хорошее решение.

Вопрос: Как правильно сжимать и распаковывать файлы без изменения их атрибутов / настроек / разрешений. ** Или: ** Как мне снова установить правильные атрибуты для файлов после распаковки.

1 ответ

Я нашел решение.

В другом вопросе / решении, о котором я упоминал, он сказал изменить fileinfo.IsReadOnly = false; вместо:

fileInfo.Attributes = FileAttributes.Normal

Для меня это было наоборот.

Итак, с этим параметром:

DirectoryInfo di = new DirectoryInfo(installDirectory);
Recurse(di);

Я использовал это:

public void Recurse(DirectoryInfo directory)
{
    foreach (FileInfo fi in directory.GetFiles())
    {
        fi.Attributes = FileAttributes.Normal;
    }

    foreach (DirectoryInfo subdir in directory.GetDirectories())
    {
        Recurse(subdir);
    }
}

Редактировать:

Еще через некоторое время, пытаясь найти лучшее решение, я наткнулся на эту тему. который решил это полностью.

Другие вопросы по тегам