Lesen Sie Dateien aus einem im Projekt vorhandenen Ordner


87

Ich habe ein C # -Projekt (Windows-Konsolenanwendung). Ich habe einen Ordner mit dem Namen Daten im Projekt erstellt. Es gibt zwei Textdateien im Ordner Daten.

Wie kann ich die Textdateien aus dem Ordner "Daten" lesen? Ich habe unten versucht.

string[] files = File.ReadAllLines(@"Data\Names.txt")

Es ist ein Fehler, dass die Datei nicht gefunden wurde.

Ich habe einige zuvor veröffentlichte Stackoverflow-Antworten überprüft und keine davon funktioniert für mich.

Wie kann ich vorgehen? Vielen Dank!


1
Google "aktuelles Verzeichnis". Die ausführbare Datei wird nicht unbedingt in Ihrem Quellcode-Ordner ausgeführt!
Ondrej Tucny

Kopieren Sie diesen Datenordner beim Erstellen des Projekts in die Ausgabe? Überprüfen Sie die Optionen für die Dateien und korrigieren Sie sie.
Ryadavilli

Die Einstellung lautet Immer in Ausgabeverzeichnis kopieren.
SKJ

Antworten:


122

Der folgende Code sollte funktionieren:

string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"Data\Names.txt");
string[] files = File.ReadAllLines(path);

Mein Ordner und meine Dateien sind nicht im Assembly-Ordner vorhanden: s .. Warum ist das so?
Bohem.be

33
Markieren Sie in Visual Studio die Datei und setzen Sie sie dann Build Actionauf Contentund Copy to Output DirectoryaufCopy always
Florian Moser

3
Verwenden Sie einfach @ "Data \ Name.txt" und wenden Sie die @ FlorianMoser-Notation an
Alexandr Sargsyan

Wofür bedeutet das @?
Gumuruh

@ dort heißt wörtliches String-Literal, siehe stackoverflow.com/questions/3311988/…
Morbia

34

Es hängt davon ab, wo sich Ihr Datenordner befindet

So rufen Sie das Verzeichnis ab, in dem sich die EXE-Datei befindet:

AppDomain.CurrentDomain.BaseDirectory

So rufen Sie das aktuelle Verzeichnis ab:

Environment.CurrentDirectory

Dann können Sie Ihren Verzeichnispfad verketten ( @"\Data\Names.txt")


18

Wenn Sie alle Dateien im Ordner "Daten" abrufen möchten, codieren Sie sie einfach wie folgt

string[] Documents = System.IO.Directory.GetFiles("../../Data/");

Jetzt besteht die 'Dokumente' aus einem Array des vollständigen Objektnamens von zwei Textdateien im 'Daten'-Ordner' Daten '.


@Bunyip: Müssen Sie den Inhalt der Textdatei lesen oder nur die Dateien im Ordner kennen?
Uthistran Selvaraj

13

Ich habe ein C # -Projekt (Windows-Konsolenanwendung). Ich habe einen Ordner mit dem Namen Bilder im Projekt erstellt. Es gibt eine ico-Datei namens MyIcon.ico. Ich habe wie unten im Ordner "Bilder" auf "MyIcon.ico" zugegriffen.

this.Icon = new Icon(@"../../Images/MyIcon.ico");

9

Immer in Ausgabeverzeichnis kopieren ist eingestellt und versuchen Sie Folgendes:

 Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
 String Root = Directory.GetCurrentDirectory();

Dies sollte die akzeptierte Antwort sein - es ist robust, ob sich die Datei in einer Bibliothek oder im ausführbaren Projekt befindet.
Tullochgorum

0

Für Xamarin.iOS können Sie den folgenden Code verwenden, um den Inhalt der Datei abzurufen, falls eine Datei vorhanden ist.

var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine(documents, "xyz.json");
if (File.Exists(filename))
{
var text =System.IO.File.ReadAllText(filename);
}

-1

Verwenden Sie diesen Code auch zum Lesen aller Dateien in Ordnern und Unterordnern

class Program
{
    static void Main(string[] args)
    {

        getfiles get = new getfiles();
        List<string> files =  get.GetAllFiles(@"D:\Document");

        foreach(string f in files)
        {
            Console.WriteLine(f);
        }


        Console.Read();
    }


}

class getfiles
{
    public List<string> GetAllFiles(string sDirt)
    {
        List<string> files = new List<string>();

        try
        {
            foreach (string file in Directory.GetFiles(sDirt))
            {
                files.Add(file);
            }
            foreach (string fl in Directory.GetDirectories(sDirt))
            {
                files.AddRange(GetAllFiles(fl));
            }
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.Message);
        }



        return files;
    }
}

-1
string myFile= File.ReadAllLines(Application.StartupPath.ToString() + @"..\..\..\Data\myTxtFile.txt")

3
Bitte fügen Sie einen Text hinzu, der ausführlich beschreibt, warum dies funktioniert / was es tut
Gibolt

1
Dies könnte zwar die Frage des Autors beantworten, es fehlen jedoch einige erklärende Wörter und / oder Links zur Dokumentation. Raw-Code-Schnipsel sind ohne einige Ausdrücke nicht sehr hilfreich. Möglicherweise ist es auch sehr hilfreich , eine gute Antwort zu schreiben . Bitte bearbeiten Sie Ihre Antwort - Aus Bewertung
Nick

-1

Verwenden Sie dies, es funktioniert.

string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"TestData\test.json");
var response = JsonConvert.DeserializeObject<Response>(File.ReadAllText(path));

Bitte beachten Sie: Sie müssen sicherstellen, dass die Eigenschaften der Datei test.jsonauf festgelegt sind

"Build Action" = "Inhalt"

"In Ausgabeverzeichnis kopieren" = "Immer kopieren"


Wenn Sie eine alte Frage beantworten, ist Ihre Antwort für andere StackOverflow-Benutzer viel nützlicher, wenn Sie einen Kontext angeben, um zu erklären, wie Ihre Antwort hilft, insbesondere für eine Frage, für die bereits eine Antwort akzeptiert wurde. Siehe auch : Wie kann ich eine gute Antwort schreiben .
David Buck

-2

Dies war hilfreich für mich, wenn Sie die verwenden

var dir = Directory.GetCurrentDirectory()

Die Pfadfüllung befindet sich jenseits des aktuellen Ordners. Sie enthält diesen Pfad \ bin \ debug. Ich empfehle Ihnen, dass Sie den verwenden können

string dir = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName

Drucken Sie dann den dir-Wert aus und überprüfen Sie, ob der Pfad Sie angibt

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.