18

StreamWriter相対パスを使用して作成しています。しかし、ファイルは表示されません。トラブルシューティングを行うために、フルパスが期待どおりであることを確認したいと思います。インスタンスがあるStreamWriter場合、書き込むファイルのフルパスを取得するにはどうすればよいですか?

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

7 に答える 7

61

私のバージョンのフレームワークでは、これは機能しているようです。

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

(デバッグによって検出されました。)

于 2012-05-07T14:03:14.850 に答える
11

相対パスからフルパスを取得するには、Path.GetFullPathメソッドを使用します。

例えば:

string fileName = "relative/path.txt";
string fullPath = Path.GetFullPath(fileName);
于 2012-05-07T13:57:04.920 に答える
1

ディレクトリ'relative'が存在しない可能性があります。手動で作成してください。または、以下のようにプログラムで作成します

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

StreamWriter sw= new StreamWriter(fileName, true);
于 2012-05-07T13:59:59.267 に答える
0
Dim fs As FileStream = CType(sw.BaseStream, FileStream)
Dim fi As New FileInfo(fs.Name)
Console.WriteLine(fi.FullName)
于 2019-01-29T13:17:23.017 に答える
0

これは、@ Jeppe Stiehl Nielsenの返信へのコメントとしては良いでしょうが、コメントを追加することはできません。VB.Netでは、次のようになります。

Dim fullPath As String = CType(streamWriter.BaseStream, FileStream).Name

なぜ必要なのかわかりません。CTypeこのプロパティに対してのみ、他のすべてのプロパティは必要ありませんが、必要です。

于 2020-12-16T21:59:34.933 に答える
0

null許容型と安全なキャストの使用(as例外をスローしません):

_logger.LogInformation("Wrote file at {0}", (streamWriter.BaseStream as FileStream)?.Name);

?左側の式の結果がそうでない場合にのみプロパティにアクセスしますnull。そうでない場合は、戻ります(に評価されます)null(と同等ですE is T ? (T)(E) : (T)null)。

null必要に応じて、キャスト結果を次のように確認できます。

var fs = streamWriter.BaseStream as FileStream;

if (fs != null)
{
    _logger.LogInformation("Wrote file at {0}", fs.Name);
}

しかし、それはあなたが必要とするよりも多くのコードです。C#7+で上記の例を書くためのより現代的な方法は、is演算子を使用することです。

if (streamWriter.BaseStream is FileStream fs)
{
    _logger.LogInformation("Wrote report file at {0}", fs.Name);
}

これには、キャストを実行できなかった場合にログ呼び出しがまったく発生しないという追加の利点があります。これは、を使用している場合fsは実際には発生しないためです。式全体がtrueまたはfalseのいずれかに評価されますが、決して評価されません。nullisisnull

于 2021-07-10T23:15:39.090 に答える
-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
于 2012-05-07T14:44:51.187 に答える