View Issue Details

IDProjectCategoryView StatusLast Update
0002983Far ManagerSymLink/HardLinkpublic2016-03-22 12:21
ReporterGMax Assigned To2useven10  
PrioritynormalSeveritymajorReproducibilityalways
Status closedResolutionfixed 
Platformx64OSWindowsOS Version7
Summary0002983: Far3, подсчёт размера папки на удалённом компе, глюк с links
DescriptionНеправильный подсчёт размера каталога на удалённом компьютере - зацикливается на линках.
в частности на профилях пользователей Vista+
Steps To ReproduceFar Manager, version 3.0 (build 4336)

Far /m /pd:\emptyfolder
cd \\remote-comp\users

F3 на папке юзера(Даже Default) - "вечный" подсчёт. в Far2 всё ок.
Additional Information[ ] Scan symbolic links”, естественно решает, но Far2 и с включенным работал
TagsNo tags attached.
Build4563

Relationships

related to 0003157 closed2useven10 Ошибки при подсчете суммарного размера выделенных папок (F3) при наличии связей/ссылок 

Activities

HaRT

2015-04-07 11:57

reporter   bugnote:0013621

У меня не только на удалённом, но и на локальном компе та же ситуация.
Обсуждение: http://forum.farmanager.com/viewtopic.php?p=129341#p129341

GMax

2015-04-07 12:28

reporter   bugnote:0013622

у меня оказывается локально воспроизводится если запускать не из под админа - разрешения спрашивает, но зацикливается. а если сразу из под админа запустить - не циклится.

DrKnS

2015-04-07 14:57

administrator   bugnote:0013624

> в Far2 всё ок.
> Far2 и с включенным работал

Отнюдь нет.

Проверьте настройку "System settings/Request administrator rights", у вас наверняка в Far2 и Far3 птички выставлены по-разному.

SEt

2015-04-07 21:04

reporter   bugnote:0013626

Last edited: 2015-04-07 21:07

У меня также нет ничего сетевого, и также на локальном обработка ссылок работает плохо.

Есть две проблемы:

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
переводит букву диска в нижний регистр. В результате такие каталоги будут посчитаны дважды: с буквами диска в разных регистрах.

GMax

2015-04-29 13:46

reporter   bugnote:0013641

Да, проверил. влияет галочка №3
System settings/Request administrator rights

"use additional privileges" в Far2 была выключена (видимо в процессе апгрейда с версий, которые этой настройки вообще не имели :)

а Far3 настраивал с нуля и по дефолту включены все три.
При её включенном состоянии циклятся обе версии.

SEt

2015-04-29 19:21

reporter   bugnote:0013642

Я описал решение проблемы. Так как официальной реакции нет – придётся собирать самому, кому нужно.

2useven10

2016-02-02 13:18

developer   bugnote:0014268

Last edited: 2016-02-02 13:21

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%)

SEt

2016-02-02 16:18

reporter   bugnote:0014269

Last edited: 2016-02-02 16:23

Я прав, но предложенное мной простое решение, к сожалению, частичное. От зацикливания помогает, а вот от удвоения – только в некоторых случаях.

Проблемы будут если вначале будет пройдена ссылка, а затем то же место встретится просто в иерархии каталогов. Правильное решение такое:
1) Начальный каталог добавляется в список исключений.
2) Обходятся все каталоги, ссылки ставятся в очередь.
3) Берутся ссылки из очереди ссылок и выбрасываются, если их путь начинается с чего-то в списке исключений.
4) Если ещё есть ссылки в очереди – переходим к шагу 1 для каталога первой ссылки.

Можно ещё что-нибудь оптимизировать, например, проверять по списку исключений ссылку сразу на шаге 2, но это не причина убирать шаг 3.

Ну и приведённые мной два исправления, конечно, также обязательны.

2useven10

2016-02-25 16:13

developer   bugnote:0014338

Last edited: 2016-02-25 16:16

1) Каталоги будут посчитаны дважды потому что ConvertNameToReal режет префикс NTPath - \\?\

2) ConvertNameToReal обламывается на сетевом линке (скорее всего после server2k3),
   потому что получает \Device\Mup а не \Device\LanRedirector и не знает что с этим делать.
   Надо или добавить \Device\Mup в код или действительно попробовать VOLUME_NAME_DOS.

3) Если Lower(disk_letter) нужен для win2k, надо делать его только для win2k.

DrKnS

2016-02-25 16:43

administrator   bugnote:0014339

О разорачивании сетевых ссылок лучше вообще забыть.
От того, что мы получим из \\host\share\dir какой-нибудь С:\dir1\dir2 больше вреда, чем пользы.

2useven10

2016-02-25 16:48

developer   bugnote:0014340

Мы сейчас из C:\net-links\linkname ничего не получаем.
А надо бы получать \\host\share\dirname.

2useven10

2016-02-25 16:52

developer   bugnote:0014341

Last edited: 2016-02-25 16:53

Я у себя \Device\Mup добавил - работает.
Но как то у меня нет уверенности, что \Device\LanRedirector и \Device\Mup это всё что может быть.
А 'правильного' способа я пока не знаю.

DrKnS

2016-02-25 18:31

administrator   bugnote:0014342

> в результате замечательного кода ... переводит букву диска в нижний регистр
> Если Lower(disk_letter) нужен для win2k, надо делать его только для win2k.

Самое замечательное то, что я уже не помню, что именно не работало.

2useven10

2016-02-25 20:22

developer   bugnote:0014343

> От того, что мы получим из \\host\share\dir какой-нибудь С:\dir1\dir2 больше вреда, чем пользы.

Может делать \\host\C$\dir1\dir2 ?

DrKnS

2016-02-25 22:17

administrator   bugnote:0014344

Last edited: 2016-02-25 22:17

Это уже явное шаманство, хотя в борьбе с зацикливанием должно помочь.
Если делать, то тупой заменой, без попыток обнюхать сервер на наличие С$ и т. п.

Но симлинки бывают ещё и относительными.
Как трактовать какой-нибудь ..\dir в контексте хоста?

2useven10

2016-02-26 06:55

developer   bugnote:0014345

Тупой заменой, да.
Относительные пути тоже можно простой заменой '\dir\..\' -> '\'.
Хотя, мне кажется, винда по symlink через \\host не позволяет ходить, в отличии от junction.
Но могу и ошибаться.

2useven10

2016-02-26 15:48

developer   bugnote:0014347

Last edited: 2016-02-26 15:48

На самом деле основная проблема с зацикливанием через \\host в том, что ходить по некоторым линкам в таком режиме можно, а получать реальный путь из них нет. Точнее он якобы получается, но на самом деле просто выдаётся путь самой ссылки вместо настоящего. Можно отсечь такие случаи - просто прекращать рекурсию если реальный путь не получен, тогда зацикливания не будет. Возможно при этом не будут учтены некоторые каталоги, к которым можно пройти. Но это гораздо меньшее зло.

2useven10

2016-02-26 16:55

developer   bugnote:0014348

build 4563 на пробу.

ВСЕ пройденные реальные пути пишутся в std::set.
Это сделано сознательно. Во-первых так не надо учитывать мнооого тонкостей, во-вторых
если в ScanTree каталоги можно пропускать то на мой взгляд иначе просто не получится.
Но желающие естественно всё это могут оптимизировать.

Issue History

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