【问题标题】:C# absolute path with streamReader带有streamReader的C#绝对路径
【发布时间】:2013-02-15 20:23:33
【问题描述】:

我在用 C# 读取文件时遇到问题 我有两个不同的 .exe 位置(都不同)并读取相同的 .xml 文件。所以当我给出这样的路径时:

TextReader textReader = new StreamReader(@"../../../TrajectoryGen/obstacleList.xml");

它能够从一个位置(路径中使用的后面 3 个文件夹)读取,但不能从另一个位置(后面只有 2 个文件夹)读取 如何解决此问题,以便它在两个文件夹中都有效?

【问题讨论】:

  • @"../../../TrajectoryGen/obstacleList.xml" 是一个,@"../../TrajectoryGen/obstacleList.xml" 是另一个?那就是“你如何解决这个问题”——或者你有不同的问题?
  • 老兄,这是同样的问题,但不是那么容易。有两个不同的 GUI 从不同的文件夹访问完全相同的代码。所以我不能为两个 GUI 定义不同的路径对象,因为它们使用相同的路径对象。
  • 听起来你有更多的架构问题。我们必须查看您的整个项目,这可能是一个太大的问题。您可能需要考虑在SE 上提出问题,询问如何组织代码以便访问动态放置的文件或其他内容。
  • 是的。但问题是我无法重组代码,因为它是一个大项目的一部分。所以,我想知道是否可以使用某种对路径的解决方案引用来修复它?
  • 您必须使用某种代码来读取文件夹名称并向上遍历层次结构,或者拥有一个带有绝对路径的配置文件,或者将所需的文件放在system location 中。不过,这又是架构方面的东西 - 并不是真正的good fit SO。

标签: c# relative-path streamreader filereader absolute-path


【解决方案1】:

第一种方式,这取决于您知道其中一个父文件夹的名称。

const string FILENAME = "obstacleList.xml";
const string FOLDER = "TrajectoryGen";

string path = Path.GetFullPath(System.Reflection.Assembly.GetExecutingAssembly().Location);
do
{
     path = Path.GetDirectoryName(path);
} while (!Path.GetFileName(path).Equals(FOLDER, StringComparison.OrdinalIgnoreCase));
string filepath = String.Format("{0}{1}{2}", path, Path.DirectorySeparatorChar, FILENAME);

^^ 您还可以在 FILENAME 中使用部分路径,如下例所示,以防您在您知道名称的“基本”文件夹时需要进入目录。

第二种方式盲目地继续向上目录

const string FILENAME = @"TrajectoryGen\obstacleList.xml";

string path = Path.GetFullPath(System.Reflection.Assembly.GetExecutingAssembly().Location);

string filepath;

do
{
    path = Path.GetDirectoryName(path);

    //pump
    filepath = String.Format("{0}{1}{2}", path, Path.DirectorySeparatorChar, FILENAME);
} while (!File.Exists(filepath));

两者都需要“使用 System.IO;”并且两者都没有实现错误处理,如果找不到文件/文件夹,则会抛出 NullReferenceException。

我特意使用了 do-while 循环,因为路径的定义将包含可执行文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2011-06-15
    • 1970-01-01
    • 2018-01-09
    • 2019-01-17
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多