使用C#获取解决方案文件的父文件夹的路径

Use*_*501 11 c# io file path streamreader

我是C#的初学者,我有一个文件夹,我正在从中读取文件.

我想读取位于解决方案文件的父文件夹中的文件.我该怎么做呢?

string path = "";
StreamReader sr = new StreamReader(path);
Run Code Online (Sandbox Code Playgroud)

所以如果我的文件XXX.slnC:\X0\A\XXX\那里,那么读取.txt文件C:\X0\A\.

Thi*_*a H 19

试试这个:

string startupPath = Path.Combine(Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName,"abc.txt");

// Read the file as one string. 
string text = System.IO.File.ReadAllText(startupPath);
Run Code Online (Sandbox Code Playgroud)

  • 有时最好的答案是解释会发生什么样的陷阱并提供更好的答案.(Altough目前它在解决方案文件中,最好的解决方案是将文件放在同一个文件夹中,以避免复制等问题) (9认同)
  • 仅在解决方案文件夹中进行调试时有效.如果将exe复制到另一个位置,则会失败. (4认同)
  • @RvdK是的,它肯定会失败.但他的问题是关于解决方案文件的位置非常具体.请阅读问题 (3认同)
  • 在这种情况下使用 @"..\..\abc.txt" 更容易。它也取决于项目设置,但似乎不那么复杂。 (2认同)

Dem*_*tos 10

您可能会喜欢这种更通用的解决方案,它依赖于*.sln通过扫描当前或选定的父目录来查找解决方案文件,同时覆盖未找到解决方案目录的情况!

public static class VisualStudioProvider
{
    public static DirectoryInfo TryGetSolutionDirectoryInfo(string currentPath = null)
    {
        var directory = new DirectoryInfo(
            currentPath ?? Directory.GetCurrentDirectory());
        while (directory != null && !directory.GetFiles("*.sln").Any())
        {
            directory = directory.Parent;
        }
        return directory;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

// get directory
var directory = VisualStudioProvider.TryGetSolutionDirectoryInfo();
// if directory found
if (directory != null)
{
    Console.WriteLine(directory.FullName);
}
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

// resolve file path
var filePath = Path.Combine(
    VisualStudioProvider.TryGetSolutionDirectoryInfo()
    .Parent.FullName, 
    "filename.ext");
// usage file
StreamReader reader = new StreamReader(filePath);
Run Code Online (Sandbox Code Playgroud)

请享用!

现在,警告..您的应用程序应该是解决方案无关的 - 除非这是一个解决方案处理工具的个人项目,我不介意.了解一下,一旦分发给用户,您的应用程序驻留在没有解决方案的文件夹中.现在,您可以使用"锚"文件.例如,像我一样搜索父文件夹并检查是否存在空文件; app.anchor或者mySuperSpecificFileNameToRead.extP如果您希望我编写方法,我可以 - 让我知道.

现在,你可能真的很享受!:d

  • 到目前为止这是最好的答案,虽然目录输出协调会不时变化,这样我们总是可以在其他情况下获取解决方案的文件夹(例如,当构建从 AnyCPU 更改为 x86 时,默认路径将从 bin\Debug 更改为bin\x86\调试)。 (2认同)

Moo*_*ice 6

如果您的应用程序依赖于文件的位置(基于文件路径和解决方案路径之间的关系),那将是疏忽.虽然您的程序可能正在执行Solution/Project/Bin/$(ConfigurationName)/$(TargetFileName),但只有在Visual Studio的范围内执行时才有效.在Visual Studio之外,在其他情况下,情况不一定如此.

我看到两个选择:

  1. 将文件作为项目的一部分包含在其属性中,将其复制到输出文件夹中.然后,您可以访问该文件:

    string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Yourfile.txt");
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,在部署期间,您必须确保此文件也与可执行文件一起部署.

  2. 使用命令行参数指定启动时文件的绝对路径.这可以在Visual Studio中默认(请参阅项目属性 - >调试选项卡 - >命令行参数".例如:

    filePath="C:\myDevFolder\myFile.txt"
    
    Run Code Online (Sandbox Code Playgroud)

    解析命令行有很多方法和库.这是解析命令行参数的Stack Overflow答案.