Это потребовало некоторого творческого программирования, но использование ShortPath
было ответом.
Этот инструмент должен был создать список каждой папки и файла в корневой папке, файлы также отображали их размер и даты создания/изменения. Проблема заключалась в том, что когда результирующий путь к файлу или папке превышал 260, возникала ошибка Error 76: Path Not Found
, и код не захватывал содержимое этой области.
Использование Microsoft Scripting Runtime (FSO) ShortPath
помогло бы обойти эту проблему, но путь пошел от удобочитаемого к закодированному:
Полный путь \\ServerName00000\Root_Root_contentmanagement\DPT\STANDARDS_GUIDELINES\VENDOR_CERTIFICATION_FILES\PDFX_CERTIFICATION_ALL\2006_2007\DPT\CompantName0\Approved\Quark\India under Colonial Rule_structure sample\058231738X\Douglas M. Peers_01_058231738X\SUPPORT\ADDITIONAL INFORMATION\IUC-XTG & XML file
Короткий путь \\lo3uppesaapp001\pesa_cmcoe_contentmanagement\CTS\S4SJ05~5\V275SE~8\PDM5D9~G\2N52EQ~5\HPE\GS9C6L~U\Approved\Quark\IQPSJ5~F\0CWHH1~G\DOFNHA~8\SUPPORT\A6NO7S~K\IUC-XTG & XML file
(Обратите внимание, что я изменил полный путь для защиты IP и информации о компании, но размер остался прежним)
Вы можете видеть, что в то время как я мог передать короткий путь кому-то, и они могли поместить его в проводник Windows, чтобы добраться туда, они бы знали, куда он ушел, просто взглянув, чтобы обойти это использовал глобальную переменную, которая сохраняла путь к папке как полная строка и последовал за тем, что делал короткий путь. эта строка - это то, что я вывожу пользователю. Приведенный ниже код урезан, но показывает, как я этого добился.
Короткий ответ: ShortPath
в FSO решит проблему, но путь будет некрасивым.
Dim FS As New FileSystemObject
Dim LngRow As Long
Dim StrFolderPath As String
Dim WkBk As Excel.Workbook
Dim WkSht As Excel.Worksheet
Public Sub Run_Master()
Set WkBk = Application.Workbooks.Add
WkBk.SaveAs ThisWorkbook.Path & "\Data.xlsx"
Set WkSht = WkBk.Worksheets(1)
WkSht.Range("A1") = "Path"
WkSht.Range("B1") = "File Name"
WkSht.Range("C1") = "Size (KB)"
WkSht.Range("D1") = "Created"
WkSht.Range("E1") = "Modified"
LngRow = 2
Run "\\ServerName00000\AREA_DEPT0_TASK000"
Set WkSht = Nothing
WkBk.Close 1
Set WkBk = Nothing
MsgBox "Done!"
End Sub
Private Sub Run(ByVal StrVolumeToCheck As String)
Dim Fldr As Folder
Dim Fldr2 As Folder
Set Fldr = FS.GetFolder(StrVolumeToCheck)
'This is the variable that follows the full path name
StrFolderPath = Fldr.Path
WkSht.Range("A" & LngRow) = StrFolderPath
LngRow = LngRow +1
For Each Fldr2 In Fldr.SubFolders
If (Left(Fldr2.Name, 1) <> ".") And (UCase(Trim(Fldr2.Name)) <> "LOST+FOUND") Then
ProcessFolder Fldr2.Path
End If
Next
Set Fldr = Nothing
End Sub
Private Sub ProcessFolder(ByVal StrFolder As String)
'This is the one that will will be called recursively to list all files and folders
Dim Fls As Files
Dim Fl As File
Dim Fldrs As Folders
Dim Fldr As Folder
Dim RootFldr As Folder
Set RootFldr = FS.GetFolder(StrFolder)
If (RootFldr.Name <> "lost+found") And (Left(RootFldr.Name, 1) <> ".") Then
'Add to my full folder path
StrFolderPath = StrFolderPath & "\" & RootFldr.Name
WkSht.Range("A" & LngRow) = StrFolderPath
WkSht.Range("D1") = RootFldr.DateCreated
WkSht.Range("E1") = RootFldr.DateLastModified
Lngrow = LngRow + 1
'This uses the short path to get the files in FSO
Set Fls = FS.GetFolder(RootFldr.ShortPath).Files
For Each Fl In Fls
'This output our string variable of the path (i.e. not the short path)
WkSht.Range("A" & LngRow) = StrFolderPath
WkSht.Range("B" & LngRow) = Fl.Name
WkSht.Range("C" & LngRow) = Fl.Size /1024 '(bytes to kilobytes)
WkSht.Range("D" & LngRow) = Fl.DateCreated
WkSht.Range("E" & LngRow) = Fl.DateLastModified
LngRow = LngRow + 1
Next
Set Fls = Nothing
'This uses the short path to get the sub-folders in FSO
Set Fldrs = FS.GetFolder(RootFldr.ShortPath).SubFolders
For Each Fldr In Fldrs
'Recurse this Proc
ProcessFolder Fldr.Path
DoEvents
Next
Set Fldrs = Nothing
'Now we have processed this folder, trim the folder name off of the string
StrFolderPath = Left(StrFolderPath, Len(StrFolderPath) - Len(RootFldr.Name)+1)
End If
Set RootFldr = Nothing
End Sub
Как уже упоминалось, это урезанная версия кода, которая работает для меня, чтобы проиллюстрировать метод, используемый для преодоления этого ограничения. На самом деле кажется довольно элементарным, как только я это сделал.
person
Gary Evans
schedule
25.07.2016
shortpath
, чтобы пройти через это. Это разрушает путь (делает его нечитаемым/пригодным для использования человеком), но я думаю, что мог бы написать что-нибудь, чтобы это исправить. - person Gary Evans   schedule 25.07.2016PUSHD
иPOPD
в WshSell, потому что командаDIR
очень хорошо оптимизирована для поиска в каталогах (намного быстрее, чем использование FSO). Однако, как только я увидел ответ Ганса, это было бессмысленно. Его намного лучше. - person Tim   schedule 26.07.2016