Как получить путь из каталога в консольном приложении 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
toCopy 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);
редактировать
на 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
}
}