# Auf Datei Existenz Prüfen...



## wOp (1. Februar 2004)

aHoi,

ich möchte Prüfen ob eine bestimmte Datei, beispielsweise c:\test.ini vorhanden ist. Bitte um ein kleines Code Beispiel.


----------



## Dario Linsky (1. Februar 2004)

Hi,

eine Möglichkeit wäre das FileSystemObject aus der MS Scripting Runtime:

```
Dim fso As FileSystemObject
Set fso = New FileSystemObject

If fso.FileExists("C:\Test.txt") Then
    ' ...
End If
```
Es gibt aber noch mehrere andere Möglichkeiten.


----------



## wOp (1. Februar 2004)

Eine reicht mir. Danke für die schnelle Hilfe.


----------



## VB_Freak_goes_C (11. Februar 2004)

never use fso, its bad....

mach es lieber händisch über die Dir funktion

Public Function CheckPath(ByVal sPath As String) As Boolean
On Error GoTo ErrCheck
If Dir$(sPath, vbDirectory) = "" Then
    CheckPath = False
Else
    CheckPath = True
End If
Exit Function
ErrCheck:
CheckPath = False
Err.Clear
End Function

ist zwar ne funktion um auf Ordner abzuprüfen, ob vorhanden oder net, aber  mit Dateien genauso, lass dich durch vbDirectory net iritieren.


----------



## Dario Linsky (11. Februar 2004)

Was ist denn der Vorteil der Dir-Funktion gegenüber dem FSO? Ich hab's nämlich genau andersrum in Erinnerung.
FSO gehört zwar zur Scripting Runtime, ist aber einfacher zu bedienen und bietet einen (wenn man das für VB überhaupt so sagen darf, ohne auf dem Scheiterhaufen zu landen) objektorientierteren Ansatz.


----------



## VB_Freak_goes_C (11. Februar 2004)

der wohl überhaupt wesentlichste Aspekt gegen das FSO ist, das es potentiellen Angreifern, Tür und Tor auf deinen Rechner, den Rechner des Anwenders öffnet.
Ob das immer noch so ist weis ich nicht, aber man muss es ja nicht ausprobieren.

Aber ich hab noch was besseres gefunden, zum Thema existenz prüfung.

Schaut euch mal das hier an, ziemlich edel würd cih sagen, sogar UNC Pfade sind kein Prob

http://www.aboutvb.de/khw/artikel/khwpathexists.htm


----------



## Dario Linsky (11. Februar 2004)

> der wohl überhaupt wesentlichste Aspekt gegen das FSO ist, das es potentiellen Angreifern, Tür und Tor auf deinen Rechner, den Rechner des Anwenders öffnet.


Wenn's danach geht, dürfte man Windows und VB überhaupt nicht benutzen.


----------



## Bump Digger (24. Juli 2005)

Ich will aus meinem Programm heraus Anwendungen und Spiele starten.
Und um Laufzeitfehler zu vermeiden, wenn die Datei nicht existiert, will ich vorher überprüfen ob die Datei vorhanden ist.


```
Private Sub RingBomberman_Click()
If Dir("c:\intrplay\bomberman\bm95.exe") Then
Call Shell("c:\intrplay\bomberman\bm95.exe", vbNormalFocus)
Else
MsgBox ("Datei nicht vorhanden")
End If
End Sub
```

Nur gibt er mit jetzt eine Meldung das die Typen unverträglich sind.
Kann mir jemand helfen?
Ich find die Methode mit dem dir-Befehl schon nicht schlecht, wenn sie funktionieren würde.
Es muss ja nicht gleich ein ellenlanger Code sein wenn eine Zeile auch reicht.


----------



## Shakie (24. Juli 2005)

Das hier: 
	
	
	



```
If Dir("c:\intrplay\bomberman\bm95.exe") Then ...
```
 kann gar nicht funktionieren. Denn das Ergebnis der Dir-Funktion wird für die IF-Abfrage in eine Variable vom Typ Boolean konvertiert. Wenn die Datei nun aber nicht existiert, dann ergibt die Dir-Funktion als Ergebnis einen Null-String. Dieser kann nicht nach Boolean konvertiert werden und es gibt einen Laufzeitfehler.

Wenn du die Dir-Funktion verwenden willst, dann könntest du es so machen, indem du die Länge des Dir-Ergebnisses auswertest:

```
If Len(Dir("c:\intrplay\bomberman\bm95.exe"))>0 Then ...
```
 
Ich selber prüfe die Existenz von Dateien und Verzeichnissen meistens mit dieser Funktion:

```
Private Function Existiert(ByVal Pfad As String) As Boolean
On Local Error Resume Next
VBA.GetAttr Pfad
Existiert = (Err.Number = 0)
If Not Existiert Then Err.Clear
End Function
```
Hier verwende ich die GetAttr-Funktion, die die Eigenschaften einer Datei oder eines Verzeichnisses ermittelt. Wenn GetAttr einen Fehler erzeugt, dann gehe ich davon aus, dass die Datei oder das Verzeichnis nicht existiert.
Ich hoffe ich konnte helfen.


----------



## Bump Digger (27. Juli 2005)

Danke Shakie, das hat mir sehr weitergeholfen.
Ich will nun aber einen Schritt weitergehen und will keinen festen Pfad haben. Sondern eine Variable die den Pfad enthält.
Ich kann den Pfad auch durch den Öffnen-Dialog in die Variable schreiben, nur kann ich das Programm nicht mehr ausführen.
Ich denke das mein Fehler im Quelltext des Programmaufrufs ist.


```
Private Sub RingAmp_Click()
If Len(Dir(Amp)) > 0 Then
Call Shell(Amp, vbNormalFocus)
Else
MsgBox ("Datei nicht vorhanden")
End If
End Sub
```

In der Variable Amp steht "E:\Winamp\Winamp.exe" drin (ohne Gänsefüsse).
Und die Abfrage wird ja passiert da der Pfad länger als null ist.
Nur beim Call bricht er dann mit "Datei nicht gefunden ab".

Kann mir da bitte jemand weiterhelfen?

Edit:

Hab das jetzt auch mal mit


```
Private Sub RingAmp_Click()
If Len(Dir(Amp)) > 0 Then
Call Shell("Amp", vbNormalFocus)
Else
MsgBox ("Datei nicht vorhanden")
End If
End Sub
```

versucht. Ergebniss ist das gleiche: Laufzeitfehler 53/ Datei nicht gefunden.

Edit2:
Hab gemerkt das das nicht hier her gehört, sorry.
Aber zur Aufklärung des Problems:

Der Code


```
Private Sub RingAmp_Click()
If Len(Dir(Amp)) > 0 Then
Call Shell(Amp, vbNormalFocus)
Else
MsgBox ("Datei nicht vorhanden")
End If
End Sub
```

funktioniert. Hab nur nicht bedacht das ich die Variable Amp in einer anderen Form dem Pfad zugewiesen habe und somit konnte das natürlich nicht funktionieren, da in der Form wo die Datei geöffnet werden soll die Variable immer noch leer war.


----------

