Как получить файлы в относительном пути в C#

Если у меня есть исполняемый файл под названием app.exe, который является тем, что я кодирую в C#, как я получил бы файлы от папки, загруженной в том же каталоге как app.exe, с помощью относительных путей?

Это бросает запрещенные символы в исключение пути:

string [ ] files = Directory.GetFiles ( "\\Archive\\*.zip" );

Как можно было бы сделать это в C#?

30
задан Peter Mortensen 8 October 2015 в 18:41
поделиться

4 ответа

Чтобы убедиться, что у вас есть путь к приложению (а не только текущий каталог), используйте следующее:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getcurrentprocess. aspx

Теперь у вас есть объект Process , представляющий запущенный процесс.

Затем используйте Process.MainModule.FileName :

http://msdn.microsoft.com/en-us/library/system.diagnostics.processmodule.filename.aspx

Наконец, используйте Path.GetDirectoryName , чтобы получить папку, содержащую .exe:

http://msdn.microsoft.com/en-us/library/system.io.path.getdirectoryname.aspx

Итак, это то, что вы хотите:

string folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Archive\";
string filter = "*.zip";
string[] files = Directory.GetFiles(folder, filter);

(Обратите внимание, что "\ Archive \" из вашего вопроса теперь @ "\ Archive \" : вам нужен @, чтобы \ обратная косая черта не интерпретируется как начало escape-последовательности)

Надеюсь, что это поможет!

41
ответ дан 27 November 2019 в 23:11
поделиться
string currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string archiveFolder = Path.Combine(currentDirectory, "archive");
string[] files = Directory.GetFiles(archiveFolder, "*.zip");

Первый параметр - путь. Второй - шаблон поиска, который вы хотите использовать.

30
ответ дан 27 November 2019 в 23:11
поделиться

Запишите это так:

string[] files = Directory.GetFiles(@".\Archive", "*.zip");

. относится к папке, в которой вы запустили свой exe, и @, чтобы разрешить \ в имени.

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

Чтобы получить папку, в которой на самом деле находится ваш .exe, используйте:

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
16
ответ дан 27 November 2019 в 23:11
поделиться

Как сказали другие, вы можете/должны добавлять к строке @ (хотя вы также можете просто убрать обратные слеши), но они обошли вниманием (то есть не упомянули об этом, несмотря на внесение изменений, связанных с этим) тот факт, что, как я недавно обнаружил, использование \ в начале имени пути, без . для обозначения текущего каталога, ссылается на корень дерева текущего каталога.

C:\foo\bar>cd \
C:\>

versus

C:\foo\bar>cd .\
C:\foo\bar>

(Using . само по себе имеет тот же эффект, что и использование .\ само по себе, из моего опыта. Я не знаю, есть ли конкретные случаи, когда они не означают одно и то же.)

Вы также можете просто опустить ведущее .\, если хотите.

C:\foo>cd bar
C:\foo\bar>

На самом деле, если вы действительно хотите, вам даже не нужно использовать обратные слеши. Обратные слэши прекрасно работают! (Хотя одиночный / не является псевдонимом текущего корня диска, как \.)

C:\>cd foo/bar
C:\foo\bar>

Вы можете даже чередовать их.

C:\>cd foo/bar\baz
C:\foo\bar\baz>

... Я действительно отклонился от темы, так что не стесняйтесь игнорировать все это, если вам это не интересно.

2
ответ дан 27 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: