2012-05-07 20 views
13

Estoy creando un StreamWriter usando una ruta relativa. Pero el archivo no aparece. Para solucionar problemas, quiero verificar que la ruta completa es lo que estoy esperando. Entonces, al tener una instancia de StreamWriter, ¿cómo puedo obtener la ruta completa del archivo en el que va a escribir?Cómo obtener la ruta completa de StreamWriter

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

¿Ha considerado esto cuando ejecuta su aplicación? ion dentro de visual studio ¿el directorio actual es bin/debug o bin/release? – Steve

+0

@banging hecho hecho – javapowered

+0

@Steve yes Estoy buscando archivos en el directorio bin/debug/release .... los archivos no están allí y es por eso que quiero obtener la ruta completa de forma programática. Para comparar si estoy buscando en el directorio correcto – javapowered

Respuesta

11

Para obtener la ruta completa de una ruta relativa, utilice el método Path.GetFullPath.

Por ejemplo:

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

podría ser el directorio 'relativo' no existe. O bien créelo manualmente. O crear mediante programación de la siguiente manera

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

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

En mi versión del marco, esto parece funcionar: (. Encontrado por depuración)

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

+3

¡Gracias, esto era exactamente lo que estaba buscando! –

+3

Exactamente el tipo de respuesta que se ajusta a la pregunta-título. ¿Querías decir encontrado por 'introspección' ...? –

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

Salida:

\Device\HarddiskVolume2\bla-bla\relative\path.txt 
Cuestiones relacionadas