Как получить файлы в относительном пути в С#
Если у меня есть исполняемый файл, называемый app.exe, который является тем, что я кодирую на С#, как бы получить файлы из папки, загруженной в тот же каталог, что и app.exe, используя относительные пути?
Это вызывает недопустимые символы в исключении пути:
string [ ] files = Directory.GetFiles ( "\\Archive\\*.zip" );
Как сделать это в С#?
Ответы
Ответ 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");