View previous topic :: View next topic |
Author |
Message |
GGS
Joined: 02 May 2009 Posts: 322
|
(Separately) Posted: Wed Jan 26, 2011 23:33 Post subject: Жёсткие ссылки и внутренний распаковщик RAR |
|
|
Внутренний распаковщик RAR (извлечение с заменой существующего файла) портит жёсткие ссылки (меняет индекс) у имеющегося файла.
Создаётся впечатление, что внутренний RAR-распаковщик при перезаписи существующего файла не записывает новый файл "поверх" существующего, а сначала удаляет старый и только после этого записывает новый. В результате новый файл теряет жёсткие ссылки, которые имел старый.
При простом копировании файла (с перезаписью, не из архива), при распаковке из ZIP-архива и при распаковке RAR-архива внешним WinRAR (снята отметка "Архиватор RAR: [ ] По возможности использовать внутренний распаковщик") жёсткие ссылки сохраняются.
Очень неприятная ситуация. Можно ли считать это багом или есть какие-либо настройки?
---
WinXP SP3; TC 7.56a. Архиваторные плагины не используются. |
|
Back to top |
|
 |
CaptainFlint

Joined: 14 Dec 2004 Posts: 6193 Location: Москва
|
(Separately) Posted: Thu Jan 27, 2011 02:10 Post subject: |
|
|
GGS
Есть подозрение, что это Тотал так работает с архиваторными плагинами (unrar.dll тоже можно считать плагином): если видит, что есть одноимённый файл, то запрашивает пользователя насчёт перезаписи и в случае согласия грохает файл, после чего передаёт управление плагину. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
 |
GGS
Joined: 02 May 2009 Posts: 322
|
(Separately) Posted: Thu Jan 27, 2011 02:27 Post subject: |
|
|
Встроенный ZIP-распаковщик (?.DLL точно не знаю) тоже можно считать плагином, но с ним всё в порядке. Так же выдаёт запрос и т.п.
Вот эта неувязка меня и волнует. |
|
Back to top |
|
 |
CaptainFlint

Joined: 14 Dec 2004 Posts: 6193 Location: Москва
|
(Separately) Posted: Thu Jan 27, 2011 02:50 Post subject: |
|
|
GGS
ZIP всё же теснее интегрирован.
Я просто посмотрел код своего плагина (HLP), убедился, что там никакого удаления нет, проверил с ним — эффект тот же. Значит, удаляет Тотал, больше некому. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
 |
GGS
Joined: 02 May 2009 Posts: 322
|
(Separately) Posted: Thu Jan 27, 2011 02:55 Post subject: |
|
|
CaptainFlint wrote: | Значит, удаляет Тотал, больше некому. |
Да, это очевидно что Тотал. Считаю это багом.
Сейчас проверил распаковку *.cab - при перезаписи индекс не меняет. |
|
Back to top |
|
 |
MVV

Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
|
(Separately) Posted: Thu Jan 27, 2011 16:21 Post subject: |
|
|
Я думаю, что если бы этим занимался тотал, он бы работал одинаково со всеми форматами - какой смысл писать разный код для одинаковых действий?
И насчет сохранения атрибутов и жестких ссылок - мне кажется, что как раз большинство программ удаляют файлы при перезаписи, и что сохранение индекса/атрибутов и т.п. - это чисто особенность тотала. Например, при распаковке с помощью внешнего 7-Zip при распаковке атрибуты и жесткие ссылки элементарно теряются.
Так что, скорее всего, сама библиотека unrar.dll занимается удалением файла при перезаписи - т.е. если есть разрешение на перезапись, она удаляет файлы перед тем как извлечь новые. И хотя распаковка RAR и интегрирована в тотал, она все-таки выполняется через внешний модуль.
Хм, проверил в отладчике - действительно, функция DeleteFileW вызывается непосредственно из кода тотала (адрес вызова для 7.56a - 0x00428128). Видимо, это часть интерфейса взаимодействия тотала и unrar.dll. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Last edited by MVV on Mon Feb 07, 2011 16:10; edited 1 time in total |
|
Back to top |
|
 |
GGS
Joined: 02 May 2009 Posts: 322
|
(Separately) Posted: Thu Jan 27, 2011 17:39 Post subject: |
|
|
MVV wrote: | Я думаю, что если бы этим занимался тотал, он бы работал одинаково со всеми форматами | Я тоже раньше так считал пока не напоролся на потерю индекса при D&D в панели TC из RAR-архива, но сохранении из ZIP-архива. При D&D из оболочки WinRAR-а в панель TC индекс не меняется. По-разному TC себя ведёт при перезаписи и трудно предсказуемо.
MVV wrote: | мне кажется, что как раз большинство программ удаляют файлы при перезаписи, и что сохранение индекса/атрибутов и т.п. - это чисто особенность тотала | В даннои случае всё наоборот. При распаковке с помощью внешнего WinRAR, при выгруженном TC, жёсткие ссылки НЕ теряются, а именно TC меняет индекс при использовании встроенного unrar.dll.
Проводник при перезаписи одноимённого файла тоже НЕ теряет индекс. |
|
Back to top |
|
 |
CaptainFlint

Joined: 14 Dec 2004 Posts: 6193 Location: Москва
|
(Separately) Posted: Thu Jan 27, 2011 18:07 Post subject: |
|
|
Мне кажется, Гислер реализовал ручное предварительное удаление, например, для того, чтобы самому контролировать перезапись, а не отдавать это на откуп unrar.dll. Или, может быть, в старых версиях (когда unrar был добавлен в Тотал) вообще не было поддержки перезаписи, и Гислеру пришлось явно добавлять код удаления файла. А потом уже интерфейс вырос в самостоятельный WCX, наследующий не только структуру API, но и все остальные поведенческие проблемы.
Мне кажется, имеет смысл явно запросить Гислера. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
 |
GGS
Joined: 02 May 2009 Posts: 322
|
(Separately) Posted: Thu Jan 27, 2011 18:32 Post subject: |
|
|
Пример непредсказуемого (неочевидного) поведения TC
Имеем вложенные архивы:
1 - файл > RAR-архив > ZIP-архив
2 - файл > ZIP-архив > RAR-архив
В первом случае при извлечении и перезаписи индекс файла не меняется, во втором меняется.
CaptainFlint wrote: | Мне кажется, имеет смысл явно запросить Гислера. | Именно к этому я поднял этот вопрос. Возмёте на себя эту миссию? |
|
Back to top |
|
 |
CaptainFlint

Joined: 14 Dec 2004 Posts: 6193 Location: Москва
|
(Separately) Posted: Thu Jan 27, 2011 19:01 Post subject: |
|
|
GGS wrote: | Возмёте на себя эту миссию? |
Предпочёл бы кого-нибудь другого. У меня и так уже в загашнике валяются несколько багов, которые надо зарепортить, да всё времени нет…  _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
 |
MVV

Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
|
(Separately) Posted: Thu Jan 27, 2011 19:41 Post subject: |
|
|
Кстати, насколько я понимаю, в интерфейсе WCX этот вопрос тоже актуален.
Сейчас подебажил - тотал вначале спрашивает, перезаписать ли файл, потом открывает архив, вызывая OpenArchive, потом перечисляет содержимое архива, вызывая ReadHeader, и, когда ReadHeader возвращает структуру с информацией о файле, который юзер извлекает из архива, тотал удаляет результирующий файл и вызывает ProcessFile, указывая результирующий путь.
Причем, если извлекается несколько файлов, тотал спрашивает о перезаписи очередного файла до того как дойдет до него, просматривая архив. О первом спрашивает вообще до открытия архива, потом доходит до него, извлекает, и тут же справшивает о втором, доходит до него, извлекает,.. и так далее. Вообще непонятное поведение - а вдруг архиватор во второй раз вернет список файлов в другом порядке?.. Получается, у тотала уже построен список файлов, которые нужно извлекать, и он тупо идет по списку, причем при переходе к очередному файлу просто продолжает перебирать архив, пока не дойдет до этого файла, совершенно не проверяя, нужно ли извлекать текущий файл, если его имя не совпадает с именем, которое тотал ожидает. ИМХО, разумнее было бы просто перебрать архив, проверяя каждый файл на принадлежность множеству извлекаемых, и для нужных файлов выдавать запрос/вызывать ProcessFile.
Получается, что независимо от того, поддерживает ли архиваторный плагин "мягкую" (назовем это так) перезапись файлов, тотал не предоставляет плагину шанса её использовать. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
 |
GGS
Joined: 02 May 2009 Posts: 322
|
(Separately) Posted: Thu Jan 27, 2011 21:05 Post subject: |
|
|
MVV wrote: | Кстати, насколько я понимаю, в интерфейсе WCX этот вопрос тоже актуален. | Да, подтверждаю. А вот из панелей Virtual Disks (CaptainFlint) и Virtual Panel (MVV) перезапись проходит "мягко". |
|
Back to top |
|
 |
MVV

Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
|
(Separately) Posted: Fri Jan 28, 2011 02:12 Post subject: |
|
|
В модулях файловых систем тотал предоставляет модулю контролировать перезапись - он говорит, что надо извлечь файл туда-то, и ставит флаг необходимости перезаписи. И уже сам модуль перезаписывает файл. Моя Virtual Panel просто вызывает виндовскую функцию CopyFileEx (ведь и исходный, и результирующий пути существуют физически), доверяя ей копирование и перезапись, так что "мягкость" копирования - её заслуга. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|