Подтвердить что ты не робот

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

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

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

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

Как сделать это в С#?

4b9b3361

Ответ 1

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

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-последовательности)

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

Ответ 2

string currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string archiveFolder = Path.Combine(currentDirectory, "archive");
string[] files = Directory.GetFiles(archiveFolder, "*.zip");

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

Ответ 3

Напиши так:

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

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

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

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

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

Ответ 4

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

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

против

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

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

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

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

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

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

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

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

... Я действительно ушел из темы здесь, поэтому, не стесняйтесь игнорировать все это, если вас это не интересует.

Ответ 5

Довольно прямо, используйте относительный путь

string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");