【问题标题】:Streamreader to a relative filepathStreamreader 到相对文件路径
【发布时间】:2012-05-16 17:31:45
【问题描述】:

我想知道,是否有人能告诉我如何将 StreamReader 指向程序当前工作目录中的文件。

例如:假设我将程序 Prog 保存在目录“C:\ProgDir\”中。我将“\ProgDir”提交到共享文件夹。在 ProgDir 内部是另一个目录,其中包含我要导入 Prog 的文件(例如“\ProgDir\TestDir\TestFile.txt”),以便 StreamReader 可以读取这些 TestFiles,即使路径目录已更改;

(例如,在我的计算机上,Testfiles 的路径是

C:\ProgDir\TestDir\TestFile.txt

但在对方电脑上,目录是

C:\dev_code\ProgDir\TestDir\TestFile.txt

)。

如何让 StreamReader 能够从其他人的计算机上的 TestFile.txt 中读取? (澄清一下,文件名没有改变,唯一的改变是路径 ProgDir)

我尝试了以下方法:

string currentDir = Environment.CurrentDirectory;
DirectoryInfo directory = new DirectoryInfo(currentDir);
FileInfo file = new FileInfo("TestFile.txt");

string fullDirectory = directory.FullName;
string fullFile = file.FullName;

StreamReader sr = new StreamReader(@fullDirectory + fullFile);

(来自:Getting path relative to the current working directory?

但我得到“TestFile 在当前上下文中不存在”。有人知道我应该如何处理这个问题吗?

谢谢。

【问题讨论】:

  • 您的标题看起来与您的问题完全无关……秒表从何而来?
  • 很抱歉,我认为标题是从我上一个问题中继承下来的。

标签: c# .net filestream


【解决方案1】:

文件夹“TestDir”是否总是在可执行目录中? 如果是这样,试试这个

    string dir =System.IO.Path.GetDirectoryName(
      System.Reflection.Assembly.GetExecutingAssembly().Location);

    string file = dir + @"\TestDir\TestFile.txt";

这将为您提供 exe 的路径以及其中的文件夹和文本文件

【讨论】:

  • 虽然正确,但还有更简单的方法。当前目录始终是“。” - 所以只需使用“.\TestDir\TestFile.txt”(见我的回答)
【解决方案2】:

您可以使用GetFullPath() 方法。试试这个:

 string filePath = System.IO.Path.GetFullPath("TestFile.txt");
 StreamReader sr = new StreamReader(filePath);

【讨论】:

  • Streamreader sr = new StreamReader(filePath);
  • @gfppaste 这是一个错字。它是 StreamReader 而不是 Streamreader。
【解决方案3】:

一些事情:

首先,FileInfo.FullName 给出了文件的绝对路径,因此您无需在 StreamReader 实例中的文件之前添加完整的目录路径。

其次,FileInfo file = new FileInfo(TestFile.txt); 应该会失败,除非您实际上有一个名为 TestFile 且具有 txt 属性的类。

最后,几乎所有File 方法都已经使用了相对路径。因此,您应该能够仅在相对路径上使用流阅读器。

试试这几件事,然后告诉我们。

编辑:这是你应该尝试的:

FileInfo file = new FileInfo("TestFile.txt");
StreamReader sr = new StreamReader(fullFile.FullName);
//OR
StreamReader sr = new StreamReader("TestFile.txt");

但是,我注意到的一件事是 TestFile 位于 TestDir。如果您的可执行文件位于ProgDir 如您所说,那么这仍然会失败,因为您的相对路径不正确。

尝试将其更改为 TestDir\TestFile.txt。即:StreamReader sr = new StreamReader("TestDir\TestFile.txt");

【讨论】:

    【解决方案4】:

    FileInfo constructor 采用字符串类型的单个参数。尝试在 TestFile.txt 周围加上引号。

    改变

    FileInfo file = new FileInfo(TestFile.txt);

    FileInfo file = new FileInfo("TestFile.txt");

    除非 TestFile 是一个具有名为txt 的字符串类型属性的对象,在这种情况下,您必须在尝试使用它之前创建该对象。

    【讨论】:

      【解决方案5】:

      最简单的方法是只使用文件名(不是完整路径)和“TestDir”,并为 StreamReader 提供一个相对路径。

      var relativePath = Path.Combine(".","TestDir",fileName);
      using (var sr = new StreamReader(relativePath))
      {
         //...
      }
      

      【讨论】:

      • 你也可以new StreamReader(@".\TestDir\filename")
      【解决方案6】:

      我也遇到过类似的问题,用这个方法解决了:

      StreamReader sr = File.OpenText(MapPath("~/your_path/filename.txt"))
      

      如果您需要一个更相对的文件路径来处理不同的环境,这可能是一个不错的选择。

      【讨论】:

        【解决方案7】:

        你可以使用path.combine获取当前目录来构建,然后组合你需要的文件路径

         new StreamReader(Path.Combine(Environment.CurrentDirectory, "storage"));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-18
          • 2012-01-28
          • 2021-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-26
          相关资源
          最近更新 更多