none
Mit Directory.Exists Verzeichnis auf Netzwerklaufwerk prüfen. RRS feed

  • Frage

  • Hallo zusammen,

    wir haben Dateien auf einem Netzwerklaufwerk die wir sporadisch einlesen.

    Bevor wir die Datei einlesen prüfen wir mit Directory.Exists ob das Verzeichnis exisitert und danach auch noch ob die Datei vorhanden ist.

     

    Nun haben wir das Problem das unser Programm sporadisch mit der Meldung den Vorgang unterbricht, dass das Verzeichnis nicht vorhanden sei.

    Interessant ist das wenn wir die Datei nochmals anfordern die Fehlermeldung bestehen bleibt und zwar so lange bis wir das Netzwerklaufwerk kurz über den Explorer öffnen.

    Danach wird das Verzeichnis gefunden und auch die Datei eingelesen.

    Unser Problem ist nun das wir das ganze nicht genau eingrenzen können, es gibt keinen speziellen Moment im dem das verhalten auftritt. Es kann sein das es Tagelang ohne Probleme funktioniert und es ist auch möglich das der Fehler 3-4mal am Tag auftaucht.

     

    Kenn jemand dieses Phänomen oder hat jemand eine Idee wie wir das beseitigen können.?

     

    Danke jetzt schon für Antworten.

     

    Gruss Marco

    Mittwoch, 7. Juli 2010 20:51

Antworten

  • Hallo Marco

    ist der Pfad zum Server-Verzeichnis auf ein Laufwerk gemapped, oder direkt via UNC-Pfad?

    Ein Faktor (uva) könnte sein:

    autodisconnect:
    Mapped Drive Connection to Network Share May Be Lost
    http://support.microsoft.com/kb/297684/
    http://social.technet.microsoft.com/Forums/en/winserverfiles/thread/bc0e6cee-7647-46e1-904d-ce5181ea4599

    Weiter, läuft deine App wirklich im selben Benutzerkonto wie der Explorer, oder irgendwie per 'Run-As' (admin) oder gar als Service?

    Mittwoch, 7. Juli 2010 21:21
  • Hallo Marco,

    ist zwar keine .NET Frage, aber ich vermute, dass es nicht das AutoDisconnect-Problem ist, da Du schriebst:
         "Es kann sein das es tagelang ohne Probleme funktioniert"

    Ich tippe eher auf das AutoLogon-Problem, wenn der gemappte Folder auf persistent gesetzt ist.
    Dann versucht nämlich das System, das Verzeichnis unter diesem Namen beim Logon zu authentifizieren.
    Ggf. sind solche Start-Batches dann ein Workaround:

        if exist f: net use f: /delete
        net use f: \\x.x.x.x\share /persistent:no

    Deswegen würde ich zu Reproduzierung des Problems einmal den betreffenden Rechner (ohne Änderungen) neustarten und schauen, ob das Mapping dann nicht funktioniert. Wenn ja, ist es das Problem.

    By the way: Die Exists-Abfragen sind normal eher sinnfrei. Besser einfach den direkten Zugriff (ggf. mit wenig Lese-Bytes) in einem try-catch ausführen und ggf. die Exception auswerten. Die Existenz von Dateien/Verzeichnissen heisst nicht, dass Du deren Inhalt lesen darfst. 
    Ausserdem kann sich nach der Abfrage der Existenz der Zustand geändert haben, sodass es dann auch auf einen Fehler laufen würde.

     

     


    ciao Frank
    Donnerstag, 8. Juli 2010 05:34
  • Hallo Marco,
    Hallo Frank, [...] Wie so ich das ganze im .NET Forum gepostet habe hat den Grund das ich gehofft habe das jemand weis wie ich das Problem mit .NET Funktionen lösen kann.

    ja, ok. Mit .NET Methoden könnte man das von mir genannte Mapping u.a. zum Beispiel über:

    [Map Network Drive (API) - CodeProject]
    http://www.codeproject.com/KB/system/mapnetdrive.aspx

    erreichen.


    ciao Frank
    Donnerstag, 8. Juli 2010 07:31

Alle Antworten

  • Hallo Marco

    ist der Pfad zum Server-Verzeichnis auf ein Laufwerk gemapped, oder direkt via UNC-Pfad?

    Ein Faktor (uva) könnte sein:

    autodisconnect:
    Mapped Drive Connection to Network Share May Be Lost
    http://support.microsoft.com/kb/297684/
    http://social.technet.microsoft.com/Forums/en/winserverfiles/thread/bc0e6cee-7647-46e1-904d-ce5181ea4599

    Weiter, läuft deine App wirklich im selben Benutzerkonto wie der Explorer, oder irgendwie per 'Run-As' (admin) oder gar als Service?

    Mittwoch, 7. Juli 2010 21:21
  • Mittwoch, 7. Juli 2010 21:43
  • Hallo Thomas,

     

    danke dir für deine Antworten werde mir das mal ansehen geht genau in die Richtung.

     

    Zu deinen Fragen.

    Der Zugriff erfolgt über ein gemapptes Laufwerk also nicht vie UNC-Pfad.

    Der Benutzer ist der gleiche. Es ist eine Desktopanwendung auf einem Windows XP Rechner.

     

    Gruss Marco

    Donnerstag, 8. Juli 2010 04:57
  • Hallo Marco,

    ist zwar keine .NET Frage, aber ich vermute, dass es nicht das AutoDisconnect-Problem ist, da Du schriebst:
         "Es kann sein das es tagelang ohne Probleme funktioniert"

    Ich tippe eher auf das AutoLogon-Problem, wenn der gemappte Folder auf persistent gesetzt ist.
    Dann versucht nämlich das System, das Verzeichnis unter diesem Namen beim Logon zu authentifizieren.
    Ggf. sind solche Start-Batches dann ein Workaround:

        if exist f: net use f: /delete
        net use f: \\x.x.x.x\share /persistent:no

    Deswegen würde ich zu Reproduzierung des Problems einmal den betreffenden Rechner (ohne Änderungen) neustarten und schauen, ob das Mapping dann nicht funktioniert. Wenn ja, ist es das Problem.

    By the way: Die Exists-Abfragen sind normal eher sinnfrei. Besser einfach den direkten Zugriff (ggf. mit wenig Lese-Bytes) in einem try-catch ausführen und ggf. die Exception auswerten. Die Existenz von Dateien/Verzeichnissen heisst nicht, dass Du deren Inhalt lesen darfst. 
    Ausserdem kann sich nach der Abfrage der Existenz der Zustand geändert haben, sodass es dann auch auf einen Fehler laufen würde.

     

     


    ciao Frank
    Donnerstag, 8. Juli 2010 05:34
  • Hallo Frank,

     

    Das Laufwerk wird über das Serverskript gesetzt. Darauf habe ich also keinen grossen Einfluss. Wenn ich richtig Informiert bin dann ist es ein Windows 2003 Server.

     

    Wir können das Problem im Moment bei uns im Büro nicht reproduzieren. Sondern wie es so typisch ist nur beim Kunden.

    Nach einem Neustart funktioniert der Zugriff im Normalfall problemlos.

     

    Wir gesagt es tritt sehr sporadisch auf. Wir hatten es das der Benutzer den ganzen Morgen damit gearbeitet hat. Als er um 4 Uhr Nachmittags wieder auf eine Datei zugriffen wollte schlug das ganze Fehl.

     

    Wie so ich das ganze im .NET Forum gepostet habe hat den Grund das ich gehofft habe das jemand weis wie ich das Problem mit .NET Funktionen lösen kann.

    Leider habe ich auf die Netzwerkinfrastruktur beim Kunden keinen Einfluss.

     

    Ich danke euch aber für die Antworten die helfen mir schon mal weiter.

     

    Das mit dem direkten Zugriff werde ich mir mal überlegen. Weis jemand ob bei einem solchen Zugriff die Netzwerkverbindung wieder aufgebaut wird?

     

    Gruss Marco

    Donnerstag, 8. Juli 2010 06:10
  • Wir gesagt es tritt sehr sporadisch auf. Wir hatten es das der Benutzer den ganzen Morgen damit gearbeitet hat. Als er um 4 Uhr Nachmittags wieder auf eine Datei zugriffen wollte schlug das ganze Fehl. 

    war der Rechner in der Zwischenzeit etwa auf Sleep/Hibernate?

    Weiter,
    .NET nutzt für File.Exists intern Win32: 'FindFirstFile',
    Caching (der Metadata, SMB 2.0 / ab Vista) wird anscheinend nur gemacht bei:
    GetFileAttributes, GetFileSize, GetFileTime, FindFirstFile/FindNextFile;
    also andere APIs, die die Datei selber öffnen, sollten nicht gecached werden.

    Ich würde auch mal auf XPSP3, aktuelle Netzwerktreiber und synchrone Rechnerzeit achten.

    Donnerstag, 8. Juli 2010 06:33
  • Hallo Marco,
    Hallo Frank, [...] Wie so ich das ganze im .NET Forum gepostet habe hat den Grund das ich gehofft habe das jemand weis wie ich das Problem mit .NET Funktionen lösen kann.

    ja, ok. Mit .NET Methoden könnte man das von mir genannte Mapping u.a. zum Beispiel über:

    [Map Network Drive (API) - CodeProject]
    http://www.codeproject.com/KB/system/mapnetdrive.aspx

    erreichen.


    ciao Frank
    Donnerstag, 8. Juli 2010 07:31