2012-05-16 15 views
7

Zastanawiam się, czy ktoś może mi powiedzieć, jak skierować StreamReader do pliku w bieżącym katalogu roboczym programu.Streamreader do względnej ścieżki

E.G. Powiedzmy, że mam program Prog, zapisany w katalogu C: \ ProgDir. Zatwierdzam \ ProgDir do udostępnionego folderu. Inside ProgDir to inny katalog zawierający pliki, które chciałbym zaimportować do Prog (np. \ ProgDir \ TestDir \ TestFile.txt) Chciałbym, aby StreamReader mógł odczytać te TestFiles, nawet jeśli ścieżka do katalogu ma zmienione;

(EG, na moim komputerze, ścieżka do Testfiles jest

C: \ PROGDIR \ testdir \ testfile.txt

ale na komputerze innej osoby, katalog jest

C: \ dev_code \ PROGDIR \ testdir \ testfile.txt

).

Jak można uzyskać StreamReader, aby można było go czytać z TestFile.txt na komputerze drugiej osoby? (W celu wyjaśnienia, nazwy plików nie ulegają zmianie, jedyną zmianą jest ścieżka PROGDIR)

Próbowałem następujące:

string currentDir = Environment.CurrentDirectory; 
DirectoryInfo directory = new DirectoryInfo(currentDir); 
FileInfo file = new FileInfo(TestFile.txt); 

string fullDirectory = directory.FullName; 
string fullFile = file.FullName; 

StreamReader sr = new StreamReader(@fullDirectory + fullFile); 

(ciągniętych to od: Getting path relative to the current working directory?)

But Otrzymuję "TestFile nie istnieje w bieżącym kontekście". Czy ktoś ma pojęcie, jak powinienem się do tego podejść?

Dziękuję.

+2

Twój tytuł wygląda zupełnie niezwiązany z twoim pytaniem ... skąd bierze się stoper? –

+0

Przepraszam za to, myślę, że tytuł przeniesiony z mojego ostatniego pytania jakoś. – gfppaste

Odpowiedz

10

Czy folder "TestDir" zawsze znajduje się w katalogu wykonywalnym? jeśli tak, spróbuj tego

string dir =System.IO.Path.GetDirectoryName(
     System.Reflection.Assembly.GetExecutingAssembly().Location); 

    string file = dir + @"\TestDir\TestFile.txt"; 

To daje ścieżkę exe plusa folder wewnątrz niego i tekstowy

7

Można użyć metody GetFullPath(). Spróbuj tego:

string filePath = System.IO.Path.GetFullPath("TestFile.txt"); 
StreamReader sr = new StreamReader(filePath); 
+0

Przerwa na Streamreader sr = new StreamReader (filePath); – gfppaste

+0

@gfppaste To był literówka. To StreamReader zamiast Streamreader. – Zenadix

2

FileInfoconstructor przyjmuje jeden parametr typu string. Spróbuj umieścić cytaty w pliku TestFile.txt.

Zmień

FileInfo file = new FileInfo(TestFile.txt);

do

FileInfo file = new FileInfo("TestFile.txt");

ile testfile to obiekt z właściwością nazwie txt od typu string, w takim przypadku trzeba utworzyć obiekt przed próbą Użyj tego.

4

kilka rzeczy:

Pierwsze, FileInfo.FullName daje absolutną ścieżkę plik, więc nie trzeba poprzedzać ścieżki katalogu przed plikiem w instancji StreamReader.

Po drugie, FileInfo file = new FileInfo(TestFile.txt); powinien zakończyć się niepowodzeniem, chyba że faktycznie masz klasę o nazwie TestFile z właściwością txt.

Wreszcie, przy prawie każdej metodzie File, używają już względnych ścieżek. A więc POWINIENEŚ móc używać czytnika strumienia na TYLKO względnej ścieżce.

Wypróbuj te kilka rzeczy i daj nam znać.

Edycja: Oto, co należy spróbować:

FileInfo file = new FileInfo("TestFile.txt"); 
StreamReader sr = new StreamReader(fullFile.FullName); 
//OR 
StreamReader sr = new StreamReader("TestFile.txt"); 

Jednak jedną rzeczą, jaką zauważyłem jest to, że znajduje się w testfile TestDir. Jeśli twój plik wykonywalny znajduje się w ProgDir, jak to stwierdzasz, to nadal będzie się nie udać, ponieważ twoja względna ścieżka nie jest właściwa.

Spróbuj zmienić zamiast tego na TestDir\TestFile.txt. IE: StreamReader sr = new StreamReader("TestDir\TestFile.txt");

Powiązane problemy