System.IO.Directory.Exists()
-
Ich bin zufällig auf ein Problem mit System.IO.Directory.Exists()
gestoßen und weis absolut keinen Rat mehr.Als ich mein Projekt fertig hatte, habe ich alle Projekt-Dateien
auf eine Ablage auf ein Netzlaufwerk kopiert. Von dort habe ich
dann (eher zufällig) das kompilierte Programm gestartet. Das Programm
gab die Fehlermeldung "Verzeichnis existiert nicht.".Nun habe ich herausgefunden, dass die Funktion System.IO.Directory.Exists()
offenbar nur true zurück gibt, wenn das Programm auf ein lokales Laufwerk
liegt und von dort aus gestartet wird. Kopiert man das gleiche Programm
auf ein Netzlaufwerk, dann gibt die Funktion immer false zurück.Hier ein Beispiel-Konsolenprogramm:
[b]// Ich arbeite unter Windows XP3 mit C# MS VS 2005 Version 8.0.50727.42[/b] using System; using System.Collections.Generic; using System.Text; namespace TestDirExists { class Program { static void Main(string[] args) { string Path = ""; if (args.Length == 0) Path = "C:\\Temp"; else Path = args[0]; bool x = System.IO.Directory.Exists(Path); if (!x) Console.WriteLine(Path + " existiert nicht"); else Console.WriteLine(Path + " vorhanden"); } } }
-
Zweiter Treffer bei Google: http://forums.asp.net/t/1344499.aspx
-
Wenn du dein Programm signierst sollte es klappen
-
Wie signiert man denn?
-
steffi09 schrieb:
Wie signiert man denn?
Projekteigenschaften -> Signierung
Das war aber jetzt schwer
-
Ich liebe es, wenn jemand etwas fragt und ein paar Leute immer sofort ein Google-Suchergebnis präsentieren. Zudem kommt oft, dass die Suchergebnisse leider am Thema vorbeigehen. Normalerweise könnte man davon ausgehen, dass die Suchergebnisse bereits selbst ersucht wurden. Wenn dann die Fragen trotzdem in ein Forum eingestellt werden, dann wird das zu 99% daran liegen, dass man mit dem ergoogelten Ergebnissen nicht viel anfangen kann. Oder sollen die Foren einfach nur zu Linksammlungen degradiert werden? Ich habe das... Ich habe dies... Aber verstehen musst Du es selbst... Und Sorry, falls Du Dich wegen einer Fehlverlinkung ein paar Stunden umsonst geärgert hast...
Der Hinweis auf die Code-Signierung scheint mir eine kleine Hoffnung zu sein. Aber hier kenne ich mich ebenfalls nicht aus. Gibt es dafür eine Schritt-für-Schritt Anleitung? Das der Anfrag in den Projekteinstellungen zu finden ist, ist klar. Aber was muss ich dort machen, damit es dann passt.
Was hat das ganze überhaupt für einen Hintergrund? Ich könnte doch die zahlreichen "Fremdklassen" einbinden, die dann ohne weiteres funktionieren. Ich meine einen Ordner auf Existenz zu prüfen, geht doch in jedem kleinsten Compiler, ohne dass man etwas beachten muss.
-
Du gehst in den Signierungsreiter.Dort auf "Assembly signieren" und einen neuen hinzufügen.
Dann wird ein schlüssel für dein Projekt erstellt.
-
Also ich habe das getan. Beim neu erstellen habe ich kein Passwort eingegeben. (Ich hoffe das ist in Ordnung.)
Aber dennoch der Effekt:
Nach dem ich das compilierte Beispielprogramm (eine EXE-Datei) auf ein beliebiges Netzlaufwerk kopiere, gibt das Beispiel immer an, dass der Ordner nicht exisitiert. Wie gesagt, die gleiche EXE-Datei auf C: gespeichert und von dort aufgerufen, funktioniert alles.
Anscheinend hilft die Signierung nicht. Oder muss ich weitere Einstellungen durchklicken? Wenn ich auf die jetzt in der Projektmappe sichtbare Schlüsseldatei (sigdatei.snk) klicke, werden die Schlüsseldateieigenschaften angezeigt. Muss dort etwas bestimmtes eingestellt sein? Zurzeit ist dort Folgendes eingestellt:
Erweitert:
-Buildvorgang: "Keine"
-In Ausgabeverzeichnis kopieren: "Nicht kopieren
-Namespace des benutzerdefinierten Tools: ""Sonstiges:
-Dateiname: "sigdatei.snk"
(-Vollständiger Pfad ist ausgegraut)
-
Schau mal ob dir diese Beiträge helfen, da stehen einige Antworten drinne.Sag doch bitte mal ob dir das dann auch geholfen hat, ansonsten müssen wir nach weiteren lösungen suchen.
-
Programme die von Netzlaufwerken direkt ausgeführt werden haben eingeschränkte Rechte: http://www.winautomation.com/kb/run-executable-network-share
Wenn Exists() false zurückliefert bedeutet das nicht zwingend, daß das Verzeichnis nicht existiert sondern kann auch bedeuten, daß man einfach keine Rechte hat, siehe:
http://msdn.microsoft.com/en-us/library/system.io.directory.exists.aspx
If you do not have at a minimum read-only permission to the directory, the Exists method will return false.
PS: Sei doch froh das Dir Leute wenigstens nen Link zu etwas geben was Dir weiterhelfen könnte...
-
Durch die Links bin ich auf den richtigen Weg gebracht worden.
Allerdings gab es eine Hürde zu nehmen. Und zwar war immer wieder
die Rede davon, dass man Zugriff auf das Verzeichnis brauche.Irgentwie wurden Rechte auf Ordnerebene mit der Zugriffssteuerung
auf Programmebene durcheinander gemischt.Über die Systemsteuerung -> Verwaltung -> Microsoft .NET Framework 2.0-Konfiguration
konnte ich mein Testprogramm manuell freischalten.Anscheinend müssen Programme, die bestimmte Klassen von .NET benutzen
eventuell freigeschaltet werden. Welche Klassen, wann freigeschaltet
werden müssen, weis ich noch nicht. Das bekomme ich aber raus.Wenn man ein normales Weitergabepaket erzeugt ist es wahrscheinlich so,
dass die .NET-Konfiguration automatisch durchgeführt wird. Ich hatte
jedoch nur die EXE-Datei erzeugt und diese aus dem Release Verzeichnis
direkt benutzt. Ein Installationsscript habe ich nicht erzeugt.Irgentwie verstehe ich den Sinn nicht - aber auch das macht Sinn.
Vielen Dank für die Unterstützung!