Всем привет. Прошу подсказать. Формирую реестр информации в эксель на основе файлов на сетевом ресурсе. Вроде бы всё не плохо - перебирает макрос папки, находит нужные файлы и добавляет информацию о них в реестр, кроме момента, что до файлов, которые имеют адрес длиной выше 255 символов, как случайно заметил, добраться не могу, то есть информации нет в реестре. Потом уже понял в чём дело. Архив на сетевом ресурсе, перемещать, переименовывать ни папки, ни файлы не могу. Как можно решить проблемку? Код:
Код
Sub Реестр()
SourceFolder = "\\lan\Архив\"
Set fso = CreateObject("scripting.filesystemobject")
Set curfold = fso.GetFolder(SourceFolder)
If Not curfold Is Nothing Then
For Each sfol_1 In curfold.SubFolders
If sfol_1.Name Like "*Линия*" Then
For Each sfol_2 In sfol_1.SubFolders
If sfol_2.Name Like "L*" Then
For Each sfol_3 In sfol_2.SubFolders
If sfol_3.Name Like "*-D-*" Then
For Each sfol_4 In sfol_3.SubFolders
If sfol_4.Name Like "*утвержден*" Then
For Each fil In sfol_4.Files
If fil.Name Like "*-D-*" Then
'добавление информации в реестр на основе найденного файла
End If
Next
End If
Next
End If
Next
End If
Next
End If
Next
End If
Set fil = Nothing: Set curfold = Nothing: Set fso = Nothing
End Sub
Изменено: Sanja - 03.12.2024 16:01:19(Исправил название Темы. Учтите на будущее)
Проверил сейчас, можно "символическую ссылку" на сетевую папку создать, но для этого нужно повышение прав. Junction тоже создается для сетевой папки, без повышения прав, но не работает.
aie_project написал: не могу создавать сетевые диски,
запрещено политикой мапирование?
можно использовать ROBOCOPY который обходит ограничение и вывод его каталога обрабатывать. Правда там есть другой аспект, кодировка и русские имена, но это через ADODB тоже решаемо.
странно, обычно это не блокируют, А что скажет NET USE ну да ладно. Вариант с robocopy не лишен смысла в этом случае. скрипт получится чуть сложнее но возможно даже быстрее.
БМВ, создание сетевого диска было бы идеальным решением, после совета выше всё перерыл, но администраторами сети ограничен данный функционал.
С robocopy раньше не сталкивался, сейчас почитал, что это особый вид копирования файлов.
У меня просто в данной структуре примерно 3 тысячи файлов, а многие весят и больше 50 Мб (пдф).
В текущем исполнении, находя их, вся нужная информация о них мне доступна с названия файла, части пути к нему и времени их размещения.
Так как архив обновляют другие люди, у меня есть возможность только иметь режим чтения, реестр на основе структуры необходимо ежедневно формировать заново, чтобы не отслеживать все изменения внесенные другими людьми, в связи с чем беспокоюсь, что robocopy у меня будет занимать очень много времени ежедневно.
Читал, что ограничение в 255/260 символов строки можно обойти, как-то их объединяя. В другом макросе формирую список получателей письма, там очень много, что VBA в определенный момент не дает присвоить больше получателей, так я там делаю следующим способом:
И так вроде бы нормально работает, но тут строку формирую я сам, а в моем примере по данной статье, древо папок формируется циклом, и я подумал, может как-то можно тут применить подобный подход.
SUBST тоже запрещен? вроде не требует админовских прав. если не запрещен, им можно было было бы папку с длинным именем, в том числе и сетевую, обозвать вирт. диском (X: какой-нибудь) и уже внутри него работать.
написал: необходимо ежедневно формировать заново, чтобы не отслеживать все изменения внесенные другими людьми,
а нельзя ли тут, как часть процесса, использовать функционал архиваторов (тот же tar к примеру, да все нормальные архиваторы вроде такое умеют делать), который позволяет "архивировать файлы, измененные за последние сутки"? этот архив локально распаковывать, и работать уже с ним, а результат добавлять к предыдущим - как-то так
Спасибо всем за ответы. AlexDen, отдельное большое спасибо, это решило мою проблему. Теперь в реестре появляются те позиции с длинным путем к файлу. БМВ, попробовал в начале SUBST на локальный путь - сформировался по виду прям, как отдельный диск в "Этот компьютер", удалил его, создал на сетевое расположение, тоже сработало, хоть и выглядит не много по другому - раздел не "Устройства и диски", а "Сетевые расположения", и назвался "Отключенное сетевое устройство", но по факту по клику проходит в то место, куда я указал, и по коду тоже отрабатывает нормально, переименовал, как мне надо и красота.
если это решает проблему то тогда мапирование и подстановка самый простой метод, но у него есть ограничение - применение однократное. то есть при черезмерно длинном пути более чем 260x2 символов будет тоже затык.
То есть \\?\ но вот с сетевым не работает не смотря на . https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?source=recommendations&tabs=registry и The "\\?\" prefix can also be used with paths constructed according to the universal naming convention (UNC). To specify such a path using UNC, use the "\\?\UNC\" prefix. For example, "\\?\UNC\server\share", where "server" is the name of the computer and "share" is the name of the shared folder. мне лично к сетевой папке так и неудалось обратится, но вот для использования может быть полезен симбиоз с SUBST
сравните для самого последнего каталога SUBST Y: \\nas3766\home dir Y:\t /s Directory of Y:\ t\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890
и dir \\?\Y:\t /s Directory of \\?\Y:\ t\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890
для сравнения robocopy \\nas3766\home\t c: /L /S /FP New Dir 0 \\nas3766\home\ t\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\
Пока что по получившейся длине я укладываюсь в рамки. Выявился небольшой нюанс, что после перезагрузки виртуальный диск пропадает, можно в ручную каждый день создавать, но захотелось программно. Может кому будет полезно. Сделал вот так:
Код
команда = "SUBST X: ""\\lan\Архив новый\"""
Shell "C:\Windows\System32\cmd.exe /c " & команда