View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002983 | Far Manager | SymLink/HardLink | public | 2015-04-07 11:48 | 2016-03-22 12:21 |
Reporter | GMax | Assigned To | 2useven10 | ||
Priority | normal | Severity | major | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Platform | x64 | OS | Windows | OS Version | 7 |
Summary | 0002983: Far3, подсчёт размера папки на удалённом компе, глюк с links | ||||
Description | Неправильный подсчёт размера каталога на удалённом компьютере - зацикливается на линках. в частности на профилях пользователей Vista+ | ||||
Steps To Reproduce | Far Manager, version 3.0 (build 4336) Far /m /pd:\emptyfolder cd \\remote-comp\users F3 на папке юзера(Даже Default) - "вечный" подсчёт. в Far2 всё ок. | ||||
Additional Information | [ ] Scan symbolic links”, естественно решает, но Far2 и с включенным работал | ||||
Tags | No tags attached. | ||||
Build | 4563 | ||||
|
У меня не только на удалённом, но и на локальном компе та же ситуация. Обсуждение: http://forum.farmanager.com/viewtopic.php?p=129341#p129341 |
|
у меня оказывается локально воспроизводится если запускать не из под админа - разрешения спрашивает, но зацикливается. а если сразу из под админа запустить - не циклится. |
|
> в Far2 всё ок. > Far2 и с включенным работал Отнюдь нет. Проверьте настройку "System settings/Request administrator rights", у вас наверняка в Far2 и Far3 птички выставлены по-разному. |
|
У меня также нет ничего сетевого, и также на локальном обработка ссылок работает плохо. Есть две проблемы: 1) GetFinalPathNameByHandle зачем-то спрашивает VOLUME_NAME_GUID, а потом TryConvertVolumeGuidToDrivePath (на уровень выше) с ним долго извращается. Во-первых "Volume GUID paths are not created for network shares." и для сетевых путей ничего не получится. Во-вторых путь с диском можно сразу получить указав VOLUME_NAME_DOS. (И это, похоже, годится для сетевых путей.) То есть достаточно вызывать вначале с VOLUME_NAME_DOS, а при возврате 0 перевызывать с VOLUME_NAME_GUID, TryConvertVolumeGuidToDrivePath выше можно выбросить. 2) Для контроля повторений для ссылок используется ConvertNameToReal, а для исходного каталога ConvertNameToReal, а затем NTPath. ConvertNameToReal отдаёт NT путь с буквой диска в верхнем регистре (так его отдаёт система), а NTPath в результате замечательного кода с комментарием // Some file operations fails on Win2k if a drive letter is in upper case переводит букву диска в нижний регистр. В результате такие каталоги будут посчитаны дважды: с буквами диска в разных регистрах. |
|
Да, проверил. влияет галочка №3 System settings/Request administrator rights "use additional privileges" в Far2 была выключена (видимо в процессе апгрейда с версий, которые этой настройки вообще не имели :) а Far3 настраивал с нуля и по дефолту включены все три. При её включенном состоянии циклятся обе версии. |
|
Я описал решение проблемы. Так как официальной реакции нет – придётся собирать самому, кому нужно. |
|
SEt, видимо, прав. Есть задвоение размера и количества файлов. Директории и файлы: Directory of C:\0\3 02.02.2016 16:09 <DIR> . 02.02.2016 16:09 <DIR> .. 02.02.2016 16:09 <DIR> 1 10.04.2012 11:35 9 927 094 file3 1 File(s) 9 927 094 bytes Directory of C:\0\3\1 02.02.2016 16:09 <DIR> . 02.02.2016 16:09 <DIR> .. 02.02.2016 16:06 <JUNCTION> 3 [C:\0\3] 15.08.2012 13:43 17 659 159 file31 1 File(s) 17 659 159 bytes Ctrl-Q: Folder "C:\0\3" Contains: Folders 4 Files 4 Files size 55 172 506 Allocated size 27 590 656 (50%) |
|
Я прав, но предложенное мной простое решение, к сожалению, частичное. От зацикливания помогает, а вот от удвоения – только в некоторых случаях. Проблемы будут если вначале будет пройдена ссылка, а затем то же место встретится просто в иерархии каталогов. Правильное решение такое: 1) Начальный каталог добавляется в список исключений. 2) Обходятся все каталоги, ссылки ставятся в очередь. 3) Берутся ссылки из очереди ссылок и выбрасываются, если их путь начинается с чего-то в списке исключений. 4) Если ещё есть ссылки в очереди – переходим к шагу 1 для каталога первой ссылки. Можно ещё что-нибудь оптимизировать, например, проверять по списку исключений ссылку сразу на шаге 2, но это не причина убирать шаг 3. Ну и приведённые мной два исправления, конечно, также обязательны. |
|
1) Каталоги будут посчитаны дважды потому что ConvertNameToReal режет префикс NTPath - \\?\ 2) ConvertNameToReal обламывается на сетевом линке (скорее всего после server2k3), потому что получает \Device\Mup а не \Device\LanRedirector и не знает что с этим делать. Надо или добавить \Device\Mup в код или действительно попробовать VOLUME_NAME_DOS. 3) Если Lower(disk_letter) нужен для win2k, надо делать его только для win2k. |
|
О разорачивании сетевых ссылок лучше вообще забыть. От того, что мы получим из \\host\share\dir какой-нибудь С:\dir1\dir2 больше вреда, чем пользы. |
|
Мы сейчас из C:\net-links\linkname ничего не получаем. А надо бы получать \\host\share\dirname. |
|
Я у себя \Device\Mup добавил - работает. Но как то у меня нет уверенности, что \Device\LanRedirector и \Device\Mup это всё что может быть. А 'правильного' способа я пока не знаю. |
|
> в результате замечательного кода ... переводит букву диска в нижний регистр > Если Lower(disk_letter) нужен для win2k, надо делать его только для win2k. Самое замечательное то, что я уже не помню, что именно не работало. |
|
> От того, что мы получим из \\host\share\dir какой-нибудь С:\dir1\dir2 больше вреда, чем пользы. Может делать \\host\C$\dir1\dir2 ? |
|
Это уже явное шаманство, хотя в борьбе с зацикливанием должно помочь. Если делать, то тупой заменой, без попыток обнюхать сервер на наличие С$ и т. п. Но симлинки бывают ещё и относительными. Как трактовать какой-нибудь ..\dir в контексте хоста? |
|
Тупой заменой, да. Относительные пути тоже можно простой заменой '\dir\..\' -> '\'. Хотя, мне кажется, винда по symlink через \\host не позволяет ходить, в отличии от junction. Но могу и ошибаться. |
|
На самом деле основная проблема с зацикливанием через \\host в том, что ходить по некоторым линкам в таком режиме можно, а получать реальный путь из них нет. Точнее он якобы получается, но на самом деле просто выдаётся путь самой ссылки вместо настоящего. Можно отсечь такие случаи - просто прекращать рекурсию если реальный путь не получен, тогда зацикливания не будет. Возможно при этом не будут учтены некоторые каталоги, к которым можно пройти. Но это гораздо меньшее зло. |
|
build 4563 на пробу. ВСЕ пройденные реальные пути пишутся в std::set. Это сделано сознательно. Во-первых так не надо учитывать мнооого тонкостей, во-вторых если в ScanTree каталоги можно пропускать то на мой взгляд иначе просто не получится. Но желающие естественно всё это могут оптимизировать. |
Date Modified | Username | Field | Change |
---|---|---|---|
2015-04-07 11:48 | GMax | New Issue | |
2015-04-07 11:57 | HaRT | Note Added: 0013621 | |
2015-04-07 12:28 | GMax | Note Added: 0013622 | |
2015-04-07 14:57 | DrKnS | Note Added: 0013624 | |
2015-04-07 21:04 | SEt | Note Added: 0013626 | |
2015-04-07 21:07 | SEt | Note Edited: 0013626 | |
2015-04-29 13:46 | GMax | Note Added: 0013641 | |
2015-04-29 19:21 | SEt | Note Added: 0013642 | |
2016-01-17 19:17 | 2useven10 | Relationship added | related to 0003157 |
2016-02-02 13:18 | 2useven10 | Note Added: 0014268 | |
2016-02-02 13:19 | 2useven10 | Note Edited: 0014268 | |
2016-02-02 13:20 | 2useven10 | Note Edited: 0014268 | |
2016-02-02 13:21 | 2useven10 | Note Edited: 0014268 | |
2016-02-02 16:18 | SEt | Note Added: 0014269 | |
2016-02-02 16:20 | SEt | Note Edited: 0014269 | |
2016-02-02 16:21 | SEt | Note Edited: 0014269 | |
2016-02-02 16:22 | SEt | Note Edited: 0014269 | |
2016-02-02 16:23 | SEt | Note Edited: 0014269 | |
2016-02-25 16:13 | 2useven10 | Note Added: 0014338 | |
2016-02-25 16:13 | 2useven10 | Note Edited: 0014338 | |
2016-02-25 16:16 | 2useven10 | Note Edited: 0014338 | |
2016-02-25 16:43 | DrKnS | Note Added: 0014339 | |
2016-02-25 16:48 | 2useven10 | Note Added: 0014340 | |
2016-02-25 16:52 | 2useven10 | Note Added: 0014341 | |
2016-02-25 16:53 | 2useven10 | Note Edited: 0014341 | |
2016-02-25 18:31 | DrKnS | Note Added: 0014342 | |
2016-02-25 20:22 | 2useven10 | Note Added: 0014343 | |
2016-02-25 22:17 | DrKnS | Note Added: 0014344 | |
2016-02-25 22:17 | DrKnS | Note Edited: 0014344 | |
2016-02-26 06:55 | 2useven10 | Note Added: 0014345 | |
2016-02-26 15:48 | 2useven10 | Note Added: 0014347 | |
2016-02-26 15:48 | 2useven10 | Note Edited: 0014347 | |
2016-02-26 16:55 | 2useven10 | Note Added: 0014348 | |
2016-02-26 16:55 | 2useven10 | Assigned To | => 2useven10 |
2016-02-26 16:55 | 2useven10 | Status | new => feedback |
2016-03-22 12:21 | 2useven10 | Build | => 4563 |
2016-03-22 12:21 | 2useven10 | Status | feedback => closed |
2016-03-22 12:21 | 2useven10 | Resolution | open => fixed |