2012-05-16 5 views
7

Mi chiedevo se qualcuno potesse dirmi come indirizzare uno StreamReader su un file all'interno della directory di lavoro corrente del programma.Streamreader su un filepath relativo

E.G. Supponiamo di avere il programma Prog, salvato nella directory C: \ ProgDir. Commetto \ ProgDir in una cartella condivisa. All'interno di ProgDir c'è un'altra directory contenente i file che vorrei importare in Prog (ad esempio \ ProgDir \ TestDir \ TestFile.txt) Mi piacerebbe farlo in modo che lo StreamReader possa leggere quei TestFiles, anche quando il percorso della directory è cambiato;

(EG, sul mio computer, il percorso del File di prova è

C: \ PROGDIR \ TestDir \ TestFile.txt

ma sul computer dell'altra persona, la directory è

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

).

Come si ottiene uno StreamReader per essere letto da TestFile.txt sul computer dell'altro utente? (Per chiarire, i nomi dei file non cambiano, l'unico cambiamento è il percorso PROGDIR)

ho provato la seguente:

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

(tirato questo da: Getting path relative to the current working directory?)

Ma Sto ottenendo "TestFile non esiste nel contesto corrente". Qualcuno ha qualche idea su come dovrei avvicinarmi a questo?

Grazie.

+2

Il tuo titolo non ha nulla a che vedere con la tua domanda ... dove arriva Stopwatch? –

+0

Mi dispiace, penso che il titolo sia stato riportato dalla mia ultima domanda in qualche modo. – gfppaste

risposta

10

La cartella "TestDir" si trova sempre nella directory eseguibile? se è così, provate questo

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

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

Questo vi darà il percorso del exe, più la cartella al suo interno e il file di testo

7

È possibile utilizzare il metodo GetFullPath(). Prova questo:

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

Si sta rompendo con Streamreader sr = new StreamReader (filePath); – gfppaste

+0

@gfppaste Quello era un errore di battitura. È StreamReader invece di Streamreader. – Zenadix

2

Il FileInfoconstructor prende un singolo parametro di tipo stringa. Prova a mettere le virgolette su TestFile.txt.

Change

FileInfo file = new FileInfo(TestFile.txt);

a

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

A meno TestFile è un oggetto con una proprietà denominata txt di tipo stringa, nel qual caso si deve creare l'oggetto prima di tentare di usalo

4

Un paio di cose:

primo luogo, FileInfo.FullName restituisce il percorso assoluto per il file, quindi non è necessario anteporre il percorso completo della directory prima del file nell'istanza StreamReader.

Secondo, FileInfo file = new FileInfo(TestFile.txt); non dovrebbe riuscire a meno che non si disponga effettivamente di una classe denominata TestFile con una proprietà txt.

Infine, con quasi tutti i metodi File, utilizzano già percorsi relativi. Quindi dovresti essere in grado di usare il lettore di stream su SOLO il percorso relativo.

Concediti quelle poche cose e facci sapere.

Edit: Ecco cosa si dovrebbe provare:

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

Tuttavia, una cosa che ho notato è che il TestFile si trova in TestDir. Se il tuo eseguibile si trova in ProgDir come stai affermando, non funzionerà ancora perché il tuo percorso relativo non è corretto.

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