Verzeichnis nach zu langen Pad/Dateinamen prüfen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Verzeichnis nach zu langen Pad/Dateinamen prüfen
von: jockel
Geschrieben am: 16.06.2015 15:28:11

Hallo,
ist es mit VBA möglich, ein bestimmtes Verzeichnis (inkl. Unterverzeichnissen) nach allen Dateien zu durchsuchen, und alle Dateien aufzulisten, deren Pfadname (inkl. Datename) grösser als 255 Zeichen lang sind.
Ich weiß, ist nicht gerade die klassische Anwendung für Excel, würde mir aber trotzdem viel helfen :-)
hat da jemand eine Idee ?
Danke
Jockel

Bild

Betrifft: AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
von: DAEMAN
Geschrieben am: 16.06.2015 15:36:19
Hi Jockel,
diesen Text https://www.herber.de/bbs/user/98249.txt solltest du in deine Excel-Tabelle als "Klassenmodul" integrieren, anschließend kannst du das ehemalige Filesearch von Excel 2003 nutzen, mit folgendem Beispielcode:


Dim FS As New FileSearch
'Automatische Suche nach allen .docx Dateien im vordefinierten Pfad (inkl. Unterornder) _
- Klassenmodul, ähnlich dem Filesearch aus Excel 2003
With FS
.FileName = "*.docx"
.LookIn = "C:\Pfad"
.SearchSubFolders = True
.Execute
Die Bedingung müsstest du dann mit einer IF-Schleife einbauen, dazu reichen meine Kentnisse aber leider noch nciht aus... hoffe, dass es dir erstmal weiterhilft!
Gruß
DAEMAN

Bild

Betrifft: AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
von: DAEMAN
Geschrieben am: 16.06.2015 15:39:00


Bild

Betrifft: AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
von: DAEMAN
Geschrieben am: 16.06.2015 15:37:02


Bild

Betrifft: AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
von: Michael
Geschrieben am: 16.06.2015 19:23:55
Hallo zusammen,
ich hab mal recherchiert und das gefunden und angepaßt:

Sub DateiInformationen_auslesen_Peter2()
' Quelle:
' https://groups.google.com/forum/#!topic/microsoft.public.de.excel/Yn6wT0qa2Bc
   Const PFAD = "C:\Dein_Pfad"    
   With ThisWorkbook.Worksheets(1)
      .[A1].Select
      .Cells.ClearContents 
      .[A1:B1] = Array("Pfad:", PFAD)
      .[B2:F2] = Array("Name", "LängeN", "LängeO", "LängeGes", "Ordner")
      Call list_files(.[B3:F3], CreateObject( _
         "Scripting.FileSystemObject").GetFolder(PFAD))
      .[A:F].EntireColumn.AutoFit
   End With
End Sub
Sub list_files(r As Range, ordner As Variant)
   Dim file      As Variant
   Dim subordner As Variant
   For Each file In ordner.Files
     ' ************* Ausgabe nur, wenn größer 40; 
     If (Len(file.Name) + Len(ordner.Path)) > 40 Then
     ' ************* nach Bedarf ändern
        r(1) = file.Name
        r(5) = ordner.Path
        r(2) = Len(r(1))
        r(3) = Len(r(5))
        r(4) = r(2) + r(3)
        Set r = r.Offset(1)
     End If
   Next
   For Each subordner In ordner.SubFolders
      If (subordner.Attributes And 4) = 0 Then '/System-Ordner/
         Call list_files(r, subordner)
      End If
   Next
End Sub
Funktioniert mit 40 Zeichen prima, sollte mit 255 auch tun.
Die Ausgabe erfolgt auf Tabelle1 (Worksheets(1)); bei Bedarf bitte ändern.
Beim Original-Code (siehe link unter Quelle) werden weitere Attribute ausgelesen, wie z.B. die Dateigröße.
Happy Exceling,
Michael

Bild

Betrifft: AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
von: jockel
Geschrieben am: 17.06.2015 08:37:10
Hallo Michael,
Danke, das funktioniert super.
Vielleicht noch eine Frage dazu:
Es gibt in der Struktur kein einzelnes Hauptverzeichnis und darunter alle Unterverzeichnisse, sondern ich habe gleich auf der obersten Ebene viele Verzeichnisse.
ich würde gerne gleich mehrere Verzeichnisse auf einmal prüfen. Im Prinzip alle außer eins.
Kann ich das eine Verzeichnis ("S:\ICH_NICHT")irgend wie ausschliessen, irgend wie so mit
AUSSER "S:\ICH_NICHT"
Danke
Jockel

Bild

Betrifft: AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
von: Arthur
Geschrieben am: 17.06.2015 10:57:47
Hi.
Ohne getestet zu haben sollte es so funktionieren:
....
For Each subordner In ordner.SubFolders
If ((subordner.Attributes And 4) = 0) And (subfolder.name<>"ich_nicht")) Then '/System-Ordner/
Call list_files(r, subordner)
End If
Next
....
Gruß, Arthur

Bild

Betrifft: anderer Ansatz
von: Michael
Geschrieben am: 17.06.2015 13:22:55
Hallo zusammen,
mein allererster Gedanke in der Sache war, in der DOS-Box einen dir-Befehl einzugeben und das Ganze in eine Datei ausgeben zu lassen, z.B. so:

C:\>dir /s >dir.txt bzw. C:\Users\DeinName>dir \ /s >dir.txt
Die dir.txt hätte man wiederum in Excel öffnen und mit =Länge() auswerten können.
Die Parameter von dir kann man sich mit dir /? anzeigen lassen: /s bedeutet z.B., daß UVs mit einbezogen werden.
Das Ganze geht auch über die Shell, aber ich hatte gestern einen Wurm drin und deshalb zunächst die recherchierte Lösung gepostet.
Hier nun nachträglich der Code (ohne das "Alles, außer") mit dem Nachteil, daß der DOS-Zeichensatz zu unschönen Ausgaben führt (kann man natürlich noch korrigieren, aber zum Zählen der Längen isses egal):
Option Explicit
Sub Auslesen()
  Dim zeile As Long, p As Long, z As Long, x As Long
  Dim myShell As Object, myExec As Object
  Dim aufruf As String, datei As String, pfad As String
  Dim tzeile As Variant
  Dim ausgabe As Boolean, vz As Boolean
  Cells.Clear
  aufruf = "cmd.exe /C dir C:\Forum /s"
  Set myShell = CreateObject("WScript.Shell")
  Set myExec = myShell.Exec(aufruf)
  tzeile = Split(myExec.StdOut.ReadAll, vbCrLf)
  Set myShell = Nothing
  
  z = 1: x = 1 ' x = Wert für Länge ...
  
  For zeile = LBound(tzeile) To UBound(tzeile)
   ausgabe = False: vz = False
   If Len(tzeile(zeile)) > 0 Then
        If Mid(tzeile(zeile), 1, 1) = " " Then
          p = InStr(tzeile(zeile), "\")
          If p > 0 Then
            pfad = Mid(tzeile(zeile), p - 2) & "\"
            'ausgabe = True
          End If
        Else
          datei = Mid(tzeile(zeile), 37) ' 37 = Standard???
          If datei <> "." And datei <> ".." Then ausgabe = True
          If Mid(tzeile(zeile), 26, 1) <> " " Then
             vz = True       ' = Verzeichnis;
             ausgabe = False ' nach Bedarf auskommentieren
             ' wenn Vz = "d" ausgegeben werden soll
          End If
        End If
        If ausgabe And Len(pfad) + Len(datei) > x Then
          Cells(z, 1).Value = pfad
          Cells(z, 3).Value = datei
          If vz Then Cells(z, 2).Value = "d"
          z = z + 1
        End If
   End If
  Next
End Sub
Hier wird der "Kommandoprozessor" cmd.exe aufgerufen (das Programm, das Eingaben in der DOS-Box auswertet; Befehle wie "dir" werden von cmd direkt ausgeführt, andere DOS-/Windows-Befehle wie z.B. ping sind eigenständige Programme (ping.exe)), und die Ausgabe wird direkt in VBA weiterverarbeitet.
Das Programm sieht bei weitem nicht so "elegant" aus wie das erste, tut aber auch brav. *Vorsicht*, es löscht und überschreibt das gerade geöffnete Blatt.
Ok, ok, die Frage ist bereits beantwortet, aber es hat mich gejuckt, diesen Ansatz auszutesten, vielleicht kann's mal jemand brauchen.
Schöne Grüße,
Michael
P.S.: der Vollständigkeit halber der aufs Wesentliche reduzierte Code für ping (der Befehl benötigt einige Sekunden, keine Panik):
Sub Ping_Test()
  Dim myShell As Object, myExec As Object
  Dim aufruf As String
 
  aufruf = "ping.exe www.DeineTestSeite.de"
  Set myShell = CreateObject("WScript.Shell")
  Set myExec = myShell.Exec(aufruf)
  MsgBox myExec.StdOut.ReadAll
  Set myShell = Nothing
End Sub


 Bild

Beiträge aus den Excel-Beispielen zum Thema "Verzeichnis nach zu langen Pad/Dateinamen prüfen"