Страница 1 из 1

Работа в папках с превышением длины пути

Добавлено: Сб окт 26, 2024 09:13
Monarch-LFV
На работе все в основном используем сетевое хранилище (\\NAS\), и огромную структуру папок. Большинство пользователей не заморачиваются с наименованием папок и файлов и от этого образуются неадекватно длинные пути с длинными названиями папок и файлов.
Известно, что при превышении длины пути >259 символов имеются проблемы с запуском файлов. Знаю, что есть в реестре ключик, отключающий это ограничение, но, во-первых, от расположен в кусте HKLM, поэтому его нельзя сменить без прав администратора. А во-вторых, даже если разрешить длинные пути, то все равно большинство программ не смогут запустить с такого пути файлы даже с "\\?\" ("\\?\UNC\") и не работают практически все плагины WLX, кроме, пожалуй, Ulister.
Я нашел обходной путь - создать виртуальный диск ( A:\ ) командой Subst, укорачивающий реальный путь практически до корня. В таких виртуальных дисках все файлы открываются и сохраняются вообще без проблем, быстрый просмотр также великолепно себя ведет. И удобство соответственно еще в том, что фактически все сохраняемые файлы и являются файлами по длинному пути. Для таких случаев написал скрипт на VBS и навешал на кнопку в панели (кому интересно, могу опубликовать или скинуть в личку).
Также сделал расцветку файлов и папок по правилу с плагином Filex (длина пути)>259. То есть, если я захожу в папку и вижу "коричневые" :) файлы, значит для себя понимаю, что скорее всего они не запустятся из-за этого превышения. В таком случае применяю сделанную мной кнопку.
Но есть определенные неудобства, приходится включать/выключать данный "режим", находясь в такой папке и выходя из нее.
Отсюда вопрос: как можно автоматизировать данный процесс, чтобы при заходе в такую папку, она локализовалась в диск (свободную букву диска), а при выходе - все вернулось на круги своя?
Применение стилей позволяют запускать скрипты, но в Автовыборе стилей нет критерия по длине пути.

Да и вообще, если кто сталкивался с такой проблемой, как ее решали (кроме простого копирования в более короткий путь)?

Добавлено: Вс ноя 03, 2024 11:16
Orion9
Monarch-LFV
Если каталогов, которые вам действительно нужны и с которыми вы работаете, не так много, то можно попробовать создать на них симлинки в отдельном локальном каталоге. А из алгоритмов... ну разве что цикл запустить, в котором каждые 200-300 млс проверять текущий путь в панели и его длину, и если он (этот путь) превышает необходимый, то запускать скрипт с монтированием диска А:\ в соседней панели. Но, по-моему, это будет перебор :) Наверное, надо что-то другое думать. Может даже, на зарубежный форум стоит написать...

Добавлено: Вс ноя 03, 2024 14:48
Monarch-LFV
Orion9
Нет, каталоги постоянно разные, это сетевой диск, а соответственно, такие папки могут быть в разных местах. На сайт Гислера написал, но там нет заинтересованных, кто мог бы поддержать, видимо немногие с таким сталкиваются. Свой скрипт усовершенствовал, в принципе делает свое дело, мне этого достаточно. Выкладываю скрипт VBS, вдруг кому пригодится:

Код: Выделить всё

' Создать виртуальный диск [A]:\ с текущей директорией для обхода ошибки при превышении длины пути
' Буква диска присваивается авоматически (ближайшая свободная)
' Если диск (например, "A:\") уже создан командой Subst и является текущим в панели ТС, то диск будет размонтирован
' Если диск (например, "A:\") уже создан командой Subst, но НЕ является текущим в панели ТС, то создастся новая буква диска на текущую папку
' параметры: %P%N

On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")

TCP = WshShell.ExpandEnvironmentStrings("%commander_exe%")
TMPfl = WshShell.ExpandEnvironmentStrings("%temp%") & "\~$LongPathTC.txt"
TMPflAVD = WshShell.ExpandEnvironmentStrings("%temp%") & "\~$LongPathTC_AllVirtDisk.txt"
fullpath = WScript.Arguments(0)
fld = Left(fullpath, InStrRev(fullpath, "\")-1)
fldbegin = fld
cursorFile = FSO.GetFilename(fullpath)

WshShell.run "cmd /c subst>" & TMPflAVD , 0, True
Set TMPAVD = FSO.OpenTextFile(TMPflAVD, 1, True, 0): AllVirtDisk = TMPAVD.ReadAll: TMPAVD.Close

AllDisks= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i=1 to len(AllDisks)
  DiskLetter=mid(AllDisks, i, 1)
  if instr(AllVirtDisk, DiskLetter & ":\:") then VirtDisk = VirtDisk & DiskLetter
  if not FSO.FolderExists(DiskLetter & ":\") and disk ="" then Disk = DiskLetter
Next
FSO.deletefile(TMPflAVD)

If instr(VirtDisk, Ucase(left(fld, 1))) then
  Disk = Ucase(left(fld, 1))
  Set TMPsv = FSO.OpenTextFile(TMPfl & Disk, 1, True, -1): fldOld = TMPsv.ReadAll: TMPsv.Close    
  CurPath = replace (fld, Disk & ":", "")
  if Ucase(left(fld, 2)) = Disk & ":" then WshShell.run """" & TCP & """ /O /S /A """ & fldOld & CurPath & "\" & cursorFile & """", 1, true
  WshShell.run "cmd /c subst " & Disk & ": /d", 0 , true
  FSO.deletefile(TMPfl & Disk)
else
  for i=1 to 100
    WshShell.run "cmd /c chcp 65001&&subst " & ucase(Disk) & ": " & """" & fld & """", 0 , true
    if FSO.FolderExists(Disk & ":\") then 
      WshShell.run """" & TCP & """ /O /S /A """ & Disk & ":\" & fldpth & "\" & cursorFile & """"
      Set TMPsv = FSO.OpenTextFile(TMPfl & Disk, 2, True, -1): TMPsv.Write(fld & "\"): TMPsv.Close
      exit for
    else
      fld=left(fld, InStrRev(fld, "\")-1)
      fldpth=mid(fldbegin, len(fld)+2, len(fldbegin))
    end if
  next
End if
PS. Модератору: С удовольствием оформил бы в спойлер, да вот беда, забыл какой BBCode для него, к сожалению, не нашел в справке (правилах) на форуме. Подскажите плиз как оформляется и опишите в правилах, если этого там нет.

Добавлено: Вс ноя 03, 2024 17:34
Orion9
Monarch-LFV

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

Странно, что никто не отозвался на зарубежном форуме. Неужели сам Маэстро или кто-то из долгожителей не сталкивался с этой проблемой? Я не сталкивался, но у меня скромные задачи :)

А если ваш скрипт завязать как-то на WinScript Advanced, не думали?

Добавлено: Вс ноя 03, 2024 17:43
Monarch-LFV
Orion9
Честно говоря, на сайте Гислера я выдвигал немного другие решения проблемы, но суть самой проблемы та же. К сожалению, это оказалось там вообще никому не интересно. А по поводу WinScriptADV - не пойму, как это может помочь? Как и написал в первом посте, сделал только расцветку файлов с помощью плагина Filex.

Добавлено: Вс ноя 03, 2024 17:50
Orion9
А по поводу WinScriptADV - не пойму, как это может помочь?
Если я правильно помню, он позволяет делать свои поля, т.е. запускать для каждого файла в каталоге скрипт при его считывании. Соответственно, можно в скрипте делать проверку на длину пути и файла, и если она больше, чем нужно, запускать ваш скрипт с монтированием этой папки в виртуальный диск.

Добавлено: Вс ноя 03, 2024 18:03
Monarch-LFV
Orion9
Да, но для этого потребуется выводить соответствующие поля, чтобы активизировать сам плагин и скрипт. То есть по сути по умолчанию держать пользовательский набор колонок с колонкой winscriptADV, что не очень хочется. Плюс имеются ограничения плагина при работе с VBS, например нельзя вывести msgbox. Думаю, и запуск более сложного скрипта с командой subst и прочими условиями тоже может оказаться невозможным. Но это надо тестировать. В любом случае, пока куда проще иметь расцветку и в случае необходимости просто вызывать скрипт. Тут помог бы автобыбор стилей, но там нет такого критерия. Ну и конечно для этого логику скрипта придется переделать полностью.

Добавлено: Вс ноя 03, 2024 18:25
Orion9
Monarch-LFV
Вот здесь я, помню, эксперементировал с плагином Script
viewpost.php?p=136837
Думаю, он больше может подойти для задачи, т.к. я слышал, что он более скоростной, чем WinScriptADV.

Ведь необязательно заполнять поле content чем-то реальным, зато можно использовать тот факт, что каждый файл возвращается в переменную filename, которую можно обработать, вычислить путь, длину и запустить монтирование. Как поведет себя ТС при своем перезапуске - не известно. Надо тестировать :) Но зато можно будет сделать отдельный набор колонок, который и будет запускать скрипт по требованию, т.е. как вы сами знаете, что идете на NAS.

Добавлено: Вс ноя 03, 2024 18:29
Monarch-LFV
Orion9
Спасибо за идею, буду еще думать как усовершенствовать.

Добавлено: Пн ноя 04, 2024 11:10
Orion9
Плюс имеются ограничения плагина при работе с VBS, например нельзя вывести msgbox
В плагине Script вроде все работает. Сейчас вставил в свой пример MsgBox filename - останавливается как надо строка за строкой при заполнении панели. Вероятно, можно из этого выжать и большее, т.е. диалоговое окно "Да-Нет" с запросом на монтирование, только надо подумать, как реагировать на "Нет" и где хранить глобальные данные. Но учитывая то, что обработка данных идет постраничная, а не весь каталог сразу, то, возможно, придется искать другие решения и способы. В конце концов, может и правда проще хоткей повесить и менять режим просмотра вручную, когда оно требуется.

Добавлено: Пн ноя 04, 2024 11:54
Monarch-LFV
Orion9 писал(а):проще хоткей повесить и менять режим просмотра вручную, когда оно требуется.
Я тоже уже к этому пришел, меньше заморочек.

Добавлено: Вт ноя 05, 2024 23:38
CaptainFlint
Monarch-LFV писал(а):PS. Модератору: С удовольствием оформил бы в спойлер, да вот беда, забыл какой BBCode для него, к сожалению, не нашел в справке (правилах) на форуме. Подскажите плиз как оформляется и опишите в правилах, если этого там нет.
Да, информацию о тегах так и не дошли руки добавить.

Код: Выделить всё

[cut]тут спойлер[/cut]

[cut="Заголовок"]тут спойлер с собственным заголовком[/cut]

Добавлено: Ср ноя 06, 2024 00:00
Monarch-LFV
CaptainFlint
Точно, спасибо! Если не сложно, добавьте в справку пожалуйста.

Добавлено: Ср ноя 06, 2024 10:25
Orion9
CaptainFlint
А какие еще есть неочевидные тэги? Я тут недавно заметил, что работает тэг [s], но в справке о нем тоже нет упоминаний. Есть ли еще что-то, о чем следует знать?

Сорри за оффтоп, но хотелось бы весь список, пожалуйста :)