Каков наилучший способ проверить наличие файла с использованием относительного пути.
Я использовал следующий метод, но он возвращает false, несмотря на то, что файл существует.
bool a = File.Exists("/images/Customswipe_a.png");
Каков наилучший способ проверить наличие файла с использованием относительного пути.
Я использовал следующий метод, но он возвращает false, несмотря на то, что файл существует.
bool a = File.Exists("/images/Customswipe_a.png");
Это не относительный путь. Вам нужно оставить первый /
, иначе он будет интерпретироваться как корневой (то есть C:/images...)
Я предполагаю, что вы используете этот код в приложении asp.net, поэтому вы получаете false.
В asp.net вы должны использовать Server.MapPath("/images/Customswipe_a.png")
для получения "правильного" пути (относительно корневого каталога веб-приложения). В противном случае вы получите локальный путь к исполняемому файлу веб-сервера (IIS/WEBDAV/.. имя любого другого).
Относительный путь относится к текущему рабочему каталогу. Это не может быть каталог приложения. Вызовите GetCurrentDirectory(), чтобы проверить фактический путь, который вы тестируете.
Вам просто нужно определить, что ваш файл относительно
В каждом из этих случаев я бы предложил вам преобразовать его в абсолютный путь методом Path.Combine
:
public static readonly string AppRoot = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
...
//calling with a '/' heading makes the path absolute so I removed it
var fullPath = Path.Combine(AppRoot, "images/Customswipe_a.png");
var exists = File.Exists(fullPath);
Таким образом, вы можете гарантировать, где вы ищете. Даже диалоговые окна "Открыть/Сохранить" могут изменить текущий каталог. Таким образом, вызов File.Exists
без полного пути обычно является неправильным решением.
Относительный путь - это относительный. В этом API он будет, согласно документации File.Exists:
Относительная информация о пути интерпретируется как относительно текущей рабочий каталог.
Итак, все здесь зависит от того, что такое CurrentDirectoty в момент выполнения этого запроса.
Кроме того, ваш путь недействителен. Путь к рабочему столу (предположим, вы выбрали его из какого-либо веб файла или знаний). Чтобы понять, если указанный путь содержит недопустимые символы, используйте функцию GetInvalidCharacters.
В вашем конкретном случае достаточно использовать @"\images\Customswipe_a.png"
.
Путь относится к местоположению вашего двоичного файла. В случае проекта визуальной студии это будет %PROJECTDIR%/bin/(RELEASE||DEBUG)/
Что бы я делал, это положить корень файловой системы в файл конфигурации и использовать его для вашего относительного пути.
В приложении WinForms вы можете получить каталог exe файла с помощью
string directory =
Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);
В другом решении используется Reflection
string directory =
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);