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

本文关键字:路径 文件夹 文件 获取 解决方案 使用 | 更新日期: 2023-09-27 18:32:40

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

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

string path = "";
StreamReader sr = new StreamReader(path);

因此,如果我的文件XXX.slnC:'X0'A'XXX'中,请在C:'X0'A'中读取.txt文件。

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

您可能会

喜欢这个更通用的解决方案,这取决于通过扫描当前或选定目录中的所有父目录来查找解决方案*.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;
    }
}

用法:

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

在您的情况下:

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

享受!

现在,一个警告..您的应用程序应该与解决方案无关 - 除非这是我不介意的某些解决方案处理工具的个人项目。请注意,您的应用程序一旦分发给用户,驻留在没有解决方案的文件夹中。现在,您可以使用"锚"文件。例如,像我一样搜索父文件夹并检查是否存在空文件app.anchormySuperSpecificFileNameToRead.ext;P 如果你想让我写我能写的方法 - 让我知道。

现在,你可能真的很喜欢!:D

试试这个:

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);

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

我看到两个选项:

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

    string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Yourfile.txt");
    

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

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

    filePath="C:'myDevFolder'myFile.txt"
    
    有许多

    方法和库可以解析命令行。这是关于解析命令行参数的堆栈溢出答案。

我认为这就是你想要的。不确定发布时是否是个好主意:

string dir = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName;

需要using System.IO;

如果出于某种原因想要在项目的解决方案路径中进行编译,则可以使用 T4 模板执行此操作。

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
<#@ parameter name="model" type="System.String" value=""#>
<#
    IServiceProvider serviceProvider = (IServiceProvider)this.Host;
    DTE dte = serviceProvider.GetService(typeof(DTE)) as DTE;
#>
using System;
using System.IO;
namespace SolutionInfo
{
    public static class Paths
    {
        static string solutionPath = @"<#= Path.GetDirectoryName(dte.Solution.FullName) #>";
    }
}

我认为只有Tah才能从Visual Studio工作。

string path = Application.StartupPath;