2013-07-01 7 views
17

Die meisten Beispiele zeigen, wie Textdateien vom genauen Speicherort gelesen werden (zB "C: \ Benutzer \ Besitzer \ Dokumente \ test1.txt"). Aber, wie man Textakten liest, ohne vollständigen Weg zu schreiben, also würde mein Code funktionieren, wenn er auf andere Computer kopiert wird. Mit Visual Studio habe ich 2 Textdateien zum Projekt hinzugefügt (Konsolenprojekt) und weiß nicht, wie ich diese Dateien am besten lese. Hoffe, ich habe mein Problem klar beschrieben. Vielleicht musste ich diese txt-Dateien differently (wie direkt in den gleichen Ordner als .exe-Datei) hinzufügen?So lesen Sie vorhandene Textdateien, ohne den Pfad zu definieren

+1

Was versuchen Sie zu erreichen? Etwas wie 'Read (" test1.txt "); ' ?? – Lucas

+2

Fügen Sie neben den anderen Antworten die folgenden Punkte hinzu: Denken Sie daran, die Datei als Inhalt hinzuzufügen, damit sie in das Ausgabeverzeichnis kopiert wird. Klicken Sie dazu mit der rechten Maustaste auf die Datei, die sich in Ihrem Projekt unter dem Lösungsexplorer (test1.txt) befindet, wählen Sie Eigenschaften und dann "Build Action" als Inhalt und Kopieren in "Ausgabeverzeichnis" "Immer kopieren" oder "Kopieren wenn neuer ". – saamorim

Antwort

29

Sie könnten Directory.GetCurrentDirectory verwenden:

var path = Path.Combine(Directory.GetCurrentDirectory(), "\\fileName.txt"); 

, die für die Datei fileName.txt im aktuellen Verzeichnis der Anwendung aussehen wird.

+6

['Directory.GetCurrentDirectory()'] (http://msdn.microsoft.com/en-us/library/system.io.directory.getcurrentdirectory.aspx) gibt _ "Eine Zeichenfolge zurück, die den Pfad des aktuellen Arbeitsbereichs enthält Verzeichnis und endet nicht mit einem umgekehrten Schrägstrich (\\) "_. Verwenden Sie 'Path.Combine()' anstelle von String-Verkettung. – CodeCaster

+2

Bei einer Konsolenanwendung ist das Arbeitsverzeichnis oft nicht dasselbe wie das Verzeichnis, das die ausführbare Datei enthält. Warum befinden sich diese beiden Textdateien, die dem Programm zugeordnet sind, dort? –

+3

es geht für das Verzeichnis des aktuellen Laufwerks nicht das Verzeichnis der Anwendung – CME64

8

Wenn Sie einen Pfad angeben, kann er absolut/verwurzelt oder relativ sein. Wenn Sie einen relativen Pfad angeben, wird dieser aufgelöst, indem Sie das Arbeitsverzeichnis des laufenden Prozesses übernehmen.

Beispiel:

string text = File.ReadAllText("Some\\Path.txt"); // relative path 

Der obige Code hat die gleiche Wirkung wie die folgenden:

string text = File.ReadAllText(
    Path.Combine(Environment.CurrentDirectory, "Some\\Path.txt")); 

Wenn Sie Dateien, die in der gleichen Position relativ immer sein werden an Ihrem Anwendung, nur einen relativen Pfad zu ihnen, und sie sollten korrekt auf verschiedenen Computern auflösen.

2

Sie müssen entscheiden, in welchem ​​Verzeichnis die Datei relativ sein soll. Sobald Sie das getan haben, bauen Sie den vollständigen Pfad wie folgt aus:

string fullPathToFile = Path.Combine(dir, fileName); 

Wenn Sie das Basisverzeichnis nicht liefern dir dann werden Sie an der Gesamt ausgeliefert sein, was auch immer passiert, in das Arbeitsverzeichnis des Prozesses. Das ist etwas, das Sie nicht kontrollieren können. Beispielsweise können Verknüpfungen zu Ihrer Anwendung es angeben. Die Verwendung von Dateidialogen kann dies ändern.

Für eine Konsolenanwendung ist es sinnvoll, relative Dateien direkt zu verwenden, da Konsolenanwendungen so konzipiert sind, dass das Arbeitsverzeichnis eine kritische Eingabe darstellt und ein gut definierter Teil der Ausführungsumgebung ist. Für eine GUI-Anwendung ist dies jedoch nicht der Fall, weshalb ich empfehle, dass Sie Ihren relativen Dateinamen explizit in einen vollständigen absoluten Pfad unter Verwendung eines gut definierten Basisverzeichnisses konvertieren.

Jetzt, da Sie eine Konsolenanwendung haben, ist es sinnvoll, einen relativen Pfad zu verwenden, vorausgesetzt, dass die fraglichen Dateien im Arbeitsverzeichnis liegen. Aber es wäre sehr üblich, dass dies nicht der Fall ist. Normalerweise wird das Arbeitsverzeichnis verwendet, um anzugeben, wo die Eingabe- und Ausgabedateien des Benutzers gespeichert werden sollen. Es zeigt normalerweise nicht auf den Speicherort der Programmdateien.

Eine letzte Option ist, dass Sie nicht versuchen, diese Programmdateien als externe Textdateien bereitzustellen. Vielleicht ist es eine bessere Option, sie als Ressourcen mit der ausführbaren Datei zu verknüpfen. Auf diese Weise sind sie mit der ausführbaren Datei verbunden und Sie können dieses Problem vollständig umgehen.

0

Es gibt viele Möglichkeiten, einen Pfad zu erhalten. Siehe CurrentDirrectory. Sie können auch den vollständigen Dateinamen Ihrer Anwendung abrufen, indem Sie Assembly.GetExecutingAssembly() verwenden. Location und dann verwenden Sie die Path-Klasse, um einen Verzeichnisnamen abzurufen.

+0

Was passiert, wenn sich die Baugruppe im GAC befindet? – Dan

+0

A pb. Also nicht für jede Situation geeignet, aber ok um von exe angerufen zu werden. – ElDog

1

Als Ihr Projekt ist ein Konsolenprojekt Sie den Pfad zu den Textdateien passieren können, die Sie über die Zeichenfolge lesen wollen [] args

static void Main(string[] args) 
{ 
} 

Innerhalb Haupt Sie überprüfen können, ob Argumente übergeben werden

if (args.Length == 0){ System.Console.WriteLine("Please enter a parameter");} 

Extract ist ein Argument

string fileToRead = args[0]; 

Fast alle Sprachen unterstützen das Konzept der Argument übergeben und folgen ähnlichen Mustern zu C#.

Weitere C# spezifische siehe http://msdn.microsoft.com/en-us/library/vstudio/cb20e19t.aspx

0

Sie müssen unbedingt wissen, wo die Dateien gelesen werden lokalisiert werden kann. Jedoch kann diese Information relativ natürlich sein, so dass es gut an andere Systeme angepasst werden kann.

So könnte es in das aktuelle Verzeichnis beziehen (erhalten sie von Directory.GetCurrentDirectory()) oder auf die Anwendung ausführbaren Pfad (zB. Application.ExecutablePath kommt bei Verwendung von Windows Forms oder über Assembly.GetEntryAssembly().Location in den Sinn) oder zu einem speziellen Windows-Verzeichnis wie „Dokumente und Einstellungen "(Sie sollten Environment.GetFolderPath() mit einem Element der Environment.SpecialFolder Enumeration verwenden).

Beachten Sie, dass das "aktuelle Verzeichnis" und der Pfad der ausführbaren Datei nicht unbedingt identisch sind. Sie müssen wissen, wo Sie suchen müssen!

In beiden Fällen, wenn Sie einen Pfad bearbeiten müssen, verwenden Sie die Path-Klasse, um Teile des Pfads zu teilen oder zu kombinieren. den Pfad der Datei (einschließlich Dateiname mit Erweiterung) schreiben

 static void Main(string[] args) 
     { 
      string fileName = System.IO.Path.GetFullPath(Directory.GetCurrentDirectory() + @"\Yourfile.txt"); 

      Console.WriteLine("Your file content is:"); 
      using (StreamReader sr = File.OpenText(fileName)) 
      { 
       string s = ""; 
       while ((s = sr.ReadLine()) != null) 
       { 
        Console.WriteLine(s); 
       } 
      } 

      Console.ReadKey(); 
     } 

Wenn Ihr mit Konsole können Sie auch noch den Benutzer this.It fragt:

1

Dies wird eine Datei in das Arbeitsverzeichnis laden.

 static void Main(string[] args) 
     { 

      Console.WriteLine("****please enter path to your file****"); 
      Console.Write("Path: "); 
      string pth = Console.ReadLine(); 
      Console.WriteLine(); 
      Console.WriteLine("Your file content is:"); 
      using (StreamReader sr = File.OpenText(pth)) 
      { 
       string s = ""; 
       while ((s = sr.ReadLine()) != null) 
       { 
        Console.WriteLine(s); 
       } 
      } 

      Console.ReadKey(); 
     } 

Wenn Sie WinForms zum Beispiel verwenden versuchen, dieses einfache Beispiel:

 private void button1_Click(object sender, EventArgs e) 
     { 
      string pth = ""; 
      OpenFileDialog ofd = new OpenFileDialog(); 

      if (ofd.ShowDialog() == DialogResult.OK) 
      { 
       pth = ofd.FileName; 
       textBox1.Text = File.ReadAllText(pth); 
      } 
     } 
11

Wenn Ihre Anwendung ein Web-Service ist, wird Directory.CurrentDirectory nicht.

Verwenden Sie stattdessen System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory.ToString(), "yourFileName.txt")).

Verwandte Themen