Подтвердить что ты не робот

Как получить полный путь к StreamWriter

Я создаю StreamWriter, используя относительный путь. Но файл не отображается. Чтобы устранить неполадки, я хочу проверить, что полный путь - это то, что я ожидаю. Итак, имея экземпляр StreamWriter, как я могу получить полный путь к файлу, который он собирается записать?

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

Ответ 1

Чтобы получить полный путь от относительного пути, используйте метод Path.GetFullPath.

Например:

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

Ответ 2

В моей версии фреймворка это работает:

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

(найдено путем отладки.)

Ответ 3

Возможно, каталог "relative" не существует. Либо создайте его вручную. Или создайте его программно, как показано ниже.

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

StreamWriter sw= new StreamWriter(fileName, true);

Ответ 4

Dim fs As FileStream = CType(sw.BaseStream, FileStream)
Dim fi As New FileInfo(fs.Name)
Console.WriteLine(fi.FullName)

Ответ 5

  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