2012-05-16 3 views
7

Мне было интересно, может ли кто-нибудь сказать мне, как указать StreamReader в файл внутри текущего рабочего каталога программы.Streamreader to relative filepath

E.G. Скажем, у меня есть программа Prog, сохраненная в каталоге C: \ ProgDir. Я передаю \ ProgDir в общую папку. Внутри ProgDir есть другой каталог, содержащий файлы, которые я хотел бы импортировать в Prog (например, \ ProgDir \ TestDir \ TestFile.txt). Я хотел бы сделать так, чтобы StreamReader мог читать эти тестовые файлы, даже если путь к каталогу изменено;

(EG, на моем компьютере, путь к Testfiles является

C: \ PROGDIR \ TestDir \ testfile.txt

, но на компьютере другого человека, директория

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

).

Как я могу получить StreamReader для чтения с TestFile.txt на компьютере другого человека? (Уточнить имена файлов не меняются, единственное изменение, это путь PROGDIR)

Я попытался следующие:

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

(вытащил это из: Getting path relative to the current working directory?)

Но Я получаю «TestFile не существует в текущем контексте». Кто-нибудь имеет представление о том, как я должен подходить к этому?

спасибо.

+2

Ваше название выглядит совершенно не связанным с вашим вопросом ... где находится секундомер? –

+0

Простите, я думаю, что название перенесено из моего последнего вопроса. – gfppaste

ответ

10

Является ли папка «TestDir» всегда в исполняемом каталоге? если да, то попробуйте этот

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

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

Это даст вам путь к ехе плюс папку внутри него и текстовый файл

7

Вы можете использовать метод GetFullPath(). Попробуйте это:

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

Это разрыв в Streamreader sr = новый StreamReader (filePath); – gfppaste

+0

@gfppaste Это была опечатка. Это StreamReader вместо Streamreader. – Zenadix

2

FileInfoconstructor принимает один параметр типа строки. Попробуйте помещать кавычки вокруг TestFile.txt.

Изменить

FileInfo file = new FileInfo(TestFile.txt);

в

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

Если TestFile не является объектом со свойством именем txt типа строки, в этом случае вы должны создать объект, прежде чем пытаться используй это.

4

Несколько вещей:

Во-первых, FileInfo.FullName дает абсолютный путь файл, поэтому вам не нужно добавлять полный путь к каталогу перед файлом в экземпляре StreamReader.

Во-вторых, FileInfo file = new FileInfo(TestFile.txt); должен потерпеть неудачу, если у вас фактически нет класса под названием TestFile с txt.

Наконец, почти с любым методом File они уже используют относительные пути. Таким образом, вам ДОЛЖЕН быть в состоянии использовать средство чтения потока на JUST относительном пути.

Дайте эти несколько вещей попробовать и сообщите нам.

Edit: Вот что вы должны попробовать:

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

Однако одна вещь, которую я заметил, что TestFile находится в TestDir. Если ваш исполняемый файл находится в ProgDir, как вы заявляете, это будет по-прежнему терпеть неудачу, потому что ваш относительный путь неверен.

Попробуйте изменить его на TestDir\TestFile.txt. IE: StreamReader sr = new StreamReader("TestDir\TestFile.txt");