【问题标题】:How to get full path of StreamWriter如何获取 StreamWriter 的完整路径
【发布时间】:2012-05-16 00:48:29
【问题描述】:

我正在使用相对路径创建StreamWriter。但是文件没有出现。要进行故障排除,我想检查完整路径是否符合我的预期。那么有一个StreamWriter 实例,我怎样才能得到它要写入的文件的完整路径呢?

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

【问题讨论】:

  • 你有没有考虑过,当你在 Visual Studio 中运行你的应用程序时,当前目录是 bin/debug 或 bin/release ?
  • @Steve 是的,我正在寻找 bin/debug/release 目录中的文件......文件不存在,这就是我想以编程方式获取完整路径的原因。比较我是否在正确的目录中搜索
  • 好的,我使用了 Windows 的“搜索文件”功能,终于找到了我的文件所在的位置。问题可以关闭,也可以保持打开状态,以便有人可以回答......
  • @javapowered 如果这个文件可以关闭,那你可以自己做。

标签: c# streamwriter


【解决方案1】:

在我的框架版本中,这似乎可行:

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

(通过调试发现。)

【讨论】:

  • 谢谢,这正是我想要的!
  • 正是适合问题标题的那种答案。你的意思是introspection...找到的?
【解决方案2】:

要从相对路径获取完整路径,请使用Path.GetFullPath 方法。

例如:

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

【讨论】:

    【解决方案3】:

    可能是“相对”目录不存在。要么手动创建它。或者如下以编程方式创建它

    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】:

        作为对@Jeppe Stiehl Nielsen 回复的评论,这会更好,但我不能添加 cmets: 在 VB.Net 中,这变成:

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

        我不确定为什么需要 CType,并且仅用于此属性,而所有其他属性都不需要,但它是必需的。

        【讨论】:

        • 因为CType 转换了一个对象的类型。 BaseStreamStreamFileStream 继承了该基类,但在这种情况下,我们确定基流实际上是一个文件流,因为路径指向的就是它。 IE。例如,路径不是 FTP 连接的流。
        【解决方案6】:

        使用可空类型和安全转换(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);
        }
        

        这有一个额外的好处,即如果无法执行强制转换,则根本不会发生日志调用,因为实际上在使用 is 时,fs 永远不会是 null。整个 is 表达式的计算结果为真或假,但绝不是 null

        【讨论】:

          【解决方案7】:
            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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-03-16
            • 2018-04-13
            • 2019-10-16
            • 2014-12-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多