2012-05-07 14 views
13

Ich erstelle eine StreamWriter mit einem relativen Pfad. Aber die Datei wird nicht angezeigt. Zur Problembehandlung möchte ich überprüfen, ob der vollständige Pfad dem entspricht, was ich erwarte. Also, wie kann ich mit einer StreamWriter Instanz den vollständigen Pfad der Datei erhalten, die es schreiben wird?So erhalten Sie den vollständigen Pfad von StreamWriter

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

Haben Sie daran gedacht, wenn Sie Ihre Anwendung ausführen ion in visual studio das aktuelle Verzeichnis ist bin/debug oder bin/release? – Steve

+0

@banging getan getan getan – javapowered

+0

@Steve ja ich bin auf der Suche nach Dateien in bin/debug/release Verzeichnis .... Dateien sind nicht da und deshalb möchte ich den vollständigen Pfad programmatisch erhalten. Um zu vergleichen, ob ich in der richtigen Richtung suche – javapowered

Antwort

11

Um den vollständigen Pfad von einem relativen Pfad, verwenden Sie die Path.GetFullPath Methode zu erhalten.

Zum Beispiel:

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

Könnte das Verzeichnis 'relative' sein existiert nicht. Entweder manuell erstellen. Oder erstellen Sie es programmatisch wie unten

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

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

In meiner Version des Frameworks, scheint dies zu funktionieren: (. Gefunden Debuggen)

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

+3

Danke, das war genau das, was ich gesucht habe! –

+3

Genau die Antwort, die zum Fragetitel passt. Meintest du von "Introspektion" gefunden? –

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

Ausgang:

\Device\HarddiskVolume2\bla-bla\relative\path.txt 
Verwandte Themen