Wie lese ich eine Textdatei im Stammverzeichnis des Projekts?


89

Ich möchte die erste Zeile einer Textdatei lesen, die ich dem Stammverzeichnis meines Projekts hinzugefügt habe. Das heißt, mein Lösungs-Explorer zeigt die TXT-Datei neben meinen CS-Dateien in meinem Projekt an.

Also habe ich versucht:

TextReader tr = new StreamReader(@"myfile.txt");
string myText = tr.ReadLine();

Dies funktioniert jedoch nicht, da es sich auf den Bin-Ordner bezieht und meine Datei nicht vorhanden ist. Wie kann ich dafür sorgen, dass dies funktioniert? : /

Vielen Dank


Übrigens, StreamReader Name ist ein bisschen verwirrend, Microsoft hätte diesen TextStreamReader meiner Meinung nach
benennen sollen

Antworten:


138

Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf myfile.txt und wählen Sie "Eigenschaften".

Stellen Sie von dort aus Build Actionauf content und Copy to Output Directoryauf entweder Copy alwaysoder einCopy if newer

Geben Sie hier die Bildbeschreibung ein


2
Ich möchte diese Datei lieber nicht meinen Benutzern zugänglich machen. Gibt es eine Möglichkeit, sie in die DLL einzubetten und von dort aus zu lesen?
Foreyez

3
@foreyez Fügen Sie die Zeichenfolge Ihrem Projekt als Ressource hinzu, anstatt möglicherweise eine Datei zu verwenden. Beachten Sie, dass die Daten nicht unerreichbar sind. Wie vertraulich sind die Daten in dieser Datei?
Dan J

5
Setzen Sie die Build-Option auf Embedded Resourceund lesen Sie den Artikel über das Lesen von eingebetteten Ressourcen blogs.msdn.com/b/nikola/archive/2008/05/14/…
dance2die

Wenn ich ein Setup für ein Projekt erstelle, kann ich nicht mit Eigenschaften arbeiten. Gibt es dafür eine andere Lösung?
Neel Bhasin

34

Sie können Folgendes verwenden, um das Stammverzeichnis eines Website-Projekts abzurufen:

String FilePath;
FilePath = Server.MapPath("/MyWebSite");

Oder Sie können das Basisverzeichnis wie folgt abrufen:

AppDomain.CurrentDomain.BaseDirectory

30

Fügen Sie Ihrem Projekt eine Ressourcendatei hinzu (Klicken Sie mit der rechten Maustaste auf Projekt-> Eigenschaften-> Ressourcen). Wo "Strings" steht, können Sie zu "Dateien" wechseln. Wählen Sie "Ressource hinzufügen" und wählen Sie Ihre Datei aus.

Sie können jetzt über die Properties.ResourcesSammlung auf Ihre Datei verweisen .


15
private string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

Die obige Methode bringt Ihnen ungefähr Folgendes:

"C:\Users\myuser\Documents\Visual Studio 2015\Projects\myProjectNamespace\bin\Debug"

Von hier aus können Sie mit System.IO.Directory.GetParent rückwärts navigieren:

_filePath = Directory.GetParent(_filePath).FullName;

1 Mal gelangen Sie zu \ bin, 2 Mal gelangen Sie zu \ myProjectNamespace. Es wäre also so:

_filePath = Directory.GetParent(Directory.GetParent(_filePath).FullName).FullName;

Nun haben Sie so etwas wie "C: \ Benutzer \ myuser \ Dokumente \ Visual Studio 2015 \ Projekte \ myProjectNamespace". Fügen Sie also einfach den endgültigen Pfad zu Ihrem Dateinamen hinzu, zum Beispiel:

_filePath += @"\myfile.txt";
TextReader tr = new StreamReader(_filePath);

Ich hoffe es hilft.


Danke, aber kann _filePath = Path.Combine (_filePath, "myfile.txt"); // stilvoll :)
FreeClimb

14

Sie können es auch einbetten lassen (Build-Aktion auf setzen Resource). So rufen Sie es von dort ab:

private static UnmanagedMemoryStream GetResourceStream(string resName)
{
    var assembly = Assembly.GetExecutingAssembly();
    var strResources = assembly.GetName().Name + ".g.resources";
    var rStream = assembly.GetManifestResourceStream(strResources);
    var resourceReader = new ResourceReader(rStream);
    var items = resourceReader.OfType<DictionaryEntry>();
    var stream = items.First(x => (x.Key as string) == resName.ToLower()).Value;
    return (UnmanagedMemoryStream)stream;
}

private void Button1_Click(object sender, RoutedEventArgs e)
{
    string resName = "Test.txt";
    var file = GetResourceStream(resName);
    using (var reader = new StreamReader(file))
    {
        var line = reader.ReadLine();
        MessageBox.Show(line);
    }
}

(Ein Code aus dieser Antwort von Charles )


3

In diesem Fall müssen Sie den absoluten Pfad verwenden. Aber wenn Sie das einstellen CopyToOutputDirectory = CopyAlways, wird es so funktionieren, wie Sie es tun.


0

In diesem Code greifen Sie auf das rootVerzeichnisprojekt zu:

 string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

dann:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
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.