Announcement

Collapse
No announcement yet.

FileNotFoundException

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • FileNotFoundException

    Hi,

    habe ein Problem.
    Ich speichere Daten lokal in einer csv Datei. Wenn ich jetzt versuche die über einen Stream auszulesen gibt es eine FileNotFoundException. Dann habe ich nachgeschaut, wo das Ding liegt:

    Es liegt hier :
    C:\Users\Jan\Desktop\ConsoleApplication2\ConsoleAp plication2

    Wenn ich aber debugge, befinde ich mich hier:
    C:\Users\Jan\Desktop\ConsoleApplication2\ConsoleAp plication2\bin\Debug\Data.csv

    Jetzt frage ich mich, wie ich das Problem beheben soll. Das gleiche Problem könnte nämlich dann auch auftreten, wenn ich eine ausführbare Datei erstelle. Wie kann ich also auf die Datei zugreifen, ohne sie in die Unterordner Debug bzw. später Release kopieren zu müssen (die müsste ich ja dann immer wieder retrieven und das müsste eigentlich verzichtbar sein, oder)?

    LG
    Neodym

  • #2
    Einen festen Pfad vorgeben wo die Datei hingespeichert werden soll -> bsp. immer da wo die Anwendung liegt oder "Eigene Dateien"...
    Christian

    Comment


    • #3
      Wenn Du Dein Programm weitergibst, in welchem Ordner wird dann Dein Programm liegen, und in welchem Ordner die Data.csv? Vermutlich nicht in c:\users\Jan\..., aber beide Dateien werden vermutlich im gleichen Ordner liegen. Also leg sie jetzt in den Ordner Debug.


      Oder Du legst Dir einen Registryschlüssel mit dem Pfad an. Wenn der vorhanden ist, nimmst Du diesen Pfad. Wenn nicht, nimmst Du den aktuellen Ordner oder ein Unterverzeichnis davon.
      Günther

      Comment


      • #4
        [QUOTE=Christian Marquardt;242175 da wo die Anwendung liegt oder "Eigene Dateien"...[/QUOTE]

        Aber dann hat der User auch so ein Ordner auf der Festplatte rumgammeln.
        Naja ok.
        Aber das aktuelle Verzeichnis ist ja das Debug Verzeichnis bzw. das Release Verzeichnis. Da hätte ich die Datei ja mehrmals
        Was ist außerdem mit anderen Betriebssystemen.
        Wenn ich hier einen Pfad vorgebe, kann das sein, dass ich nicht darauf zugreifen kann oder dass es irgendeine Exception gibt

        Comment


        • #5
          "Eigene Dateien" hat jeder User. Wie der Pfad genau lautet, steht in der Registry.
          Günther

          Comment


          • #6
            Auf welchen anderen Betriebssystemen sollte NET laufen??
            Christian

            Comment


            • #7
              Originally posted by Günther Weber View Post
              "Eigene Dateien" hat jeder User. Wie der Pfad genau lautet, steht in der Registry.
              Es sollte wohl in NET auch eine SHGetSpecialFolderLocation Funktion geben, sonst sucht man sich ja bei den Windowsversionen einen Wolf
              Christian

              Comment


              • #8
                Es sollte wohl in NET ...
                Natürlich. Environment.GetFolderPath

                Hier am ehesten
                Code:
                Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));

                Comment


                • #9
                  Originally posted by Günther Weber View Post
                  aber beide Dateien werden vermutlich im gleichen Ordner liegen. Also leg sie jetzt in den Ordner Debug.
                  .
                  Dann funktioniert es wenn ich debugge. Wenn ich aber das Assembly erstelle, dann ist das Ganze ja in Release drin. Und da ist die Datei ja nicht

                  Comment


                  • #10
                    Originally posted by Ralf Jansen View Post
                    Natürlich. Environment.GetFolderPath

                    Hier am ehesten
                    Code:
                    Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));

                    Das heißt ich soll dann die csv Datei in dem Verzeichnis speichern, in dem ich bin. Dann muss ich das Ding ja dann wieder rauslöschen, weil ich will den Client ja nicht zumüllen.
                    Es muss doch eine Möglichkeit geben, die csv Datei so zu speichern, dass debuggen kann, erfolgreich eine ausführbare Datei erstellen kann und einen Stream öffnen kann

                    EDIT
                    Wenn ich das Ding in das aktuelle Verzeichnis speichern will, erhalte ich eine UnautorizedAccessException.
                    Das kann also auch nicht die Lösung sein
                    Hat keiner eine Idee?

                    Comment


                    • #11
                      Hat keiner eine Idee?
                      a.) Userdaten gehören nicht ins Anwendungsverzeichnis.
                      Üblicherweise hat der user in den Programme Verzeichnissen keine Schreibrechte.

                      b.) Die Userdaten gehören in das Daten Verzeichnis des Users. Darum hat der Liebe Gott ...äh Microsoft das auch mit dein Userverzeichnissen so erfunden. Nicht damit man die ignoriert!


                      Ein Verzeichnis wo man die ablegt kann man, wie oben erwähnt, mit Environment.GetFolderPath ermitteln. Eine Methode zur Pfadermittlung könnte z.b so aussehen. Wenn man seine Applikationsdaten wie z.b den Produktnamen den richtig gepflegt hat.

                      [Highlight=C#]public static string StorageLocation
                      {
                      get
                      {
                      return Path.Combine(Environment.GetFolderPath(Environment .SpecialFolder.ApplicationData), Application.ProductName);
                      }
                      }[/Highlight]

                      Wenn du schon initiale Daten für den Start hast also du beim ersten Start der Anwendung nicht ohne csv Datei beginnen willst/kannst. Würde ich diese default csv Datei zum Projekt hinzufügen. Und im Solution Explorer dann für diese Datei die 'Copy to Output' Property auf 'Copy if newer' setzen. Dann hast du die immer passend im Debug , Release oder sonstwie Ordner egal wie dein aktuelle Buildkonfiguration den heißt.

                      Dann solltest du in der Anwendung einen Code einbauen der auf obigen Storage Ordner prüft ob den eine csv Datei dort liegt. Wenn nicht kannst du dann aus deinem lokalen Anwendungsordner die Datei dorthin kopieren und dann von dort öffnen und benutzen.

                      Comment


                      • #12
                        Also brauchst Du die Datei nur zum Testen, und der Client braucht sie nicht?

                        UnautorizedAccessException - Du hast also nicht die nötigen Schreibrechte. Beim Debuggen auf Deinem Rechner, oder beim Anwender? Was ist "Das aktuelle Verzeichnis"?
                        Günther

                        Comment


                        • #13
                          Ok, danke für eure Tipps.
                          Die Idee war eigentlich folgende:
                          Die Datenmengen, mit denen ich rumhantiere sind sehr klein
                          Vllt. max 30 Zeilen (bei 4 Spalten)
                          Die kann ich locker im RAM halten. Also habe ich einfach die CopyToOuput Eigenschaft auf CopyAlways gesetzt. Jetzt liegt das Ding im RAM und ich kann darauf problemlos zugreifen.

                          Zum Verzeichnis: Das war AppData (habe Win 7).

                          Comment

                          Working...
                          X