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

foreyez
quelle
Ü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

dance2die
quelle
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
Mangesh Pimpalkar
quelle
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 .

Ethan Cabiac
quelle
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.

Bruno Carvalho
quelle
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 )

HB
quelle
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.

Shuhel Ahmed
quelle
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"))
Mojtaba Nava
quelle