Как получить файлы по относительному пути в C # - PullRequest
30 голосов
/ 16 июля 2010

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

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

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

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

Ответы [ 5 ]

39 голосов
/ 16 июля 2010

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

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

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

30 голосов
/ 16 июля 2010
string currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string archiveFolder = Path.Combine(currentDirectory, "archive");
string[] files = Directory.GetFiles(archiveFolder, "*.zip");

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

15 голосов
/ 16 июля 2010

Напишите так:

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

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

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

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

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
2 голосов
/ 16 июля 2010

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

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

против

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

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

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

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

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

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

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

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

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

0 голосов
/ 12 апреля 2017

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

string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...