Страницы: 1
RSS
VBA. Обойти ограничение на длину пути к файлу в 255 символов
 
Всем привет.
Прошу подсказать.
Формирую реестр информации в эксель на основе файлов на сетевом ресурсе.
Вроде бы всё не плохо - перебирает макрос папки, находит нужные файлы и добавляет информацию о них в реестр, кроме момента, что до файлов, которые имеют адрес длиной выше 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 (Исправил название Темы. Учтите на будущее)
 
Сетевую папку \\lan\Архив\ смонтировать как сетевой диск, после того как сформировался реестр, пройтись по нему с заменой имени диска на \\lan\Архив\
 
irabel, на рабочем ПК, к сожалению, не могу создавать сетевые диски, тоже читал об этом способе.

Может еще идеи есть?
 
Вот тут еще с бубном с 7zip танцы есть
Согласие есть продукт при полном непротивлении сторон
 
Проверил сейчас, можно "символическую ссылку" на сетевую папку создать, но для этого нужно повышение прав. Junction тоже создается для сетевой папки, без повышения прав, но не работает.
 
Sanja, ну да, и правда, танцы... :)
 
Цитата
aie_project написал:
не могу создавать сетевые диски,
запрещено политикой мапирование?

можно использовать ROBOCOPY который обходит ограничение и вывод его каталога обрабатывать. Правда там есть другой аспект, кодировка и русские имена, но это через ADODB тоже решаемо.
По вопросам из тем форума, личку не читаю.
 
aie_project, так там по ссылке ниже есть вариант без танцев.
 
Цитата
написал:
запрещено политикой мапирование?
БМВ, права администратора требуются, которых нет.
 
странно, обычно это не блокируют,
А что скажет
NET USE
ну да ладно. Вариант с robocopy не лишен смысла в этом случае. скрипт получится чуть сложнее но возможно даже быстрее.

robocopy "\\lan\Архив\" c: /S /L /FP
Изменено: БМВ - 03.12.2024 19:58:18
По вопросам из тем форума, личку не читаю.
 
БМВ, создание сетевого диска было бы идеальным решением, после совета выше всё перерыл, но администраторами сети ограничен данный функционал.

С robocopy раньше не сталкивался, сейчас почитал, что это особый вид копирования файлов.

У меня просто в данной структуре примерно 3 тысячи файлов, а многие весят и больше 50 Мб (пдф).

В текущем исполнении, находя их, вся нужная информация о них мне доступна с названия файла, части пути к нему и времени их размещения.

Так как архив обновляют другие люди, у меня есть возможность только иметь режим чтения, реестр на основе структуры необходимо ежедневно формировать заново, чтобы не отслеживать все изменения внесенные другими людьми, в связи с чем беспокоюсь, что robocopy у меня будет занимать очень много времени ежедневно.

Читал, что ограничение в 255/260 символов строки можно обойти, как-то их объединяя. В другом макросе формирую список получателей письма, там очень много, что VBA в определенный момент не дает присвоить больше получателей, так я там делаю следующим способом:
Код
копия = "много получателей";
копия = копия + "еще кучка получателей";
Item.CC = копия
И так вроде бы нормально работает, но тут строку формирую я сам, а в моем примере по данной статье, древо папок формируется циклом, и я подумал, может как-то можно тут применить подобный подход.
 
SUBST тоже запрещен? вроде не требует админовских прав. если не запрещен, им можно было было бы папку с длинным именем, в том числе и сетевую, обозвать вирт. диском (X: какой-нибудь) и уже внутри него работать.
Изменено: AlexDen - 04.12.2024 08:38:08
 
Цитата
написал:
необходимо ежедневно формировать заново, чтобы не отслеживать все изменения внесенные другими людьми,
а нельзя ли тут, как часть процесса, использовать функционал архиваторов (тот же tar к примеру, да все нормальные архиваторы вроде такое умеют делать), который позволяет "архивировать файлы, измененные за последние сутки"? этот архив локально распаковывать, и работать уже с ним, а результат добавлять к предыдущим - как-то так
Изменено: AlexDen - 04.12.2024 08:44:31
 
Цитата
написал:
SUBST
Про это почитаю.
Про архиватор из-за того, что сеть и большие объемы файлов могут быть, проблематично может быть.
 
SUBST работает с локальным диском

robocopy c указанным ключом L только выводит список без копирования.
/FP - вывод полного пути файла

то есть  будет от 3000 строк, которые просто нужно разобрать. Как их получить - дело вкуса. или в файл выгрузить или шелом считать через exec.
По вопросам из тем форума, личку не читаю.
 
Спасибо всем за ответы.
AlexDen, отдельное большое спасибо, это решило мою проблему. Теперь в реестре появляются те позиции с длинным путем к файлу.
БМВ, попробовал в начале SUBST на локальный путь - сформировался по виду прям, как отдельный диск в "Этот компьютер", удалил его, создал на сетевое расположение, тоже сработало, хоть и выглядит не много по другому - раздел не "Устройства и диски", а "Сетевые расположения", и назвался "Отключенное сетевое устройство", но по факту по клику проходит в то место, куда я указал, и по коду тоже отрабатывает нормально, переименовал, как мне надо и красота.
 
Цитата
aie_project написал:
как мне надо и красота.
если это решает проблему то тогда мапирование и подстановка самый простой метод, но у него есть ограничение  - применение однократное. то есть при черезмерно длинном пути более чем 260x2 символов будет тоже затык.

однако , для обращения можно использовать несколько вариантов нотаций и ограничения по длине пути в однм из них отсутсвует. щас не могу расписывать или искать, поищите sokol92  сообщение на эту тему писал точно.
https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN

То есть \\?\ но вот с сетевым не работает не смотря на .
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\123­4567890\1234567890\1234567890\1234567890\1234567890\12345678­90\1234567890\1234567890\1234567890\1234567890\1234567890\12­34567890\1234567890\1234567890\1234567890\1234567890\1234567­890\1234567890

и
dir \\?\Y:\t /s
Directory of \\?\Y:\
t\1234567890\1234567890\1234567890\1234567890\1234567890\123­4567890\1234567890\1234567890\1234567890\1234567890\12345678­90\1234567890\1234567890\1234567890\1234567890\1234567890\12­34567890\1234567890\1234567890\1234567890\1234567890\1234567­890\1234567890\1234567890\1234567890\1234567890\1234567890\1­234567890\1234567890\1234567890\1234567890\1234567890\123456­7890\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\123­4567890\1234567890\1234567890\1234567890\1234567890\12345678­90\1234567890\1234567890\1234567890\1234567890\1234567890\12­34567890\1234567890\1234567890\1234567890\1234567890\1234567­890\1234567890\1234567890\1234567890\1234567890\1234567890\1­234567890\1234567890\1234567890\1234567890\1234567890\123456­7890\1234567890\1234567890\1234567890\1234567890\1234567890\­1234567890\1234567890\1234567890\1234567890\1234567890\
Изменено: БМВ - 04.12.2024 20:03:58
По вопросам из тем форума, личку не читаю.
 
Пока что по получившейся длине я укладываюсь в рамки.
Выявился небольшой нюанс, что после перезагрузки виртуальный диск пропадает, можно в ручную каждый день создавать, но захотелось программно.
Может кому будет полезно. Сделал вот так:
Код
команда = "SUBST X: ""\\lan\Архив новый\"""

Shell "C:\Windows\System32\cmd.exe /c " & команда
Страницы: 1
Наверх