2012-05-16 23 views
7

Me preguntaba si alguien podría decirme cómo apuntar un StreamReader a un archivo dentro del directorio de trabajo actual del programa.Streamreader a una ruta de archivo relativa

POR EJEMPLO Digamos que tengo el programa Prog, guardado en el directorio C: \ ProgDir. Confirmo \ ProgDir a una carpeta compartida. Dentro de ProgDir hay otro directorio que contiene archivos que me gustaría importar a Prog (por ejemplo, \ ProgDir \ TestDir \ TestFile.txt) Me gustaría hacerlo para que StreamReader pueda leer esos archivos de prueba, incluso cuando la ruta al directorio tenga cambiado;

(EG, en mi equipo, la ruta a la testfiles es

C: \ PROGDIR \ TestDir \ TestFile.txt

pero en el ordenador de la otra persona, el directorio es

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

).

¿Cómo obtendré un StreamReader para leer en TestFile.txt en la computadora de la otra persona? (Para aclarar, los nombres de archivo no cambian, el único cambio es el camino PROGDIR)

He intentado lo siguiente:

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

(tirado esto desde: Getting path relative to the current working directory?)

Pero Me aparece "TestFile no existe en el contexto actual". ¿Alguien tiene alguna idea de cómo debería abordar esto?

Gracias.

+2

Su título no tiene relación con su pregunta ... ¿dónde entra Stopwatch? –

+0

Lo siento, creo que el título se trasladó de mi última pregunta de alguna manera. – gfppaste

Respuesta

10

¿La carpeta "TestDir" está siempre en el directorio ejecutable? si es así, intente esto

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

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

Esto le dará la ruta del exe más la carpeta dentro de ella y el archivo de texto

7

Puede utilizar el método GetFullPath(). Prueba esto:

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

Se está rompiendo en Streamreader sr = new StreamReader (filePath); – gfppaste

+0

@gfppaste Eso fue un error tipográfico. Es StreamReader en lugar de Streamreader. – Zenadix

2

El FileInfoconstructor toma un único parámetro de tipo cadena. Intenta poner citas alrededor de TestFile.txt.

Cambio

FileInfo file = new FileInfo(TestFile.txt);

a

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

A menos TestFile es un objeto con una propiedad denominada txt de tipo cadena, en cuyo caso hay que crear el objeto antes de intentar usarlo

4

algunas cosas:

En primer lugar, FileInfo.FullName da la ruta absoluta de el archivo, por lo que no es necesario anteponer la ruta completa del directorio antes del archivo en la instancia de StreamReader.

En segundo lugar, FileInfo file = new FileInfo(TestFile.txt); falle a menos que realmente tiene una clase llamada TestFile con una propiedad txt.

Finalmente, con casi todos los métodos File, ya usan rutas relativas. Entonces, DEBERÍA poder usar el lector de flujo solo en la ruta relativa.

Prueba estas pocas cosas y háznoslo saber.

Editar: Esto es lo que debería probar:

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

Sin embargo, una cosa que he notado es que la TestFile se encuentra en TestDir. Si su archivo ejecutable se encuentra en ProgDir, como indica, esto seguirá fallando porque su ruta relativa no es la correcta.

Intente cambiarlo a TestDir\TestFile.txt en su lugar. IE: StreamReader sr = new StreamReader("TestDir\TestFile.txt");

Cuestiones relacionadas