Как я могу разрешить относительный путь в обоих приложениях Web / Windows в C # - PullRequest
3 голосов
/ 22 июня 2009

У меня есть сборка, которая будет использоваться как в настольном приложении, так и на веб-сайте asp.net.

Мне нужно иметь дело с относительными путями (локальные файлы, а не URL-адреса) в любой ситуации.

Как я могу реализовать этот метод?

string ResolvePath(string path);

В веб-среде id ожидает, что метод будет вести себя следующим образом (где d:\wwwroot\mywebsite - папка, на которую указывает iis):

/folder/file.ext => d:\wwwroot\mywebsite\folder\file.ext
~/folder/file.ext => d:\wwwroot\mywebsite\folder\file.ext
d:\wwwroot\mywebsite\folder\file.ext => d:\wwwroot\mywebsite\folder\file.ext

для среды рабочего стола: (где c:\program files\myprogram\bin\ - это путь к .exe)

/folder/file.ext => c:\program files\myprogram\bin\folder\file.ext
c:\program files\myprogram\bin\folder\file.ext => c:\program files\myprogram\bin\folder\file.ext

Я бы предпочел не вводить другой IPathResolver в зависимости от того, в каком состоянии он работает.

Как мне определить, в какой среде я нахожусь, и что мне нужно делать в каждом случае, чтобы разрешить возможно относительный путь?

Спасибо

Ответы [ 3 ]

5 голосов
/ 08 июля 2011

Не думаю, что на оригинальный вопрос был дан ответ.

Давайте предположим, что вы хотите ".. \ .. \ data \ something.dat" относительно, скажем, исполняемого файла в "D: \ myApp \ source \ bin \". Использование

System.IO.Path.Combine (Environment.CurrentDirectory ,lativePath);

просто вернет "D: \ myApp \ source \ bin .. \ .. \ data \ some.dat", что также легко получить простым объединением строк. Комбинат не разрешает пути, он обрабатывает обратную косую черту и другие мелочи. Он, вероятно, хочет бежать:

System.IO.Path.GetFullPath ( "D: \ MyApp \ источник \ Bin .. \ .. \ Data \ something.dat");

Чтобы получить разрешенный путь : "D: \ myApp \ data \ something.dat".

2 голосов
/ 28 февраля 2012

Двоичные файлы веб-сайта копируются во временную папку при запуске приложения, поэтому вы обычно не можете получить относительный путь из исходной сборки.

Возможно, это не самый разумный способ сделать это, но то, что я сделал для решения этой проблемы, было примерно таким:

if (filepath.StartsWith("~"))
{
   filepath = HttpContext.Current.Server.MapPath(filepath);
}
else
{
  filepath = System.IO.Path.Combine(Environment.CurrentDirectory, filepath);
}

Это связано с тем, что в веб-версии - относительный путь имеет ~ перед - поэтому я могу сказать, пришел ли он из web.config или App.config

1 голос
/ 22 июня 2009

Как упомянуто в комментарии Джона, относительно чего? Вы можете использовать метод System.IO.Path.Combine для объединения базового пути с относительным путем, например:

 System.IO.Path.Combine(Environment.CurrentDirectory, relativePath);

Вы можете заменить Environment.CurrentDirectory в приведенной выше строке на любой желаемый базовый путь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...