Anzeige
Archiv - Navigation
1428to1432
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Verzeichnis nach zu langen Pad/Dateinamen prüfen

Verzeichnis nach zu langen Pad/Dateinamen prüfen
16.06.2015 15:28:11
jockel
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

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
16.06.2015 15:36:19
DAEMAN
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

Anzeige
AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
16.06.2015 15:39:00
DAEMAN

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

AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
16.06.2015 19:23:55
Michael
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

Anzeige
AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
17.06.2015 08:37:10
jockel
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

AW: Verzeichnis nach zu langen Pad/Dateinamen prüfen
17.06.2015 10:57:47
Arthur
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

Anzeige
anderer Ansatz
17.06.2015 13:22:55
Michael
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

Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige