Проблема с относительным путем в System.file.ввод-вывод из asp.net

#c# #asp.net #relative-path

#c# #asp.net #относительный путь

Вопрос:

Я сохраняю путь к файлу в базе данных как ~/FolderName / FileName и при попытке открыть файл с помощью System.IO.FileInfo(путь к файлу) таким образом. Он не может расшифровать путь к файлу. Более того, я использую это утверждение в файле загрузки класса, поэтому я не могу использовать Page.Сервер.MapPath. Есть ли способ обойти эту проблему.

Это следующие строки кода, которые я использую:

 if (dr1.Read())
{
    String filePath = dr1[0].ToString();
    HttpContext.Current.Response.ContentType = "APPLICATION/OCTET-STREAM";
    String disHeader = "Attachment; Filename=""   fileName   """;
    HttpContext.Current.Response.AppendHeader("Content-Disposition", disHeader);
    System.IO.FileInfo fileToDownload = new System.IO.FileInfo(filePath);
    string fullName = fileToDownload.FullName;
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.WriteFile(fileToDownload.FullName);
    sqlCon.Close();
}
  

где путь к файлу имеет формат ~/ComponentFolderForDownloading/FileName.exe

Как я могу решить эту проблему?

Комментарии:

1. По какой-либо причине вы не можете использовать MapPath в своем классе DownloadFile?

2. @Joe может кто-нибудь объяснить мне, в чем разница между сервером. MapPath(«~/ComponentFolder/File1.exe «) и сервер. MapPath(«~ComponentFolderFile1.exe «) с этим / и ??

Ответ №1:

Если вы не можете использовать Server.MapPath для определения местоположения файла, вам нужно использовать что-то другое. FileInfo Класс не может принять ASP.NET виртуальный путь в его конструкторе. Для этого нужен реальный, физический путь к файлу.

Вам нужно удалить ~/ из начала пути; возможно, заменить / на , а затем использовать Path.Combine с корневым каталогом вашего приложения, чтобы найти физическое местоположение. Но это предполагает, что ваши местоположения находятся в физических каталогах, а не в виртуальных.

Server.MapPath был, конечно, создан специально для этого.

Альтернативой могло бы быть хранение реальных, физических местоположений файлов в БД; либо в дополнение к виртуальному, либо вместо него., ASP.NET единицы.

Комментарии:

1. может ли кто-нибудь объяснить мне, в чем разница между сервером. MapPath(«~/ComponentFolder/File1.exe «) и сервер. MapPath(«~ComponentFolderFile1.exe «) с этим / и ??

Ответ №2:

Если вы знаете, что работаете в IIS, вы можете использовать:

 HttpContext.Current.Server.MapPath("~/someurl");
  

Комментарии:

1. может ли кто-нибудь объяснить мне, в чем разница между сервером. MapPath(«~/ComponentFolder/File1.exe «) и сервер. MapPath(«~ComponentFolderFile1.exe «) с этим / и ??

2. Обратные косые черты — это соглашение файловой системы Windows. Я всегда использую косые черты для интернет-URL.