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

问题描述 投票:13回答:6

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

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

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

因此,如果我的文件XXX.sln位于C:\X0\A\XXX\中,则读取.txt中的C:\X0\A\文件。

c# file path io streamreader
6个回答
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);

13
投票

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

享受!

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

现在,您可能会很享受! :D


6
投票

我认为,如果您的应用程序基于文件路径和解决方案路径之间的关系依赖文件的位置,那将是失误。尽管您的程序很可能在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"
    

    有许多有关解析命令行的方法和库。 Here's a Stack Overflow answer解析命令行参数。


2
投票

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

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

需要using System.IO;


1
投票
string path = Application.StartupPath;

0
投票

如果出于某种原因要在项目的解决方案路径中进行编译,则可以使用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中工作。

© www.soinside.com 2019 - 2024. All rights reserved.