C# TXT Datei auslesen fehler

tonikln

Lt. Junior Grade
Registriert
Aug. 2005
Beiträge
314
hallo zusammen,
hab ein kleines Problem und zwar ich habe eine silverlight anwendung mit der ich eine Datei auslesen will und in einer txtbox eintragen...

nur irgendwie geht das mit dem Pfad nicht bekomm da aber immer die Meldung:
Fehler beim Versuch, auf die Methode zuzugreifen: System.IO.File.OpenText(System.String)

und nun mein Code:
Code:
StreamReader datei;
            datei = File.OpenText(@"C:\liste.txt");
            string zeile = "";
            string[] felder;
            int n = 1;
            while (datei.Peek() != -1)
            {
                zeile = datei.ReadLine();
                felder = zeile.Split(new char[] { ',' });
                textBox3.Text = felder[0];
                textBox4.Text = felder[1];
                ++n;
            }

            datei.Close();

Danke im Voraus
 
Ich hab nun keine Ahnung von C#, aber in anderen Sprachen muss man die Backslashes escapen. Versuch mal so:
Code:
datei = File.OpenText(@"C:\\liste.txt");
Ich weiß aber auch nicht, was das @ bedeutet..

Nachtrag: Ok, sorry, daran liegt es nicht. Weiß nun, was das @ bedeutet.
 
Zuletzt bearbeitet:
Ich hab zwar keinen Plan von Silverlight, aber Objekte muss man immer noch erstellen ;)
StreamReader datei = new StreamReader();
Oder?
Die Datei exisitiert aber?
Zeig mal deine Using-Direktiven.

edit:
Ok der Code funzt bei mir soweit(ohne Silverlight), meckert nur beim Arrayindex etwas rum, aber wenn man textbox4 auskommentiert liest er die erste Zeile.
 
Zuletzt bearbeitet:
Eine Browseranwendung soll einfach so auf eine lokale Datei zugreifen können? Da kann ja jeder kommen.
Schau mal hier in der MSDN Library. Die Methode hat ein SecurityCriticalAttribute. Ich bin mir ziemlich sicher, dass es damit zusammenhängt. Vermutlich muss man für die Silverlight-Anwendung irgendwelche Restriktionen im Browser lockern. Ich würde mal in der Richtung weitersuchen...
 
So ließt du zeilenweise eine Datei ein.


Code:
String line = "";
try {
  StreamReader reader = new StreamReader(@"C:\datei.txt");
  while ((line = reader.ReadLine()) != null) {
    Console.WriteLine(line);
  }
  reader.Close();
}
catch {
  // Fehler beim Öffnen der Datei
}
 
Hier die Lösung:

Auslesen einer Textdatei und das Zeile für Zeile:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;


namespace ReadTxtFile
{
    class Program
    {
        static void Main(string[] args)
        {
            /* durch diese using-Derektive wird das StreamReader Objekt automatisch disposed 
             * und gibt seine Recourcen frei
             */
            using (StreamReader sr = new StreamReader("test.txt"))
            {
                // durahclaufe solange die Datei ZEILE-FÜR-ZEILE bis du am Ende des Streams bist
                while(!sr.EndOfStream)
                    Console.WriteLine(sr.ReadLine()); // Zeile-für-Zeile Datei auslesen
            }

            // beliebige Taste drücken zum schließen der Konsolenanwendung
            Console.ReadKey(true);
        }
    }
}


Das ist die gesamte "Program.cs" aus einer Konsolenanwendung, also kannst du das so direkt reinkopieren, musst nur den Name und Namespace anpassen der Anwendung.

Bitte nutzt using-Derektiven um Recourcen wieder frei zu geben. Durch diese Derektive wird die Datei geschlossen, auch der Stream wird geschlossen und der Stream wird auch disposed. Also sauberer kann man es kaum haben.
Dazu kommt, dass man auch keine Try-Catch an dieser Stelle benötigt, da man eine saubere Bedingung geben kann. Zumal ein Handel Fehler nicht kommen kann, da wir ja mit using an dieser Stelle arbeiten. ;)
Zumal, wenn dann doch eine Try-Catch benutzt wird, dann gebt auch IOException an. :D

Bei Fragen, stell sie, ich versuche immer so gut wie möglich Hilfestellung zu geben... ;)
Ich hoffe meine Erklärungen waren verständlich.
 
Zuletzt bearbeitet:
Gobble-G schrieb:
Vermutlich muss man für die Silverlight-Anwendung irgendwelche Restriktionen im Browser lockern.
Ich glaube inzwischen, das wird nichts. Willst du wirklich eine lokale Datei öffnen? Dann benutz mal den OpenFileDialog. Die Eigenschaft File stellt dir eine Methode OpenTextFile() bereit, von der du den Stream bekommst. Offenbar geht es wirklich nur über diesen Dialog.

MfG
 
Jop, das dürfte nur über den OpenFileDialog gehen, denn woher willst du wissen, dass auch wirklich dort die Datei ist. Das muss der User schon selber machen...
 
HaGGi.13 schrieb:
...denn woher willst du wissen, dass auch wirklich dort die Datei ist.
Darum gehts nicht, sondern darum, dass durch die Sicherheitsbestimmungen in Silverlight nicht aus heiterem Himmel auf das Dateisystem zugegriffen werden kann.
 
Okay, aber das war mir klar. ;)
... ich war so frei und habe das einfach vorausgesetzt, das man weiß, dass man von einer Silverlight Anwendung nicht einfach so auf das Dateisystem rum gurken kann.

... ich hätte es hinschreiben sollen zu den anderen Aspekt, gebe ich dir Recht. Mein Fehler. :heul::
 
Hallo Jungs,
also eure Antworten sind alle TOP, aber leider für de Silverlight Anwendung etwas unbrauchbar :(


Gibt es denn ine andere Möglichkeit, aus der Silverlight Anwendung eine txt Datei zu öffnen?

Ich mein, das später bentuzen möchte und andere Leute aus dem Netz eine Datei in den Browser ausgekotzt haben möchten, wie mach ich das denn dann am besten ??
 
Silverlight ist immer mit C# gebunden. Da sollten alle Methoden von C# funkionieren.
zuerst solltest du immer prüfen ob dein ordner exisitert. Braucht man aber meist nur wenn man was schreiben will...
Code:
/// <summary>
/// Prüft ob der Ordner Existiert. Sollte es nicht so sein, erstellt es einen.
/// </summary>
/// <param name="Path">Pfad zu der Datei</param>
/// <returns></returns>
public static void isDirectory(String DirPath)
{
    try
    {
        String path = Path.GetDirectoryName(DirPath);
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
    }
    catch (DirectoryNotFoundException dnfe)
    {
       ...
       ...
    }
    und weitere catches
}

Dabei sollte man auch beachten dass der Pfad auch richtig angegeben wird. wenn man sowas wie "c:\bla\bla.txt" schreibt kriegst du eine Fehlermeldung
Richtig wäre es mit "c:\\bla\\bla.txt"

du willst StreamReader verwenden, so kannst du es sicherlich in Silverlight verwenden

Code:
/// <summary>
/// Schreibt die Datei in einen String Array mit Länge readlines.
/// </summary>
/// <param name="file">Pfad der Datei und Dateiname.</param>
/// <param name="readlines">Anzahl der Zeilen die gelesen werden sollten.</param>
/// <returns>String Array mit bestimmte Anzahl der Zeilen.</returns>
public static String[] ReadFile(String file, int readlines)
{
    if (!File.Exists(file))
        return null;
    isDirectory(file);
    String[] result = new String[readlines];
    try
    {
        FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Read);
        StreamReader sr = new StreamReader(fs);
        int i = 0;
        while (!sr.EndOfStream && i < readlines) //loop through the entire file.
        {
            result[i] = sr.ReadLine(); //read each line.
            i++;
        }
    }
    catch (ObjectDisposedException ode)
    {
        ...
    }
    return result;
}

Die begrenzung von Zeilen kannst du auch rausschmeissen...
 
Ich verstehe momentan noch nicht so das Ganze mit der Textdatei. Die Textdatei liegt auf dem Server oder auf dem Client? Mit Silverlight willst du diese Datei öffnen und im Browser zur Anzeige bringen? In welchem Verzeichnis liegt die Datei? Gibst du einen genauen Pfad an oder nur einen relativen Pfad? Wie sind die Schreib/Leserechte für die Datei eingestellt. Welcher User hat das Recht die Datei zu lesen?

Also wie gesagt, werde ich da noch nicht so ganz schlau...
 
Rossibaer schrieb:
Ich verstehe momentan noch nicht so das Ganze mit der Textdatei. Die Textdatei liegt auf dem Server oder auf dem Client? Mit Silverlight willst du diese Datei öffnen und im Browser zur Anzeige bringen? In welchem Verzeichnis liegt die Datei? Gibst du einen genauen Pfad an oder nur einen relativen Pfad? Wie sind die Schreib/Leserechte für die Datei eingestellt. Welcher User hat das Recht die Datei zu lesen?

Also wie gesagt, werde ich da noch nicht so ganz schlau...

Ich wollte einfach so tun, als ob ich einen Server hätte und irgendwelche leute auf eine Datei zugreifen können. Dabei soll dann der Inhalt der Datei im Browser ausgegeben werden... Die Benutzer können dann belibig ändern was die wollen.
 
roker002 schrieb:
Silverlight ist immer mit C# gebunden.
Das ist falsch. Man kann ebenso in Visual Basic für Silverlight programmieren. Was du wahrscheinlich meinst, ist, dass sich Silverlight dem .NET-Framework bedient. Aber auch das ist nicht richtig. Silverlight ist eine extrahierte und angepasste Submenge des .NET-Frameworks. Daher besteht keine direkte Kompatibilität und aus Sicherheitsgründen funktionieren natürlich die ganzen Dateisystemfunktionen und natürlich auch dein Beispiel nicht. Weiter oben steht das schon - also lies!

@tonikln: Wie ich schon schrieb, kannst du den OpenFileDialog für das Öffnen lokaler Dateien benutzen. Für Dateien auf dem Server gibt es andere Möglichkeiten. Also - wie Rossibaer schon schrieb - was willst du eigentlich machen?


Edit: Sorry, zu spät gesehen...
 
Nunja auch wenn es nicht die Eingangsfrage beantwortet, aber Silverlight ermöglich ab der neuen Version 4 bedingt Zugriff auf das lokale Dateisystem und das 'ziehen' von Dateien von lokal in die Silverlight Anwendung, aber das war ja nicht die Frage.

Aber so wie ich das verstehe soll am Ende die Silverlight Anwendung und die Textdatei auf dem 'Server' sein und jeder User von sonstwo kann zugreifen und was ändern, das ist das Ziel. Richtig?
 
M80331 schrieb:
Aber so wie ich das verstehe soll am Ende die Silverlight Anwendung und die Textdatei auf dem 'Server' sein und jeder User von sonstwo kann zugreifen und was ändern, das ist das Ziel. Richtig?

Ja richtig ;)
 
Also so wie ich das jetzt nur halbwegs verstehe, ist die Datei auf dem Server, die Silverlight Anwendung liegt auf dem Server und wird über einen Webserver an die Betrachter der Seite übermittelt oder zumindest das was Silverlight braucht um die Anwendung im Browser anzeigen zu können. Auf dem Server liegt auch eine Datei, z.B. C:\Temp\HelloWorld.txt. Die Silverlight-Anwendung soll diese Datei öffnen und zur Anzeige bringen, ebenso sollen die Anwender den Inhalt ändern können.

So nun folgendes: Der Webserver läuft als Dienst unter einem Account. Wenn dieser Account keine Lese-/Schreibrechte auf den Pfad oder die Datei selbst hat, solltest du keine Möglichkeit haben, diese Datei zu öffnen geschweige denn schreiben zu können. Um Schreib/Lesezugriffe zu erlauben, kann man als Administrator das Kommandozeilentool CACLS verwenden. Das zeigt einem an, wer welche Rechte für diese Datei hat. Ebenso kannst du damit die Rechte ändern. Das Ganze wird aber auch nur dann funktionieren können, wenn tatsächlich die Silverlightanwendung auf dem Server ausgeführt wird. Das wäre bei ASP.Net der Fall, bei Silverlight, würde Google sicher weiter helfen. Wenn jedoch die Silverlightanwendung ausschließlich Clientseitig ausgeführt wird, dann wird der lokale Pfad nichts nutzen, da der Anwender nicht per Remote direkten Zugriff auf das Dateisystem des Webserver hat. Ebenso würde die Applikation dann eher im lokalen Dateisystem des Client-PC nach dieser Datei suchen, statt auf dem Server. Stattdessen wäre vielleicht eine Referenzierung möglich, z.B. http://WebserverAdresse/MeineApp/HelloWorld.txt. Ob dann der Zugriff geht, wird wahrscheinlich über den Webserver (ich vermute mal IIS) selbst eingestellt werden müssen. Ein Versuch wäre es bestimmt wert.

Was und wie du jetzt einzelne Dateisystem Klassen/Objekte des .Net Frameworks in Silverlight verwenden kannst, musst du mal in der Hilfe zu Silverlight nachschauen! Google kann da sicher auch was liefern...

Viel Erfolg.
 
Zurück
Oben