20

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

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

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

因此,如果我的文件在XXX.sln其中,C:\X0\A\XXX\则读取..txtC:\X0\A\

4

6 回答 6

31

您可能会喜欢这种更通用的解决方案,它依赖于*.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

于 2016-03-06T07:45:03.780 回答
25

试试这个:

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);
于 2013-09-25T10:02:15.930 回答
8

我觉得,如果您的应用程序基于文件路径和解决方案路径之间的关系依赖文件的位置,那将是失职。虽然您的程序很可能正在执行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"
    

    有许多关于解析命令行的方法和库。这是关于解析命令行参数的 Stack Overflow 答案。

于 2013-09-25T09:49:48.183 回答
3

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

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

需要using System.IO;

于 2013-09-25T09:55:15.953 回答
2
string path = Application.StartupPath;
于 2013-09-25T09:49:55.153 回答
2

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

于 2020-05-17T18:13:57.543 回答