Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 323

Post (Separately) Posted: Sat Oct 26, 2024 10:13    Post subject: Работа в папках с превышением длины пути Reply with quote

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

Да и вообще, если кто сталкивался с такой проблемой, как ее решали (кроме простого копирования в более короткий путь)?
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 772

Post (Separately) Posted: Sun Nov 03, 2024 12:16    Post subject: Reply with quote

Monarch-LFV
Если каталогов, которые вам действительно нужны и с которыми вы работаете, не так много, то можно попробовать создать на них симлинки в отдельном локальном каталоге. А из алгоритмов... ну разве что цикл запустить, в котором каждые 200-300 млс проверять текущий путь в панели и его длину, и если он (этот путь) превышает необходимый, то запускать скрипт с монтированием диска А:\ в соседней панели. Но, по-моему, это будет перебор Smile Наверное, надо что-то другое думать. Может даже, на зарубежный форум стоит написать...
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 323

Post (Separately) Posted: Sun Nov 03, 2024 15:48    Post subject: Reply with quote

Orion9
Нет, каталоги постоянно разные, это сетевой диск, а соответственно, такие папки могут быть в разных местах. На сайт Гислера написал, но там нет заинтересованных, кто мог бы поддержать, видимо немногие с таким сталкиваются. Свой скрипт усовершенствовал, в принципе делает свое дело, мне этого достаточно. Выкладываю скрипт VBS, вдруг кому пригодится:
Code:
' Создать виртуальный диск [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 для него, к сожалению, не нашел в справке (правилах) на форуме. Подскажите плиз как оформляется и опишите в правилах, если этого там нет.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 772

Post (Separately) Posted: Sun Nov 03, 2024 18:34    Post subject: Reply with quote

Monarch-LFV

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

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

А если ваш скрипт завязать как-то на WinScript Advanced, не думали?
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 323

Post (Separately) Posted: Sun Nov 03, 2024 18:43    Post subject: Reply with quote

Orion9
Честно говоря, на сайте Гислера я выдвигал немного другие решения проблемы, но суть самой проблемы та же. К сожалению, это оказалось там вообще никому не интересно. А по поводу WinScriptADV - не пойму, как это может помочь? Как и написал в первом посте, сделал только расцветку файлов с помощью плагина Filex.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 772

Post (Separately) Posted: Sun Nov 03, 2024 18:50    Post subject: Reply with quote

Quote:
А по поводу WinScriptADV - не пойму, как это может помочь?

Если я правильно помню, он позволяет делать свои поля, т.е. запускать для каждого файла в каталоге скрипт при его считывании. Соответственно, можно в скрипте делать проверку на длину пути и файла, и если она больше, чем нужно, запускать ваш скрипт с монтированием этой папки в виртуальный диск.
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 323

Post (Separately) Posted: Sun Nov 03, 2024 19:03    Post subject: Reply with quote

Orion9
Да, но для этого потребуется выводить соответствующие поля, чтобы активизировать сам плагин и скрипт. То есть по сути по умолчанию держать пользовательский набор колонок с колонкой winscriptADV, что не очень хочется. Плюс имеются ограничения плагина при работе с VBS, например нельзя вывести msgbox. Думаю, и запуск более сложного скрипта с командой subst и прочими условиями тоже может оказаться невозможным. Но это надо тестировать. В любом случае, пока куда проще иметь расцветку и в случае необходимости просто вызывать скрипт. Тут помог бы автобыбор стилей, но там нет такого критерия. Ну и конечно для этого логику скрипта придется переделать полностью.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 772

Post (Separately) Posted: Sun Nov 03, 2024 19:25    Post subject: Reply with quote

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

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


Last edited by Orion9 on Sun Nov 03, 2024 19:29; edited 1 time in total
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 323

Post (Separately) Posted: Sun Nov 03, 2024 19:29    Post subject: Reply with quote

Orion9
Спасибо за идею, буду еще думать как усовершенствовать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 772

Post (Separately) Posted: Mon Nov 04, 2024 12:10    Post subject: Reply with quote

Quote:
Плюс имеются ограничения плагина при работе с VBS, например нельзя вывести msgbox

В плагине Script вроде все работает. Сейчас вставил в свой пример MsgBox filename - останавливается как надо строка за строкой при заполнении панели. Вероятно, можно из этого выжать и большее, т.е. диалоговое окно "Да-Нет" с запросом на монтирование, только надо подумать, как реагировать на "Нет" и где хранить глобальные данные. Но учитывая то, что обработка данных идет постраничная, а не весь каталог сразу, то, возможно, придется искать другие решения и способы. В конце концов, может и правда проще хоткей повесить и менять режим просмотра вручную, когда оно требуется.
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 323

Post (Separately) Posted: Mon Nov 04, 2024 12:54    Post subject: Reply with quote

Orion9 wrote:
проще хоткей повесить и менять режим просмотра вручную, когда оно требуется.

Я тоже уже к этому пришел, меньше заморочек.
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6190
Location: Москва

Post (Separately) Posted: Wed Nov 06, 2024 00:38    Post subject: Reply with quote

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

Да, информацию о тегах так и не дошли руки добавить.
Code:
[cut]тут спойлер[/cut]

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

_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 323

Post (Separately) Posted: Wed Nov 06, 2024 01:00    Post subject: Reply with quote

CaptainFlint
Точно, спасибо! Если не сложно, добавьте в справку пожалуйста.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 772

Post (Separately) Posted: Wed Nov 06, 2024 11:25    Post subject: Reply with quote

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

Сорри за оффтоп, но хотелось бы весь список, пожалуйста Smile
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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