Как получить путь из каталога в консольном приложении C #? - PullRequest
8 голосов
/ 10 июля 2010

Допустим, у меня есть такая файловая структура

Soultion-> Folder1 -> FileIwant.html

Так что это может быть что-то вроде C: \ Soultion \ Folder1 \ FilterIwant.html

Теперь мне нужно прочитать этот файл в моем приложении.Я не могу просто жестко закодировать его, потому что, когда я передаю его кому-то другому, они могут поместить его на диск F: или что-то в этом роде.

Или когда я создаю MSI-файл, путь может быть совершенно другим.Так как я могу сказать, может быть, взять

"Folder1 \ FilterIwant.html"

и использовать его, чтобы получить путь к папке, независимо от того, где они ее поместили?

Edit

Я попробовал Path.GetFullPath, но я попал в каталог bin / debug.Но мой файл не в этом каталоге.Я думаю, что это пара каталогов раньше.Также, если я сделаю MSI-файл, у меня будет каталог bin / debug?

Ответы [ 6 ]

6 голосов
/ 10 июля 2010

Почему файл, который используется как часть вашего приложения, не находится в той же папке, что и приложение? Мне кажется, что вы должны установить свойства этого файла для копирования в выходную папку, когда вы делаете сборку.

Это сделает ваш файл равным в папке bin \ debug.

EDIT: либо это, либо вы должны поместить свои файлы в одну из специальных папок, данные приложения или мои документы приходят на ум.

4 голосов
/ 10 июля 2010

Когда Visual Studio компилирует ваш проект, он будет помещать вывод в каталог bin\debug.Любые файлы содержимого, на которые вы хотите сослаться, также должны быть скопированы в эти места, чтобы приложение, находящееся в этом каталоге, могло прочитать этот файл.

У вас есть два варианта:

  • либо вы устанавливаете свойство Copy to Output Directory на FilterIwant.html на Copy if newer;в этом случае, если файл изменился, он будет скопирован в выходной каталог, и вы сможете ссылаться на него и загружать его туда

или

  • вы просто определяете путь в вашем app.config, что-то вроде DataPath, и устанавливаете его в папку, в которой находится файл.Из вашего приложения вы затем создаете полный путь к этому файлу как Path.Combine(AppSettings["DataPath"], "FilterIwant.html") - при таком подходе вы становитесь полностью независимым от того, где файл находится на самом деле, и вам не нужно ничего перемещать.Также: это дает вам возможность позже создать для ваших пользователей утилиту admin / config, чтобы они могли выбирать любой каталог, который им нравится, и ваше приложение найдет там эти файлы.
3 голосов
/ 11 января 2012

В своем консольном приложении я начинал с каталога отладки, пока не нашел ближайшую родительскую папку, которую хотел.

     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);
}
1 голос
/ 10 июля 2010

Вам нужна помощь System.Io.Path class:

GetFullPath: возвращает абсолютный путь для указанной строки пути.

Редактировать :

Вам также может понадобиться каталог приложения - именно здесь ваше приложение будет установлено:

string appPath = Path.GetDirectoryName(Application.ExecutablePath);
1 голос
/ 10 июля 2010

Path.GetFullPath

Редактировать

Путь bin / Debug не будет присутствовать при запуске установленного приложения (если, конечно, вы специально не скажете установщику использовать этот подкаталог).

0 голосов
/ 10 июля 2010

Возможно, вы хотите передать полный путь в качестве аргумента командной строки.Затем вы можете получить аргумент, используя параметр 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
   }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...