Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » WinRAR (часть 3)

Модерирует : gyra, Maz

Maz (27-08-2020 19:31): WinRAR (часть 4)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

gyra

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
По вопросам лечения (кряки, патчи и т.д.), а также разблокировки архивов, обращаемся в «Варезник».
Отдельная тема по сборкам WinRAR
Предыдущие части темы: Часть 1 | Часть 2



Официальный русский сайт: win-rar.ru
Официальный e-mail разработчика WinRAR (писать на русском): dev@rarlab.com
 
Финальная английская версия: 5.91 x86 | x64 (29.06.2020)
Финальная русская версия:  5.91 x86 | x64 (29.06.2020)
 
Список изменений на английском языке
(на родном – смотрите файл WhatsNew.txt в дистрибутиве на вашем языке)
Скачать RAR для macOS, FreeBSD, Linux, Android можно здесь.

 
Скачать ранее вышедшие версии также можно с официального сайта.

Версия 3.62 (ru) с подарочным ключом (респект камраду elmorte)

Коллекция всех ранее выходивших версий WinRAR (1995-2020): скачать (253 МБ) [обновлено 30.03.2020]

вместо F.A.Q. || альтернативные архиваторы

Почему опять задерживается русская версия? А при русском разработчике на языке XXX уже давно есть. Не захламляйте тему подобными вопросами.

Кому не нравится новая тема оформления - скачайте с официального сайта rarlab.com (из раздела Themes) и установите себе WinRAR Classic theme by Francesco Indrio: Стандартная (48x36). Мелкие кнопки (24x24)

В теме активно отвечает на вопросы автор архиватора Евгений Рошал! Ситуация уникальная, прошу пользоваться. :)

Всего записей: 7932 | Зарегистр. 18-02-2006 | Отправлено: 12:00 14-12-2016 | Исправлено: Domin0, 13:37 26-08-2020
Aniskin

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EugeneRoshal
Подскажите, как реализовано обновление архива в Rar.exe? Я имею в виду, как происходит замещение архива при его модификации новым? Старый удаляется, и временный файл переименовывается в оригинальное имя архива? Если так, то можно ли изменить алгоритм на такой: сначала переименовывается оригинальный data.rar, например, в data.rar.bak, затем временный файл переименовывается в data.rar, а затем data.rar.bak удаляется.

Всего записей: 612 | Зарегистр. 09-01-2006 | Отправлено: 04:51 29-03-2017
EugeneRoshal

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aniskin

Цитата:
Старый удаляется, и временный файл переименовывается в оригинальное имя архива?

Да. Или копируется, если он на другом диске.

Цитата:
сначала переименовывается оригинальный data.rar, например, в data.rar.bak, затем временный файл переименовывается в data.rar, а затем data.rar.bak удаляется.

RAR так делает, если исходный архив заблокирован другой программой. Для проверки пытается открыть его для обновления, и если не получилось, вместо удаления пытается переименовать. Насколько я помню, бывают ситуации, когда переименование работает, а удаление или обновление - нет.
 
Делать же так всегда, не факт, что правильно. Если временный файл находится на другом диске, то подход с переименованием перед удалением приведет к повышенному требованию к свободному месту на диске. То есть, возможна ситуация, когда с нынешним подходом места бы хватило, а с предлагаемым - нет. Разве если делать разное поведение для временного файла на том же диске, что и архив, и на другом диске, хотя это несколько заморочено.
 
В принципе, если нам удалось удалить архив, так и с созданием архива с тем же именем проблемы возникнуть не должно. Кроме каких-то хитрых прав доступа к папке. Но с хитрыми правами и с переименованеим могут быть проблемы.

Всего записей: 2242 | Зарегистр. 29-04-2013 | Отправлено: 20:25 29-03-2017 | Исправлено: EugeneRoshal, 20:27 29-03-2017
Aniskin

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EugeneRoshal

Цитата:
Делать же так всегда, не факт, что правильно.
Согласен, что моя схема имеет смысл только для ситуаций, когда временный файл и оригинал находятся на одном диске.
 

Цитата:
Разве если делать разное поведение для временного файла на том же диске, что и архив, и на другом диске, хотя это несколько заморочено.
Или дополнительный ключ, регламентирующий поведение.
 
 
Эта моя хотелка имеет следующую природу: дело в том, что для Windows быстро поднятое не считается упавшим переименованное не считается удаленным. Т.е. для текущей схемы работы в shell подсистеме для имени архива сначала рассылается сообщение SHCNE_DELETE, а затем SHCNE_RENAMEITEM, а для моей схемы рассылается SHCNE_UPDATEITEM. Т.е. для текущей схемы работы для shell архив является НОВЫМ файлом, а для моей схемы архив является обновленным файлом. Для определенных сценариев это достаточно важно. Как то так.

Всего записей: 612 | Зарегистр. 09-01-2006 | Отправлено: 03:35 30-03-2017
EugeneRoshal

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aniskin

Цитата:
Согласен, что моя схема имеет смысл только для ситуаций, когда временный файл и оригинал находятся на одном диске.

Можно попробовать сделать так для случая, когда пути к этим файлам полностью совпадают, то есть, они находятся в одной папке. Проверять только по букве диска в пути не совсем надежно. Например, у меня на компьютере Desktop начинается с C:\Users\..., но реально это NTFS junction на папку на диске D:

Цитата:
Или дополнительный ключ, регламентирующий поведение.

Только единицы пользователей поймут, что делает этот ключ. Ключ должен быть востребован сколько-нибудь заметным числом пользователей. Иначе разработчику надо самому принимать решение.
 
Добавлено:
Aniskin
А может стоит и по совпадению букв диска в пути, пока не решил.

Всего записей: 2242 | Зарегистр. 29-04-2013 | Отправлено: 12:33 30-03-2017
Aniskin

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EugeneRoshal

Цитата:
Можно попробовать сделать так для случая, когда пути к этим файлам полностью совпадают

Меня это очень даже устроит. Заранее благодарю.

Всего записей: 612 | Зарегистр. 09-01-2006 | Отправлено: 14:05 30-03-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
EugeneRoshal
Цитата:
но реально это NTFS junction на папку на диске D:
Вот тут показана практически идеальная функция канонизации с помощью GetLongFileName():
http://pdh11.blogspot.fr/2009/05/pathcanonicalize-versus-what-it-says-on.html

Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 17:42 30-03-2017
EugeneRoshal

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
Довольно объемная, с учетом не слишком высокой важности задачи. Причем, не исключаю, что WNetGetConnection в каких-то конфигурациях может внести задержку. За прочими WNet* в зависимости от состояния сети я это замечал, правда давно. Там в конце статьи правильно пишут, что, начиная с Висты, можно вызвать GetFinalPathNameByHandle, но мне пока надо и XP. И еще, чтобы это все как-то и под юниксами работало. Так что пока, наверное, буду проверять на полное совпадение пути.

Всего записей: 2242 | Зарегистр. 29-04-2013 | Отправлено: 22:03 30-03-2017
EugeneRoshal

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хотя MoveFile ведь вернет ошибку для разных дисков. Так что как вариант можно не заморачиваться с канонизацией, а просто сравнить буквы дисков и переименовывать исходный архив из .bak обратно при ошибке переименования временного файла, а дальше как обычно. Для юниксов все же, наверное, надо сравнивать полные пути. Там rename() тоже вернет ошибку для разных устройств, но там нет букв дисков, которые позволяют определить такую ситуацию в большинстве случаев еще до rename.
 
В общем, посмотрим. Можно и так, и так.

Всего записей: 2242 | Зарегистр. 29-04-2013 | Отправлено: 12:15 31-03-2017
Victor_VG



Tracker Mod
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EugeneRoshal
 
Да, букв на UNIX нет, но можно узнать устройство где находится объект.Что типа такой логики:  
 
if getdevname(file1)==getdevname(file2)  
      then  if getrootfs(file1)==getrootfs(file2)  
             then goto libel1  
            else end;
     else end;
libel1: if (rootfs(file1) or rootfs(file2)) == IsNetworkFS then goto skip else
     operatiologic: begin
     .....
     end;
 end;
skip:
...........
 
и при несовпадении имён устройств сразу пропустить стадию проверки принадлежности файлов к одной файловой системе т.к. на UNIX в общее дерево может монтироваться бесконечное число файловых систем, в том числе и сетевых требующих выполнение команды в режиме ожидания ответа удалённой системы, что вынуждает иметь две ветки алгоритма - одну работающую с локальными объектами, а другую с удалёнными. Не простейший вариант, но это нужно учитывать заранее...

----------
Жив курилка! (Р. Ролан, "Кола Брюньон")
Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

Всего записей: 33133 | Зарегистр. 31-07-2002 | Отправлено: 16:41 31-03-2017
EugeneRoshal

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Victor_VG
Тут, насколько я понимаю, getdevname и getrootfs еще нужно написать самому? Это ведь не часть POSIX или другого стандарта? Причем мне нужна переносимость между юниксами.

Всего записей: 2242 | Зарегистр. 29-04-2013 | Отправлено: 18:02 31-03-2017
Victor_VG



Tracker Mod
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EugeneRoshal
 
Узнать устройство легко - сначала с помощью getcwd() (ISO/IEC 9945-1:1990 (POSIX.1)), getwd() получаем имя текущего каталога ФС, после зовём fstab() и находим строку для имени точки монтирования данной ФС и в ней первым полем будет имя устройства, вторым точка монтирования:
 
device /mount-point  fstype options dumpfreq passno
 
, а благо точка монтирования всегда присутствует в строке пути к каталогу/файлу. Фокус работает для всех UNIX/LINUX начиная с 4.0BSD UNIX. Так что тут у нас трудностей нет, разве что цикл выделения сравнения подстрок между "/" и их сравнения с именем точки монтирования (а она всегда имеет имя вида /<mountpint>) появляется. Но это несколько десятков тактов ЦП, так что по идее эти операции должны быть заведомо короче длительности любой операции файловой системы.

----------
Жив курилка! (Р. Ролан, "Кола Брюньон")
Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

Всего записей: 33133 | Зарегистр. 31-07-2002 | Отправлено: 20:18 31-03-2017
EugeneRoshal

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Victor_VG
Понял, спасибо. Буду иметь в виду.

Всего записей: 2242 | Зарегистр. 29-04-2013 | Отправлено: 21:32 31-03-2017
p4veltr

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите как решить проблему.
Есть каталог d:\data\images\. Необходимо добавить в архив некоторые файлы из этого каталога. Формирую файл-список d:\data\images.lst.
Мне бы хотелось иметь возможность в файле images.lst указывать относительные пути, чтобы не исправлять их если данные будут перемещены на другой диск. Если я в файл пишу что-то вроде такого:
images\1.jpg
images\2.jpg
то из командной строки архив создаётся успешно только если текущий каталог при запуске команды - d:\data\. Если текущий каталог другой (например c:\windows\), то получаю сообщения, что файлы не найдены.
Что писать в файле-списке чтобы путь брался относительно текущего расположения самого файла?

Всего записей: 15 | Зарегистр. 18-06-2009 | Отправлено: 21:38 31-03-2017 | Исправлено: p4veltr, 21:39 31-03-2017
Victor_VG



Tracker Mod
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
p4veltr
 
Правильно. Понятие "относительный адрес" в ВТ имеет смысл "адрес считаем от известной точки отсчёта", а точкой отсчёта у нас считается корневой каталог где лежат наши файлы. Значит нам надо перейти в каталог с файлами, а это делается командой cd /d <path> (CO/M, MP/M, DOS, Win, OS/2) или cwd <path> (UNIX/Linux). В команде cd ключ /d нужен чтобы ОС сразу перешла по указанному нами в команде пути не шагая мелкими шажками "одна команда - один каталог начиная с корня диска". И будет работать.

----------
Жив курилка! (Р. Ролан, "Кола Брюньон")
Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

Всего записей: 33133 | Зарегистр. 31-07-2002 | Отправлено: 21:58 31-03-2017
p4veltr

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В этом случае мне уже bat-файл придётся делать тогда, просто запуска winrar с нужными ключами будет недостаточно. Жаль. Думал, может какая хитрость есть или сочетание ключей. Ладно, дубу делать так. Спасибо!

Всего записей: 15 | Зарегистр. 18-06-2009 | Отправлено: 22:03 31-03-2017
Victor_VG



Tracker Mod
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
p4veltr
 
А зачем батник? Простое создание архивов а выбор файлов по маске.

----------
Жив курилка! (Р. Ролан, "Кола Брюньон")
Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

Всего записей: 33133 | Зарегистр. 31-07-2002 | Отправлено: 22:44 31-03-2017
p4veltr

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня сторонняя программа будет запускать winrar. Соответственно, перед его запуском надо перейти в папке d:\data\. Как, кроме батника?

Всего записей: 15 | Зарегистр. 18-06-2009 | Отправлено: 22:55 31-03-2017
Inoz2000



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
делайте без батника в одну строку
Код:
cmd /c


----------
Мы все умрём. (-:

Всего записей: 4891 | Зарегистр. 23-04-2009 | Отправлено: 23:02 31-03-2017
p4veltr

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, можно и так. Буду думать, спасибо

Всего записей: 15 | Зарегистр. 18-06-2009 | Отправлено: 23:32 31-03-2017
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ввиду неизбежного появления новой версии(й), касательно поддержки старушки WinXP: раз, два.

Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 02:31 06-04-2017
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

Компьютерный форум Ru.Board » Компьютеры » Программы » WinRAR (часть 3)
Maz (27-08-2020 19:31): WinRAR (часть 4)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru