Maximale Pfadlänge in Windows und VBA umgehen?
Hallo,
ich benutze folgenden Code in Excel VBA um mir Dateipfad und Dateiname eines Ordners und allen darin enthaltenen Unterordnern aufzulisten.
(Ihr könnt es testen, den Code einfach in ein Modul kopieren, "MainList" ausführen und einen Ordner eurer Wahl auswählen)
Ich habe jetzt das Problem, dass dieser Code alle Dateien überspringt, deren Pfadlänge über 255 Zeichen lang ist. Einige Dateien überschreiten nämlich die 255 Zeichen mit dem angehängten Dateinamen.
Sie liegen aber dennoch ab. Nur liest VBA diese nicht aus. Kann man da was dran machen?
Sub MainList()
'Updateby Extendoffice
Set Folder = Application.FileDialog(msoFileDialogFolderPicker)
If Folder.Show <> -1 Then Exit Sub
xDir = Folder.SelectedItems(1)
Call ListFilesInFolder(xDir, True)
End Sub
Sub ListFilesInFolder(ByVal xFolderName As String, ByVal xIsSubfolders As Boolean)
Dim xFileSystemObject As Object
Dim xFolder As Object
Dim xSubFolder As Object
Dim xFile As Object
Dim rowIndex As Long
Set xFileSystemObject = CreateObject("Scripting.FileSystemObject")
Set xFolder = xFileSystemObject.GetFolder(xFolderName)
rowIndex = Application.ActiveSheet.Range("A65536").End(xlUp).Row + 1
For Each xFile In xFolder.Files
Application.ActiveSheet.Cells(rowIndex, 1).Formula = xFile.Path
Application.ActiveSheet.Cells(rowIndex, 2).Formula = xFile.Name
rowIndex = rowIndex + 1
Next xFile
If xIsSubfolders Then
For Each xSubFolder In xFolder.SubFolders
ListFilesInFolder xSubFolder.Path, True
Next xSubFolder
End If
Set xFile = Nothing
Set xFolder = Nothing
Set xFileSystemObject = Nothing
End Sub
Function GetFileOwner(ByVal xPath As String, ByVal xName As String)
Dim xFolder As Object
Dim xFolderItem As Object
Dim xShell As Object
xName = StrConv(xName, vbUnicode)
xPath = StrConv(xPath, vbUnicode)
Set xShell = CreateObject("Shell.Application")
Set xFolder = xShell.Namespace(StrConv(xPath, vbFromUnicode))
If Not xFolder Is Nothing Then
Set xFolderItem = xFolder.ParseName(StrConv(xName, vbFromUnicode))
End If
If Not xFolderItem Is Nothing Then
GetFileOwner = xFolder.GetDetailsOf(xFolderItem, 8)
Else
GetFileOwner = ""
End If
Set xShell = Nothing
Set xFolder = Nothing
Set xFolderItem = Nothing
End Function
2 Antworten
VBA benutzt die vom System vorgegebene "Variable" max_path, da geht kaum etwas zu machen.
Was aber möglich ist, die Pfade als Unicode anzugeben. Aus C:\Windows\System32 wird dann zum Beispiel \\?\C:\Windows\System32
Der Nachteil ist allerdings, dass man keine relativen Pfade nutzen kann sondern nur absolute.
Weiß jetzt nicht, wie man das in VB(A) genau realisiert. Habe sowas mal in Delphi gemacht. Die vielen Dateifunktionen alle in eine passende Unicode-Variante zu bringen war nicht gerade lustig.
Nein, daran kannst du nichts ändern. Die 255 Zeichen sind das Maximum. Dateinamen/Pfad kürzen wäre eine Möglichkeit...
habe das schon unter Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (Type: REG_DWORD), versucht, aber erfolglos
Das reicht auch nicht. Siehe mein vorher geschriebener Beitrag.
Nachtrag: NTFS erlaubt Pfadlängen bis zu 65535 Zeichen. Nur eben nicht Ansi- sondern Unicode. Dummerweise benutzen die Dateifunktionen des Win32-API Ansi, also muss man sich entsprechende Wrapper basteln. Dass längere Pfade möglich sind, beweist M$ selbst mit robocopy.
Es geht länger, das System bietet entsprechende Funktionen an. Ist aber tricky.