PDA

Vollständige Version anzeigen : Unterordner umbenennen


Rudolf10000
11.06.2012, 15:40
Hallo, hab mal wieder ein Problem

Ich erstelle per VBA eine Ordnerstruktur (MKDIR Scheibchenweise) die ich zuweilen umbenennen möchte.
Ich habe , so glaube ich , mittlerweile so ziemlich alles durch, von NAME
über FSO(Move) bis zu RENDIR und einigen selbstbauten.
Ich kann entweder den Obersten oder den Untersten Ordner umbenennen,
aber mehrere Ordner in einem String krieg ich einfach nicht hin.
Hier mal die FSO Variante :
Private Sub RENDIR_Click()
Dim cdir
Dim strpath
'vorhandener Pfad
cdir = "C:\Kunde_278_Meier_Oberhausen\Objekt_5_Hauptstraße_53_Borken\Objekt_5_Details\"
'gewünschte Änderung der Adresse
strpath = "C:\Kunde_278_Meier_Oberhausen\Objekt_5_Hauptstraße_80_Borken\Objekt_5_Details\"
Set objFSO = New Scripting.FileSystemObject
objFSO.MoveFolder cdir, strpath
End sub


Hat vielleicht jemand eine Idee ?
Beste Grüße und Danke im Voraus
Rudolf

Atrus2711
11.06.2012, 15:43
Zersägs doch anhand des Backslashs in Einzelordner und rufe die Ordner-Rename-Routine mehrfach auf...

Rudolf10000
11.06.2012, 15:54
OK Atrus, Danke.
Das hört sich nach ARRAY und Loop an.
Da bin ich die totale Niete (Bin immer noch Anfänger).
Aber ich werds mal versuchen.

Atrus2711
11.06.2012, 15:56
Ja, das dürfte am einfachsten sein. Erzeugen kannst du das Array mit Split().

Die ganze Sache ist aber nur machbar, wenn die Ebenentiefe gleich bleibt, denn sonst ist das ja kein Umbenennen, sondern ein Neuordnen mit Anlage und ggf. Löschung von Ordnern...

Vielleicht ist es sogar einfacher, die neue Ordnerstruktur anzulegen, die Dateien zu kopieren und den alten Kram zu löschen. Das ginge dann auch mit andrer Ebenentiefe.

Lanz Rudolf
11.06.2012, 16:08
Hallo
einwenig OT !
So lange Pfad-Namen wie dass "Kunde_278_Meier_Oberhausen" oder
dass "Objekt_5_Hauptstraße_53_Borken"
würde ich Dir eh nicht empfelen
ist für die Performance sehr Ungesund :mad:
halte Dich doch an die Regel nicht länger als 8 Zeichen für Pfad und Dateinamen. :p

Marsu65
11.06.2012, 16:15
Hallo zusammen,
vlt. helfen dir die drei Beispiele von TommyK weiter
http://www.office&loesung.de/ftopic90621_0_0_asc.php
Im Link das & durch - ersetzen!

Rudolf10000
12.06.2012, 07:21
Vielen Dank für Eure Anregungen.
Wir müssen zur Dokumentation von Aufträgen alle möglichen Daten speichern und Sie bei Kundenanruf auch nach Jahren sehr schnell wiederfinden.
Daher kommen die entsetzlichen Ordnernamen und Ebenentiefe von bis zu 20 Unterordnern. Alle Ordner sind auf einem Server verknüpft. Funktioniert auch gut.
Aber wenn sich mal was ändert.......:mad:geht die manuelle fummelei los.
Hab mir Hut Nacht folgenden erbärmlichen Code zusammengeschustert.
Ich weiss bei INEW (viertletzte Zeile) dann nicht mehr weiter.
Vielleicht schubst mich ja jemand von euch wieder in die Spur.

Public Function RENAMEDirectory() '
Dim arrFolderOLD() As String
Dim arrFolderNEW() As String
Dim OLDPathTemp As String
Dim NEWPathTemp As String
Dim iOLD As Long
Dim iNEW As Long
Dim OLDPath
Dim NEWPath
OLDPath = "C:\Test\asdf\"
NEWPath = "C:\Test1\asdf\"
' Ggf. anhängenden Backslash abtrennen:
If Right(OLDPath, 1) = "\" Then
OLDPath = Left(OLDPath, Len(OLDPath) - 1)
Debug.Print OLDPath
End If
' OLD Verzeichnis in Array splitten:
arrFolderOLD = Split(OLDPath, "\")
' Laufwerk ermitteln:
OLDPathTemp = arrFolderOLD(0)
For iOLD = 1 To UBound(arrFolderOLD)
OLDPathTemp = OLDPathTemp & "\" & arrFolderOLD(iOLD)
' OLD Verzeichnis auf Existenz prüfen
If Dir(OLDPathTemp, vbDirectory) <> "" Then
'Neuen String in Array splitten und Ggf. anhängenden Backslash abtrennen:
If Right(NEWPath, 1) = "\" Then
NEWPath = Left(NEWPath, Len(NEWPath) - 1)
End If
arrFolderNEW = Split(NEWPath, "\")
Name arrFolderOLD(iOLD) As arrFolderNEW(iNEW)
End If
Next iOLD
End Function

Gruß
Rudolf

Atrus2711
12.06.2012, 07:39
iOld und iNew müssen eh gleichlaufen, d.h. du kannst da eine gemeinsame Variable nutzen. Denn die Ebenentiefe muss ja (bei diesem Prinzip) gleich bleiben.

Einen Ordner h:\projekte\meier\haus1 kannst du eben nicht in h:\meier\haus1 umbenennen, weil dieser Pfad eine Ebene weniger hat

Ein Neuanlegen des gewünschten Ordners wäre m.E. leichter. Mit dieser Klasse (Link (http://www.ms-office-forum.net/forum/showpost.php?p=1335334&postcount=3)) ist es sogar ein 1-2zeiler. Und dann einfach nur die Dateien rüberkopieren.

Rudolf10000
12.06.2012, 08:15
Hallo Atrus, teste gerade deinen Link
ich bekomme eine Fehlermeldung

Dim oPH as clsPathHandler

wird scheinbar nicht akzeptiert.

" Benutzerdefinierter Typ nicht definiert "

Anschließend muß ich die Dateien von Hand rüberkopieren.
Das wollte ich mir gerade ersparen.

Die Ebenentiefe bleibt beim Umbenennen immer gleich.

h:\825_Meier\Objekt_125\haus1 zu h:\825_Meier\Objekt_125\haus2
oder
h:\825_Meier\Objekt_125\haus1 zu h:\825_Meier_Müller\Objekt_125\haus1

ist aber auch verflucht schwer, das vernünftig zu lösen.
Danke
Rudolf

Atrus2711
12.06.2012, 08:42
clsPathHandler ist eine Klasse, d.h. du wirst das als Klassenmodul in deiner DB anlegen müssen. Dann ist der Typ auch deklariert.

Die Klasse kümmert sich nur um das Anlegen von verschachtelten Pfaden. Das Rüberkopieren von Dateien kannst du z.B. mit FileCopy oder dem FileSystemObject erledigen.

Wenn du beim Umbenennen bleiben willst, würde ich beide Pfade anhand von \ splitten und dann die Einzelteile vergleichen (1. Ebene, 2. Ebene etc). Wo die Namen abweichen, wird umbenannt. Nicht sooo schwierig. Bedenke aber, dass die Ordner während der Iteration ihre Namen ändern, nicht nur im String. sondern auch in Windows.