Anzeige
Archiv - Navigation
892to896
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
892to896
892to896
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Dir sollte man nicht benutzen?

Dir sollte man nicht benutzen?
02.08.2007 21:43:20
Reinhard
Hallo Wissende,
in einem anderen Forum, ein VB-Forum, habe ich eine Anfrage gelöst, aber jmd. der vom oft gelesenen Namen sehr fit in Vb ist, sagte dazu Folgendes:
**********************************************************************************
Auf die Verwendung der Funktion Dir$ zur Existenzprüfung sollte dringend verzichtet werden, da diese Funktion nicht eintrittsinvariant ist. Ihre Verwendung kann zur Folge haben, dass sich anderen Programmteile nach Aufruf der Funktion zur Existenzprüfung nicht mehr wie erwartet verhalten!
Will man die Existenz eines Files oder Ordners prüfen, so sollten immer Filebezogene Routinen eingesetz werden ( FileLen, GetAttr etc.)
**********************************************************************************
Nun habe ich keinen blassen Dunst, nicht mal nen Schimmer, was denn "eintrittsinvariant" bedeuten könnte usw.
Kann mir das bitte jmd. mal dolmetschen und mir sagen, ob und daß man auch in Vba-Kreisen auf Dir verzichtet, wobei mir immer noch sehr unklar ist, warum eigentlich.
Danke ^ Gruß
Reinhard

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dir sollte man nicht benutzen?
02.08.2007 22:05:00
Horst
Hi,
google ist auch dein Freund!
mfg Horst

AW: Dir sollte man nicht benutzen?
02.08.2007 22:17:00
Reinhard
Hallo Horst,
du meinst googeln nach "eintrittsinvariant", kein Akt, da haste Recht.
Mir geht es viel mehr darum ob ich "Dir" benutzen sollte oder nicht.
Gruß
Reinhard

AW: Dir sollte man nicht benutzen?
02.08.2007 22:28:34
Matthias
Hallo Reinhard.
Mir geht es viel mehr darum ob ich "Dir" benutzen sollte oder nicht.
Es heißt "Dich".
SCNR,
Matthias

AW: Dir sollte man nicht benutzen?
02.08.2007 22:37:33
Matthias
Hallo Reinhard,
also im Ernst:
ich benutze Dir() und hatte bisher keine Probleme. Deine Quelle scheint aber mehr Ahnung zu haben als ich, also kannst du die Abfrage ja so lösen:

Function DateiExistiert(ByVal fn As String)
Dim tmp
On Error Resume Next
tmp = FileLen(fn)
DateiExistiert = (Err.Number = 0)
End Function


Gruß Matthias

Anzeige
AW: Dir sollte man nicht benutzen?
02.08.2007 22:46:58
MichaV
Hallo,
hier mal ein Beispiel. Angenommen, Du willst in einem Verzeichnis alle Dateien durchsuchen (geht ja gut mir DIR()), und bei bestimmten Dateien in eine andere Sub springen, die wiederum eine Dir- Funktion enthält:


Option Explicit
Sub bla()
Dim Datei1, i
'in dieser Sub sollen alle Dateien im Verzeichnis c:\ durchsucht werden
'wird eine bestimmte Dateiendung gefunden, soll ein anderes Makro aufgerufen werden
Datei1 = Dir("C:\*.*") 'erste Datei
Do While Datei1 <> ""
    If Right(Datei1, 4) = ".bat" Then Call test
    Datei1 = Dir
Loop
End Sub
Sub test()
Dim Datei2
'falscher Test auf Vorhandensein einer Datei:
'Datei2 = Dir("c:\irgendeinedatei.txt")
'If Datei2 = "" Then MsgBox "Datei nicht vorhanden"
'besser:
On Error Resume Next
Datei2 = FileLen("c:\irgendeinedatei.txt")
If Err.Number <> 0 Then MsgBox "Datei nicht vorhanden"
On Error GoTo 0
End Sub


Gehe die erste Prozedur mal in Einzelschritten durch. Du solltest natürlich mindestens eine Datei haben, die den Sprung zur Sub test() erzeugt.
Entkommentiere dann die beiden Programmzeilen in test() und gehe nochmal in Einzelschritten durch.
Gruß- Micha
PS: Rückmeldung wäre nett.

Anzeige
eintrittsinvariant
03.08.2007 16:42:23
Reinhard
Hallo Horst,
falls mal irgendwann jmd. mit diesem Begriff konfrontiert wird, und hier im Archiv schaut, dann kriegt er zumindest die nachfolgende Wiki-Erklärung.
Das finde ich besser als wenn du mir sagst ich soll googeln, das kann ich, recht gut, aber es gibt Mitlesende, Nachfolgende, die im Archiv nachschauen, die haben davon daß ich nach dem Begriff gegoogelt habe Null.
Von den nachfolenden Ausführungen haben sie was.
Gruß
Reinhard
Eine Routine bzw. Methode wird als eintrittsinvariant (engl. reentrant) oder auch wiedereintrittsfähig bezeichnet, wenn sie so implementiert ist, dass sie von mehreren Prozessen gleichzeitig ausgeführt werden kann. Dabei dürfen sich die gleichzeitig ausgeführten Instanzen nicht in die Quere kommen. Die Ausführung jeder Instanz läuft also gleich ab, egal wie viele andere Instanzen es noch von dieser Methode gibt.
Das Ziel eines Designs für eine eintrittsinvariante Methode ist es, sicherzustellen, dass kein Teil des Programmcodes selbst durch die Methode geändert wird und dass prozesseigene Informationen wie beispielsweise lokale Variablen in getrennten Speicherbereichen gehalten werden.
Eintrittsinvariante Programmkonstrukte sind die Basis für viele Multitasking-Systeme (Threadsicherheit).
Von „http://de.wikipedia.org/wiki/Eintrittsinvarianz“

Anzeige
AW: Dir sollte man nicht benutzen?
02.08.2007 22:36:00
K.Rola
Hallo,
Eintrittsinvarianzen sind nur bei Multitasking relevant. Da VBA nicht multitaskfähig ist,
spielt das keine Rolle.
Gruß K.Rola

AW: Dir sollte man nicht benutzen?
03.08.2007 08:26:08
sergiesam
Hallo,
ich hatte mit dir manchmal Probleme, wenn ich mit Tempordnern gearbeitet habe, die ich wieder löschen möchte. Wenn du mit Dir "draufschaust" ob er existiert, wird der Ordner verwendet und kann nicht gelöscht werden. Ich musste dir dann immer z.B. auf C:\ schauen lassen, damit der Ordner wieder frei ist.
Lieber verwende ich jetzt auch FileExists,... vom Windows Script Object.
lg,
Sam

AW: Dir sollte man nicht benutzen?
03.08.2007 09:59:00
Nepumuk
Hallo Sam,
das hat jetzt aber mit "eintrittsinvariant" nichts zu tun. Sondern dabei geht es darum, dass Dir einen eigenen Pointer hat, der, solange ein Pointer aus einer anderen Routine darauf zeigt, nicht zurückgesetzt wird. Das ganze hat, wie K.Rola schon schrieb, mit Multitasking zu tun. Das heißt mehrere Routinen laufen parallel und greifen abwechselnd auf eine Routine zu in der Dir verwendet wird. Durch seinen eigenen Pointer steht dieser dann, wenn eine zweite Routine darauf zugreift möglicherweise nicht auf Null, sondern irgendwo oder am Ende und du bekommst falsche Ergebnisse zurückgeliefert.
Windows Script benutze ich nicht mehr, da ich Mappe in denen dieses Objekt benutzt wird, nicht per Mail in Firmen senden kann, welche einen restriktiven Scriptblocker in ihrer Firewall benutzen. Außerdem ist diese API - Funktion auch wesentlich schneller, da ich kein Objekt anlegen muss:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function SearchTreeForFile Lib "imagehlp.dll" ( _
    ByVal RootPath As String, _
    ByVal InputPathName As String, _
    ByVal InputPathBuffer As String) As Long

Private Const MAX_PATH = 260&

Private Function fncFileExist(strPath As String, strFile As String) As Boolean
    Dim strTempBuffer As String * MAX_PATH
    fncFileExist = Cbool(SearchTreeForFile(strPath, strFile, strTempBuffer))
End Function

Public Sub test()
    If fncFileExist("D:\test", "test.xls") Then MsgBox "Die gibt's tatsächlich"
End Sub

Gruß
Nepumuk

Anzeige
AW: Dir sollte man nicht benutzen?
03.08.2007 12:09:00
sergiesam
Hallo Nepumuk,
Vielen Dank für die Info bezüglich SearchTreeForFile - diesen Apicall kannte ich noch nicht.
lg,
Sam

AW: Dir sollte man nicht benutzen?
03.08.2007 16:07:44
Reinhard
Hallo Interessierte,
es tut mir sehr leid :-(, ich habe erst gestern gemerkt, dass in der Antwort in dem anderen Forum auch
Code anhing, anfangs hatte ich wohl nicht gescrollt weil ich dachte der Beitrag ist zu Ende.
Jedenfalls hat er Recht mit seiner Aussage daß Dir nicht zu trauen ist.
Wobei ich noch nicht so ganz beim dem Code durchblicke, aber das ist Normalzustand bei mir :-)
Im Anhang ist der Code plus Bemerkungen von ihm.
Danke für alle Zuschriften
Schön wieder mal K.Rola gelesen zu haben
Gruß
Reinhard

'Auf die Verwendung der Funktion Dir$ zur Existenzprüfung sollte dringend verzichtet werden, da  _
diese 'Funktion nicht eintrittsinvariant ist. Ihre Verwendung kann zur Folge haben, dass sich
anderen 'Programmteile nach Aufruf der Funktion zur Existenzprüfung nicht mehr wie erwartet  _
verhalten!
'Will man die Existenz eines Files oder Ordners prüfen, so sollten immer Filebezogene Routinen
eingesetz 'werden ( FileLen, GetAttr etc.)
'Ein kleines Demo!
'Die Zeile wo als Kommentar Test steht, einfach mal mit ausführen und mal nicht. Dabei schaut  _
euch
die 'Ergebnisse in beiden Faellen mal an ;)


Option Explicit
Private Sub Form_Load()
Call EnumDirs("c:\")
End Sub
Private Sub EnumDirs(ByVal Path As String)
Dim CurrentDir As String
CurrentDir = Dir$(Path, vbDirectory)
Do While Len(CurrentDir) > 0
If CurrentDir  "." And CurrentDir  ".." Then
If _CBool(GetAttr(CombinePath(Path, CurrentDir)) And vbDirectory) Then
Debug.Print CurrentDir
End If
End If
'Debug.Print DirExists("C:\Programme") ' Test
CurrentDir = Dir$
Loop
End Sub
Private Function DirExists(ByVal Path As String) As Boolean
DirExists = (Len(Dir$(Path, vbDirectory)) > 0)
End Function
Private Function CombinePath(ByVal Part1 As String, ByVal Part2 As String)
CombinePath = Part1
If Right$(CombinePath, 1)  "\" Then
CombinePath = CombinePath & "\"
End If
CombinePath = CombinePath & Part2
End Function
MfG Alex


Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige