Как сочетать умную перезапись файла с правами доступа?
Есть программа (не важно, какая). Нужно сохранить на диск файл документа. Я оказался между двух огней.
1. Взять и перезаписать — при любом глюке, как программы, так и системы хранения, даже при нехватке места на диске, файл исчезнет.
2. Создать файл проекта с нуля, и если запись удастся, удалить старый и переименовать новый — теряются права доступа.
Как поступить? Какие есть стандартные пути разрешить это противоречие?
John Smith, Как поступить, если у нас есть файл длиной 45.678.901 байт и ещё 54 мегабайта на диске — какой вообще алгоритм определения? (Да, вот такой порядок размера файлов.)
Для двоичных и просто огромных файлов системы версионирования отказывают.
Ночная архивация тоже хорошее дело — правда, получаем вчерашнюю копию.
А при любом глюке хранилища получаем программу с аварией (хорошо, если не с вылетом) и кусок файла, что равносильно отсутствию файла.
Ночная архивация тоже хорошее дело — правда, получаем вчерашнюю копию.
.
и этим вроде занимается администратор, а не программа с горы
про Volume Shadow Copy, которую можно делать хоть каждый час, "администратор с горы" не слышал. Опять же странный администратор, которому нельзя задать этот самый вопрос или который не способен придумать решение (зная все детали, все особенности, а не строя догадки, как мы - анонимы с горы).
45.678.901 байт - это никак не "огромный" файл, даже не "просто большой". Огромный - это несколько терабайт. Большой - несколько гигабайт. А у вас всего лишь мегабайты. Средненький размер.
Непонятнен вопрос с точки зрения "теряются права доступа". Права какие-то особые? Программа запущена от имени пользователя, файл будет создан от имени этого же пользователя. Чтобы дать права кому-то ещё на собственный файл, не требуется быть админом. Распишите подробнее, что не так с правами, откуда ноги растут у проблемы.
hint000, Программа по-чёрному используется в корпоративной среде.
На данный момент она сохраняет во временный файл, потом старый удаляет и новый переименовывает.
Кто-то ругается, что права доступа к файлу сбрасываются на дефолтные. Не удивительно: исходный файл-то удаляется.
Кто-то ругается, что права доступа к файлу сбрасываются на дефолтные.
Это понимаю. Не понимаю: чем их не устраивают дефолтные права? Значит были какие-то не дефолтные? Чем эти дефолтные отличаются от тех не дефолтных? Возьмите новый и старый файл, посмотрите права, сравните. Или спросите у того, кто ругается, каких конкретно прав ему не хватает.
На данный момент она сохраняет во временный файл, потом старый удаляет и новый переименовывает.
Сделать копию старого с расширением .bak, после этого перезаписать исходный файл, удалить (или не удалять) копию.
И это одна из причин почему надо 1000 раз подумать перед тем как давать права на отдельный файл, права на файл должны наследоваться от каталога. Системно это не решить никак, у вашей программы запросто может не быть разрешений на удаление исходного файла и даже на чтение его разрешений. Прописать требования к правам доступа в документации и пусть админы сами разбираются с их зоопарком.
Как вариант - скопировать предыдущий документ во временный файл, а потом перезаписать текущий файл. Если операция успешна - то удалить временный файл. Если операция не успешна, то либо восстановить данные из временного файла, либо если программа крешнулась, на диске будет предыдущий документ в другом файле (да, с другими правами, но будет).