2012-05-07 21 views
13

Sto creando un StreamWriter utilizzando un percorso relativo. Ma il file non appare. Per risolvere il problema, voglio verificare che il percorso completo sia quello che mi aspetto. Quindi, avendo un'istanza StreamWriter, come posso ottenere il percorso completo del file su cui sta andando a scrivere?Come ottenere il percorso completo di StreamWriter

string fileName = "relative/path.txt" 
StreamWriter sw= new StreamWriter(fileName); 
// What is the full path of 'sw'? 
+1

Avete considerato che quando si esegue il vostro applicat ion in visual studio la directory corrente è bin/debug o bin/release? – Steve

+0

@banging done done fatto – javapowered

+0

@Steve sì sto cercando i file nella directory bin/debug/release .... i file non sono lì ed è per questo che voglio ottenere il percorso completo programmaticamente. Per confrontare se sto cercando nella directory giusta – javapowered

risposta

11

per ottenere il percorso completo da un percorso relativo, utilizzare il metodo Path.GetFullPath.

Ad esempio:

string fileName = "relative/path.txt"; 
string fullPath = Path.GetFullPath(fileName); 
1

potrebbe essere la directory 'relativa' non esiste. O crearlo manualmente. O creare a livello di codice, come di seguito

string fileName = @"relative\path.txt"; 
fileName = Path.GetFullPath(fileName); 
Directory.CreateDirectory(Path.GetDirectoryName(fileName)); 

StreamWriter sw= new StreamWriter(fileName, true); 
37

Nella mia versione del quadro, questo sembra funzionare: (. Trovato da debug)

string fullPath = ((FileStream)(streamWriter.BaseStream)).Name; 

+3

Grazie, questo era esattamente quello che stavo cercando! –

+3

Esattamente il tipo di risposta che si adatta alla domanda-titolo. Volevi dire trovato dall'introspezione? ...? –

-2
var fstream = sw.BaseStream as System.IO.FileStream; 
    if (fstream != null) 
    Console.WriteLine(GetAbsolutePathByHandle(fstream.SafeFileHandle)); 


[DllImport("ntdll.dll", CharSet = CharSet.Auto)] 
private static extern int NtQueryObject(SafeFileHandle handle, int objectInformationClass, IntPtr buffer, int StructSize, out int returnLength); 

static string GetAbsolutePathByHandle(SafeFileHandle handle) 
{ 
    var size = 1024; 
    var buffer = Marshal.AllocCoTaskMem(size); 
    try 
    { 
    int retSize; 
    var res = NtQueryObject(handle, 1, buffer, size, out retSize); 
    if (res == -1073741820) 
    { 
     Marshal.FreeCoTaskMem(buffer); 
     size = retSize; 
     Marshal.AllocCoTaskMem(size); 
     res = NtQueryObject(handle, 1, buffer, size, out retSize); 
    } 
    if (res != 0) 
     throw new Exception(res.ToString()); 
    var builder = new StringBuilder(); 
    for (int i = 4 + (Environment.Is64BitProcess ? 12 : 4); i < retSize - 2; i += 2) 
    { 
     builder.Append((char)Marshal.ReadInt16(buffer, i)); 
    } 
    return builder.ToString(); 
    } 
    finally 
    { 
    Marshal.FreeCoTaskMem(buffer); 
    } 
} 

uscita:

\Device\HarddiskVolume2\bla-bla\relative\path.txt 
Problemi correlati