2012-05-07 7 views
13

私はStreamWriterを相対パスで作成しています。しかし、ファイルは表示されません。トラブルシューティングのために、私は完全なパスが私が期待しているものであることを確認したい。だから、StreamWriterインスタンスを持っていると、どのように書き込み先のファイルの完全なパスを取得できますか?StreamWriterのフルパスを取得する方法

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

あなたはあなたのアプリケーションを実行するとビジュアルスタジオ内のイオン現在のディレクトリはbin/debugかbin/releaseですか? – Steve

+0

@banging done done – javapowered

+0

@Steveはいbin/debug/releaseディレクトリのファイルを探しています....ファイルが存在しないので、プログラムでフルパスを取得したいのです。私が正しいディレクトリで検索しているかどうかを比較するには – javapowered

答えて

11

Path.GetFullPathメソッドを使用し、相対パスからのフルパスを取得します。例えば

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

が存在しない '相対' ディレクトリことがございます。手動で作成してください。またはプログラムの枠組みの私のバージョンで

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

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

以下のように、これは動作しているようだ、それを作成します(。デバッグによって発見)

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

+3

ありがとう、これは私が探していたものでした! –

+3

質問のタイトルに合った答えの種類。 「イントロスペクション」によって見つけられたのですか? –

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

出力:

\Device\HarddiskVolume2\bla-bla\relative\path.txt 
関連する問題