Как получить путь из каталога в консольном приложении C#?

скажем, у меня есть эта структура файла

Soultion - > Folder1 - > FileIwant.HTML-код

Так что это может быть что-то вроде C:SoultionFolder1FilterIwant - ... HTML-код

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

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

"Folder1FilterIwant.HTML-код"

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

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

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

6 ответов


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

делая это, убедитесь, что ваш файл is в папке bin\debug.

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


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

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

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

или

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

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

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

вам нужна помощь Система.Ио.Путь класс:

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

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

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

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

Path.GetFullPath

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

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


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

}