2015-09-01 14 views
5

jestem sprawdzanie istnienia bu pliku nie może go znaleźć, niezależnie od tego, czy jest, czy nieSprawdzanie czy plik istnieje w ASP.NET MVC 5

if (System.IO.File.Exists("~/files/downloads/" + fileCode + ".pdf")) 
      { 
       return File("~/files/downloads/" + fileCode, "application/pdf", Server.UrlEncode(fileCode)); 
      } 
      else 
      { 
       return View("ErrorNotExistsView"); 
      } 

Jak mogę zmienić kod, aby sprawdzić o istnienie pliku poprawnie?

+0

Co to znaczy „nie może go znaleźć?” Czy kod wpisuje część "if" lub "else"? – chiapa

+0

Wprowadza część else, niezależnie od istnienia pliku – Arianule

+1

zamienia "~" na HttpContext.Current.Server.MapPath (""); –

Odpowiedz

15

System.IO.File będzie działać, jeśli podasz ścieżkę bezwzględną lub ścieżkę względną. Ścieżka względna nie będzie względna w stosunku do folderu głównego HTML, ale bieżący katalog roboczy . Bieżący katalog roboczy będzie miał wartość taką jak C:\Program Files (x86)\IIS Express.

Znak ~ na początku ścieżki do pliku interpretowany jest tylko jako część bieżącego kontekstu ASP.NET, o którym metody File nic nie wiedzą.

Jeśli jesteś w metodzie kontrolera, można użyć obiektu HttpContext.Server

var relativePath = "~/files/downloads/" + fileCode + ".pdf"; 
var absolutePath = HttpContext.Server.MapPath(relativePath); 
if(System.IO.File.Exists(absolutePath)) .... 
+0

Głupia ode mnie, dziękuję allo – Arianule

+0

Nie wiedziałem, że 'File.Exists()' działa tylko dla ścieżek bezwzględnych, dzięki – chiapa

+0

msdn dla 'File.Exists' mówi:" Parametr ścieżki może określać względną lub bezwzględną ścieżkę Informacje Względna ścieżka jest interpretowana jako relatywna względem bieżącego katalogu roboczego. " –

2

istnieje() może zwrócić wartość false, jeśli aplikacja nie ma wystarczających uprawnień dostępu do pliku. Powinieneś przekazać je do appPool w określonym folderze i plikach.

0

Oto moje rozwiązanie:

<span> 
@{ 
    var profileImg = "/Images/" + User.Identity.GetUserId() + ".jpg"; 
    var absolutePath = HttpContext.Current.Server.MapPath(profileImg); 
    if (System.IO.File.Exists(absolutePath)) 
    { 
     <img alt="image" width="50" height="50" class="img-circle" src="@profileImg" /> 
    } 
    else 
    { 
     <img alt="image" width="50" height="50" class="img-circle" src="~/Images/profile_small.jpg" /> 
    } 
} 
</span>