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

时间:2010-07-09 22:32:21

标签: c# .net path relative-path

说我有这个文件结构

Soultion-> Folder1 - > FileIwant.html

所以这可能是像C:\ Soultion \ Folder1 \ FilterIwant.html

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

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

“Folder1中\ FilterIwant.html”

并使用它来获取文件夹路径,无论它们放在何处?

修改

我尝试了Path.GetFullPath,但是我登陆了bin / debug目录。但我的文件不在该目录中。我认为以前是几个目录。另外,如果我创建一个msi文件,我会有bin / debug目录吗?

6 个答案:

答案 0 :(得分:6)

为什么用作应用程序一部分的文件与应用程序不在同一文件夹中?听起来像你应该设置该文件的属性,以便在进行构建时复制到输出文件夹。

这样做可以确保bin \ debug文件夹中的文件

编辑: 或者您应该将文件放在一个特殊文件夹中,应用数据我的文档会浮现在脑海中。

答案 1 :(得分:4)

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

您有两种选择:

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

Path.GetFullPath

修改

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

答案 4 :(得分:1)

您需要System.Io.Path课程的帮助:

  

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

修改

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

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

答案 5 :(得分:0)

您可能希望将完整路径作为命令行参数传递。然后,您可以使用args方法的Main参数获取参数。要将相对路径转换为绝对路径,您可以使用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
   }

}