Файлы не могут быть изменены после распаковки
Звучит как файлы только для чтения, верно? Ну не совсем.
Поэтому моя цель - сделать резервную копию всех файлов из приложения, которое я создал, просто сжав их в файл.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);
}
}
Редактировать:
Еще через некоторое время, пытаясь найти лучшее решение, я наткнулся на эту тему. который решил это полностью.