2013-07-01 14 views
17

Większość przykładów pokazuje, jak odczytywać plik tekstowy z dokładnej lokalizacji (np. "C: \ Users \ Owner \ Documents \ test1.txt"). Ale, jak odczytywać pliki tekstowe bez zapisywania pełnej ścieżki, więc mój kod będzie działał po skopiowaniu na inne komputery. W studiu graficznym dodałem 2 pliki tekstowe do projektu (projekt konsoli) i nie wiem, jak najlepiej odczytać te pliki. Mam nadzieję, że wyraźnie opisałem mój problem. Może musiałbym inaczej dodać te pliki txt (np. Bezpośrednio do tego samego folderu, co plik .exe)?Jak odczytywać istniejące pliki tekstowe bez definiowania ścieżki

+1

Co starasz się osiągnąć? Coś jak "Odczyt (" test1.txt ");" ?? – Lucas

+2

Podobnie jak przy dodawaniu poniższych, oprócz innych odpowiedzi, pamiętaj o dodaniu pliku jako zawartości, aby został skopiowany do katalogu wyjściowego. Aby to zrobić, kliknij prawym przyciskiem myszy plik znajdujący się w projekcie pod eksploratorem rozwiązań (test1.txt), wybierz właściwości, a następnie wybierz "Kompiluj akcję" jako Treść i Kopiuj do "Katalog wyjściowy" "Kopiuj zawsze" lub "Kopiuj, jeśli nowsza". – saamorim

Odpowiedz

29

Można użyć Directory.GetCurrentDirectory:

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

Który będzie szukał pliku fileName.txt w bieżącym katalogu aplikacji.

+6

['Directory.GetCurrentDirectory()'] (http://msdn.microsoft.com/en-us/library/system.io.directory.getcurrentdirectory.aspx) zwraca _ "Ciąg znaków zawierający ścieżkę bieżącego działania i nie kończy się na ukośniku odwrotnym (\\) "_. Użyj 'Path.Combine()' zamiast łączenia ciągów. – CodeCaster

+2

W przypadku aplikacji konsolowej katalog roboczy bardzo często nie jest tym samym, co katalog zawierający plik wykonywalny. Dlaczego znajdują się tam te dwa pliki tekstowe powiązane z programem? –

+3

dotyczy katalogu bieżącego dysku, a nie katalogu aplikacji. – CME64

8

Gdy podajesz ścieżkę, może ona być bezwzględna/zakorzeniona lub względna. Jeśli podasz ścieżkę względną, zostanie ona rozwiązana poprzez pobranie katalogu roboczego uruchomionego procesu.

Przykład:

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

Powyższy kod ma ten sam efekt co następuje:

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

Jeśli masz pliki, które są zawsze będzie w tym samym miejscu w stosunku do swojej aplikacji, po prostu dołącz do nich względną ścieżkę i powinny one poprawnie działać na różnych komputerach.

2

Musisz zdecydować, który katalog ma być względny. Gdy już to zrobisz, możesz zbudować pełną ścieżkę tak:

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

Jeśli nie dostarczy katalog bazowy dir wtedy będzie w całkowitej łasce, co dzieje się w katalogu roboczym procesu. To może być poza twoją kontrolą. Na przykład skróty do aplikacji mogą je określać. Korzystanie z okien dialogowych plików może go zmienić.

W przypadku aplikacji konsolowej uzasadnione jest stosowanie względnych plików bezpośrednio, ponieważ aplikacje konsoli są zaprojektowane w taki sposób, że katalog roboczy jest kluczowym elementem wejściowym i jest dobrze zdefiniowaną częścią środowiska wykonawczego. Jednak w przypadku aplikacji GUI tak nie jest, dlatego zalecam jawną konwersję względnej nazwy pliku na pełną bezwzględną ścieżkę przy użyciu dobrze zdefiniowanego katalogu podstawowego.

Teraz, ponieważ masz aplikację konsolową, rozsądne jest użycie ścieżki względnej, pod warunkiem, że oczekiwane pliki będą znajdować się w katalogu roboczym. Byłoby jednak bardzo często, gdyby tak nie było. Zwykle katalog roboczy służy do określania, gdzie mają być przechowywane pliki wejściowe i wyjściowe użytkownika. Zazwyczaj nie wskazuje miejsca, w którym znajdują się pliki programu.

Ostatnia opcja polega na tym, że nie próbujesz wdrożyć tych plików programu jako zewnętrznych plików tekstowych. Być może lepszym rozwiązaniem jest połączenie ich z plikiem wykonywalnym jako zasobami. W ten sposób są one powiązane z plikiem wykonywalnym i możesz całkowicie pominąć ten problem.

0

Istnieje wiele sposobów zdobycia ścieżki. Patrz: CurrentDirrectory mentioned. Ponadto można uzyskać pełną nazwę pliku aplikacji, używając Assembly.GetExecutingAssembly(). Lokalizacja , a następnie użyj klasy Path, aby uzyskać nazwę katalogu.

+0

Co się stanie, jeśli zespół zostanie umieszczony w GAC? – Dan

+0

A pb. Tak więc nie nadaje się do żadnej sytuacji, ale ok do wywołania z exe. – ElDog

1

W projekcie jest projektem konsoli można przekazać ścieżkę do plików tekstowych, które chcesz przeczytać za pośrednictwem string [] args

static void Main(string[] args) 
{ 
} 

ciągu Menem można sprawdzić, czy argumenty są przekazywane

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

Extract argument

string fileToRead = args[0]; 

Prawie wszystkie języki popierają koncepcję argumentu przechodzącego i podążania za podobnymi wzorami do C#.

Dla bardziej specyficznych C# zobaczyć http://msdn.microsoft.com/en-us/library/vstudio/cb20e19t.aspx

0

Koniecznie trzeba wiedzieć, gdzie mogą znajdować się pliki do odczytu. Jednak informacja ta może być względnie oczywiście, więc może być dobrze dostosowane do innych systemów.

Więc to może odnosić się do bieżącego katalogu (get it od Directory.GetCurrentDirectory()) lub do aplikacji wykonywalnego ścieżki (np. Application.ExecutablePath przychodzi do głowy w przypadku korzystania z Windows Forms lub poprzez Assembly.GetEntryAssembly().Location) lub do jakiegoś specjalnego katalogu Windows, jak „Documents and Settings "(powinieneś użyć Environment.GetFolderPath() z jednym elementem z wyliczenia Environment.SpecialFolder).

Należy zauważyć, że "katalog bieżący" i ścieżka do pliku wykonywalnego niekoniecznie są identyczne. Musisz wiedzieć, gdzie szukać!

W obu przypadkach, jeśli chcesz manipulować ścieżką, użyj klasy Ścieżka, aby podzielić lub połączyć części ścieżki.

1

To spowoduje załadowanie pliku w katalogu roboczym:

 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(); 
     } 

Jeśli za pomocą konsoli można również nie this.It poprosi użytkownika, aby napisać ścieżkę do pliku (wraz z rozszerzeniem nazwy pliku).

 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(); 
     } 

Jeśli używasz WinForm na przykład wypróbować ten prosty przykład:

 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

Jeśli aplikacja to serwis internetowy, Directory.CurrentDirectory nie działa.

Zamiast tego należy użyć System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory.ToString(), "yourFileName.txt")).

Powiązane problemy