如何从 C# 控制台应用程序中的目录获取路径?

Posted

技术标签:

【中文标题】如何从 C# 控制台应用程序中的目录获取路径?【英文标题】:How to get a path from a directory in a C# console application? 【发布时间】:2011-03-14 02:48:29 【问题描述】:

假设我有这个文件结构

Soultion-> Folder1 -> FileIwant.html

所以这可能类似于 C:\Soultion\Folder1\FilterIwant.html

现在我需要将此文件读入我的应用程序。我不能只是硬编码它,因为当我把它交给其他人时,他们可能会将它放在 F: drive 或其他东西上。

或者当我创建一个 msi 文件时,路径可能完全不同。那我怎么说呢?

“文件夹 1\FilterIwant.html”

并使用它来获取文件夹路径,而不管它们放在哪里?

编辑

我尝试了 Path.GetFullPath,但我进入了 bin/debug 目录。但是我的文件不在那个目录中。我认为这是以前的几个目录。另外,如果我制作一个 msi 文件,我会有 bin/debug 目录吗?

【问题讨论】:

【参考方案1】:

Path.GetFullPath

编辑

当您运行已安装的应用程序时,bin/Debug 路径不会出现(当然,除非您明确告诉安装程序使用该子目录)。

【讨论】:

试过了。路径最终位于 bin/debug 中,所以我不知道该怎么做。【参考方案2】:

你需要System.Io.Path类的帮助:

GetFullPath:返回指定路径字符串的绝对路径。

编辑

您可能还需要应用程序目录 - 这是您的应用程序的安装位置:

string appPath = Path.GetDirectoryName(Application.ExecutablePath);

【讨论】:

【参考方案3】:

您可能希望将完整路径作为命令行参数传递。然后,您可以使用Main 方法的args 参数获取参数。要将相对路径转换为绝对路径,您可以使用Path.GetFullPath

using System;
using System.IO;

public class CommandLine

   public static void Main(string[] args)
   
       // The path is passed as the first argument
       string fileName = arg[0];

       // get absolute path
       fileName = Path.GetFullPath(fileName);

       // TODO: do whatever needs to done with the passed file name
   

【讨论】:

【参考方案4】:

为什么用作应用程序一部分的文件与应用程序不在同一文件夹中?在我看来,您应该将该文件的属性设置为在构建时复制到输出文件夹。

这样做会确保您的文件 在 bin\debug 文件夹中。

编辑: 或者您应该将文件放在一个特殊文件夹中,app datamy documents 会浮现在脑海中。

【讨论】:

嗯,我只是想把我的东西放在一个文件夹里,而不是在某个地方的垃圾箱里到处乱飞。 这很好,这样做是有正当理由的。特别是在封闭的环境中。所以,我建议你在 AppData 文件夹中的某个地方给你的文件一个家。【参考方案5】:

当 Visual Studio 编译您的项目时,它会将输出放入 bin\debug 目录。您要引用的任何内容文件也必须复制到这些位置,以便驻留在该目录中的应用能够读取该文件。

你有两个选择:

要么将FilterIwant.html 上的Copy to Output Directory 属性设置为Copy if newer;在这种情况下,如果文件已更改,它将被复制到输出目录,您应该能够引用它并在那里加载它

您只需在app.config 中定义一个路径,例如DataPath,并将其设置为文件所在的文件夹。然后,您可以从您的应用程序中为该文件创建完整的路径名Path.Combine(AppSettings["DataPath"], "FilterIwant.html") - 使用这种方法,您将完全独立于文件的实际位置,并且您无需移动任何内容。另外:这使您有机会稍后为您的用户创建一个管理/配置实用程序,以便他们可以选择他们喜欢的任何目录,您的应用会在那里找到这些文件。

【讨论】:

使用第二种方法基本上每次部署正确时都必须将其设置为正确的路径? @chobo2:你必须为每次安装设置一次,是的。但是拥有一个配置条目也使您能够让最终用户自己更改它,例如使用一个配置实用程序。如果您将行为硬编码到代码中,您就没有这种可能性【参考方案6】:

在我的控制台应用程序中,我从调试目录开始,直到找到我想要的最近的父文件夹。

     static void Main(string[] args)
        
            Console.WriteLine("Start");
            var debugDir = Environment.CurrentDirectory;
            DirectoryInfo di = new DirectoryInfo(debugDir);               
            var searchDir = "";
            while (!di.FullName.ToLower().EndsWith("Folder1"))
            
                if(di.FullName.ToLower().EndsWith(":")) //if you went too far up as in "D:" then
                   break;
                di = di.Parent;
            

           Console.WriteLine(di.FullName);

【讨论】:

以上是关于如何从 C# 控制台应用程序中的目录获取路径?的主要内容,如果未能解决你的问题,请参考以下文章

c# 如何获取项目的根目录

c#中如何判断一个路径是目录还是文件

C#中如何获得当前应用程序路径?

C# 如何获取当前应用程序的上一级路径

C# 如何获取当前应用程序的上一级路径

C#如何保证获取当前应用程序的绝对路径是对的?