PDA

Vollständige Version anzeigen : Ordnername prüfen?!


Rossi
04.01.2002, 19:30
Hallo alle miteinander! Ich wünsche allen ein gesundes neues Jahr!

Ich habe folgendes Problem: mit nachfolgender Sub erstelle ich einen Ordner der aus Teilen der AufNr (mit Split) und anderen Feldern erstellt wird.

Private Sub Befehl36_Click()
On Error GoTo Errorbox
Dim I As Integer
werts = Split([AufNr], "/")
For I = 1 To 3
Debug.Print werts(2)
Next I
Me.werts = (werts(0) & "-" & werts(2) & " " & [Auftraggeber] & " " & [Objekt] & " " & [BestellNr])
Dim pfad1
ChDrive "c"
ChDir "c:\"
If Dir("Test1", vbDirectory) = "" Then
MkDir "Test1"
Else
End If
ChDir "Test1"
If Dir(werts.Value, vbDirectory) = "" Then
MkDir werts.Value
MsgBox "Ordner wurde angelegt es befinden sich noch keine Dateien darin!"
Else
MsgBox "Ordner existiet breits!"
End If
End Sub

Nun möchte ich püfen ob ein Ordner mit dem ersten Teil, also Werts(0) und Werts(2) bereits besteht! Der Grund ist es kann der Ordner bereits angelegt sein aber in den anderen Teilen (Auftraggeber usw.)ein Schreibfehler vorhanden sein. Der Ordner kann auch von Hand angelegt werden.
Vielleicht kann mir jemand helfen das wäre echt super! :confused:

AWSW
04.01.2002, 19:34
Hallo,
kleiner Tipp nebenbei. Schau mal auf meiner Seite vorbei, da gibt es ein Beispiel für verschachtelte Verzeichnisse, in dem auch eine Ordnerprüfung drin ist.

Vielleicht auch eine Möglichkeit ?!?

Rossi
04.01.2002, 20:50
Dein Beispiel funktioniert, ich komme aber bei mir damit nicht klar.

1. Der Ordner lässt sich mehrmals erstellen und es kommt nie eine Meldung, dass er schon da ist.

2. In der MsgBox kommt eine Ausdruck mit
"C:\\erstelltes Verzeichnis/die Felder getrennt mit /

Da ich ein AAAAnfänger bin ist der Code für mich auch schwer nachzuvollziehen. Kannst du mir mal ein bischen Hintergrundwissen vermitteln?
Ich habe deinen Code so angepasst:

Dim I As Integer
werts = Split([AufNr], "/")
For I = 1 To 3
Debug.Print werts(2)
Next I
Me.werts = (werts(0) & "-" & werts(2) & " " & [Auftraggeber] & " " & [Objekt] & " " & [BestellNr])

Dim FeldA As String, FeldB As String, ErstellPfad As String, FeldC As String, FeldD As String, FeldE As String

FeldA = Me.werts
FeldB = Me.AufNr
FeldC = Me.Auftraggeber
FeldD = Me.Objekt
FeldE = Me.BestellNr
ErstellPfad = "C:\" & "\" & "Test1\" & FeldA & "\" & FeldB & "\" & FeldC & "\" & FeldD & "\" & FeldE

If FolderExists2(ErstellPfad) Then
MsgBox "Der Pfad existiert bereits.", vbInformation, "Schon vorhanden"
Else
MakePath ErstellPfad
Debug.Print ErstellPfad
MsgBox "Folgenden Pfad erstellt:" & vbCrLf & ErstellPfad

End If
GoTo Befehl3_EndIt

Befehl3_Err:
MsgBox Err.Description, vbCritical, "Fehler"

Nicht lachen ich geb mein bestes! ;)

AWSW
04.01.2002, 22:20
OK,
aber kann etwas dauern, da ich erst noch was anderes erledigen muss, wird aber nicht vergessen <img src="graemlins/top.gif" border="0" alt="[Finger hoch]" />

Ich melde mich hier wieder...

AWSW
05.01.2002, 09:56
Hallo,
eine Frage, da mir die 2 Fragen eben erst so richtig aufgefallen waren. Kann es sein, dass Du die Module nicht mit in Deine DB importiert hast ???

Und eine 2. Frage: Auch mal das Beispiel mit dem Erstellen von verschachtelten Verzeichnissen auf Servern probiert ??? Das hat mehrere Felder drin und prüft diese einzeln und ist zum Verständnis bereits recht gut auskommentiert und fast 1:1 auf dieses zurückzuführen...

Ich glaube die " / " kommen hier von: Split([AufNr], "/") wenn ich das auf die Schnelle richtig gelesen habe...


Wenn Du einen Teil des Pfades Prüfen willst, dann geht dass IMHO so:

DIM ErstellPfadWerts as String
ErstellPfadWerts = Me.werts = me.werts(0) & "\" & Me.werts(2)

If FolderExists2(ErstellPfadWerts) Then
MsgBox "Der Pfad existiert bereits.", vbInformation, "Schon vorhanden"
Else
MakePath ErstellPfadWerts
Debug.Print ErstellPfadWerts
MsgBox "Folgenden Pfad erstellt:" & vbCrLf & ErstellPfadWerts

Ich hoffe ich habe Dich richtig verstanden...

A.S.
05.01.2002, 21:55
Hallo Rossi,

sage mir bitte, auf welchen Feldern (Steuerelementnamen) Deines Formulars der Verzeichnisname aufbaut.

Dein Coding kann man IMHO leider nur sehr schwer nachvollziehen, da Teile fehlen :( Wo ist zum Beispiel die Funktion Werts()? Was macht diese?

Des weiteren enthält Dein Coding die Anweisung "On Error Goto ErrorBox", Dein Coding enthält aber dieses Label nicht! Sollte dieses etwa in einer anderen Sub zu suchen sein? Hoffentlich nicht, denn über Prozedurgrenzen sollte man nie springen ;)

Gib bitte die Steuerelementnamen der Steuerelemente an, welche für das Erstellen des Verzeichnisses - Reihenfolge des Verzeichnisaufbaus nicht vergesseen - notwendig sind.

Gruß

Arno

Rossi
06.01.2002, 19:33
Entschuldigt mein langes Fehlen! Aber mein kleiner Sohn hat mich das Wochenende in anspruch genommen!

Ich stelle hier noch mal den Quelltext rein.

Private Sub Befehl36_Click()
Dim I As Integer
werts = Split([AufNr], "/")
For I = 1 To 3
Debug.Print werts(2)
Next I
Me.werts = (werts(0) & "-" & werts(2) & " " & [Auftraggeber] & " " & [Objekt] & " " & [BestellNr])
Dim ErstellPfad As String
ErstellPfad = "C:\" & "\" & "Test1\" & werts
If FolderExists2(ErstellPfad) Then
MsgBox "Der Pfad existiert bereits.", vbInformation, "Schon vorhanden"
Else
MakePath ErstellPfad
Debug.Print ErstellPfad
MsgBox "Folgenden Pfad erstellt:" & vbCrLf & ErstellPfad

End If
GoTo Befehl3_EndIt

Befehl3_Err:
MsgBox Err.Description, vbCritical, "Fehler"

Befehl3_EndIt:

Des weiteren gibt es die zwei Funktionen die mir AWSW empfohlen hat.

'Prüfen, ob ein Verzeichnis existiert II nach einem Tipp von: <a href="http://www.visualbasic-archiv.de" target="_blank">http://www.visualbasic-archiv.de</a>

'Beschreibung:
'In einem früheren Tipp haben wir Ihnen eine Routine vorgestellt, mit der es möglich ist mit ein paar API-Befehlen zu prüfen, ob ein bestimmtes Verzeichnis existiert. Heute möchten wir Ihnen eine weitere - sehr simple - alternative Methode vorstellen. Hierzu erstellen Sie einfach eine temporäre Datei im zu prüfenden Verzeichnis. Wird ein Fehler ausgelöst, so existiert dieses Verzeichnis nicht. Andernfalls löschen Sie die Datei wieder.
'Die nachfolgende Funktion prüft, ob das angegebene Verzeichnis existiert und gibt im Erfolgsfall den Wert True zurück.
'Existiert das Verzeichnis nicht, wird False zurückgegeben.

Public Function FolderExists2(ByVal sFolder As String) As Boolean

'Der Parameter sFolder enthält das zu prüfende Verzeichnis

On Local Error Resume Next
Dim F As Integer

sFolder = Trim$(sFolder)
If Right$(sFolder, 1) <> "\" Then _
sFolder = sFolder & "\"

F = FreeFile
Open sFolder & "test.tmp" For Output As #F
FolderExists2 = (Err = 0)
Close #F
Kill sFolder & "test.tmp"
On Local Error GoTo 0
End Function


Public Function MakePath(ByVal sPath As String, Optional ByVal ShowMsg As Variant) As Boolean

Dim antwort As Integer
Dim Dummy As String

If IsMissing(ShowMsg) Then ShowMsg = False

antwort = 0: Err = 0
Dummy = ""
On Local Error Resume Next
While Len(sPath) > 0 And antwort = 0
If Left$(sPath, 2) = "\\" Then
Dummy = Dummy + "\\"
sPath = Mid$(sPath, 3)
ElseIf Left$(sPath, 1) = "\" Then
Dummy = Dummy + "\"
sPath = Mid$(sPath, 2)
ElseIf Mid$(sPath, 2, 2) = ":\" Then
Dummy = Dummy + Left$(sPath, 3)
sPath = Mid$(sPath, 4)
End If
While Left$(sPath, 1) <> "\" And Len(sPath) > 0
Dummy = Dummy + Left$(sPath, 1)
sPath = Mid$(sPath, 2)
Wend
Err = 0
MkDir Dummy

Das ist mein aktueller Stand.
Ich erstelle also per Mausklick einen Ordner aus folgenden Feldern meines Formulars.

Teile aus dem Feld [AufNr], was an Werts übergeben wird und im Me.Wers im gleichnamigen Feld im Formular dargestellt wird und den Feldern[Auftraggeber] [Objekt] [BestellNr].
Meine Sub erstellt also einen Ordner auf C:\Test1\Gesplittelte AufNr Auftraggeber Objekt BestellNr
Wichtig ist das es sich um einen Ordner handelt (Ausgenommen von Test1).

Und ich möchte jetzt nur wissen ob ein Ordner existiert der mit der gesplitteten AufNr anfängt schon vorhanden ist.

Vielleicht noch mal ein Beispiel


C:\Test1\01-401 Müller Turnhalle 123344

Und ich möchte nun gern wissen ob ein Order da ist der so aussieht:

C:\Test1\01-401 und jetzt was anderes als oben

Ich weis das das ziemlich dof ist, aber die speichern Ihre Daten egal ob Technische Zeinungen oder Textdateien in diesem Ordnersystem und ich muss aus dem Müll was machen.
Für Eure Hilfe bin ich Euch schon jetzt dankbar und hoffe Ihr könnt mir aus dem Schlamassel helfen. Danke

AWSW
06.01.2002, 19:57
Hallo Rossi,
ist leider etwas schwer für mich dass komplexe Teil nachzuvollziehen, aber Du kannst mal probieren über die DIR-Methode, die in der Hilfe beschrieben steht, das zu prüfen. Das ist meiner Ansicht, wenn ich Dich richtig verstehe, eine Möglichkeit das zu testen. Arno meinte eben auch es müsste mit dem FileScriptingObject gehen, wobei ich zugeben muss, dass ich da im Moment nicht tief genug drin bin, als dass ich Dir da direkt eine Antwort zu geben kann. Schau mal ob Du da nicht mit einem dieser Methoden weiter kommst, da ich da leider im Moment auch etwas überfragt bin. Du solltest dann mit Dir("C:\Test1\01-401") weiter kommen. Wenn der Ordner vorhanden ist, dann wird der abgefragte Name (also: C:\Test1\01-401) zurückgegeben. Wenn nicht, dann ist die Antwort quasi leer oder anders gesagt, es wird nichts zurückgegeben...

Könnte IMHO so aussehen (aber nur auf die Schnelle überlegt):

Dim PfadVorhanden as String
PfadVorhanden = Dir("C:\Test1\01-401")
If IsNull(PfadVorhanden) then
MkDir PfadVorhanden
else
Msgbox "Der Pfad ist schon vorhanden."
End If


Ich hoffe das hilft Dir etwas :)

Rossi
10.01.2002, 19:27
Hallo Ihr tollen Helfer.

Ich möchte mich etwas verspätet für Eure Hilfe Bedanken. Das Problem hat sich ganz einfach gelöst. Es wurde in der Firma einfach festgelegt, dass mein Programm die Ordner anlegt und somit reicht die Prüfung ob genau der Ordner und nicht ein ähnlicher schon existiert aus.
Das Problem an sich ist aber trotzdem recht interesant und wenn jemand eine Lösung hat kann er mich es ja wissen lassen.

Also nochmals vielen Dank.

Rossi <img src="graemlins/top.gif" border="0" alt="[Finger hoch]" />