21

I am checking for the existence of a file bu cannot find it, regardless of whether it is there or not

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

How can I amend the code to check for the existence of the file correctly?

3
  • What do you mean "cannot find it"? Does the code enter the "if" part or the "else" part? Commented Sep 1, 2015 at 10:32
  • It enters the else part, regardless of the file's existance Commented Sep 1, 2015 at 10:39
  • 1
    replace "~" with HttpContext.Current.Server.MapPath(""); Commented Sep 1, 2015 at 10:39

5 Answers 5

53

System.IO.File will work if you provide an absolute path or a relative path. A relative path will not be relative to the HTML root folder, but the current working directory. The current working directory will be a value like C:\Program Files (x86)\IIS Express.

The ~ character at the beginning of the file path is only interpreted as part of the current ASP.NET context, which the File methods know nothing about.

The method to help you here is HttpServerUtility.MapPath

If you are in a controller method, you can invoke this method on the object HttpContext.Server, otherwise (e.g. in a View) you can use HttpContext.Current.Server.

 var relativePath = "~/files/downloads/" + fileCode + ".pdf";
 var absolutePath = HttpContext.Server.MapPath(relativePath);
 if(System.IO.File.Exists(absolutePath)) ....
Sign up to request clarification or add additional context in comments.

4 Comments

I wasn't aware that File.Exists() only works for absolute paths, thanks
msdn for File.Exists says: "The path parameter is permitted to specify relative or absolute path information. Relative path information is interpreted as relative to the current working directory. "
@Sag1v - OK, I've updated my answer to accommodate your feedback.
I used this in Razor and noted I needed to add .Current in the path, i.e. HttpContext.Current.Server.MapPath(relativePath).
4

Here's my solution:

<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>

Comments

3

Exists() can return false if app has not sufficient permissions to access the file. So you should grant those to appPool on specific folder and files.

Comments

1

File.Exists() will need the full path. Try using something like:

@"C:\users\yourUsername\myDocuments\files\\downloads\" + fileCode + ".pdf"

instead of:

"~/files/downloads/" + fileCode + ".pdf"

Comments

0
 @if (Session["staff_no"] != null)
                        {
                            string image = Session["staff_no"].ToString();

                            if (Session["sex"].ToString() == "1")
                            {
                                if (@File.Exists(Server.MapPath("/images/employees/profile_pic/" + image + ".jpg")).ToString() == "True")
                                {
                                    <img id="prof_image2" src="/images/employees/profile_pic/@Url.Content(Session["staff_no"].ToString() + ".jpg")" onerror="this.src = '/images/employees/profile_pic/profile-pic-male.jpg'" class="img-circle" alt="User Image">
                                }
                                else
                                {
                                    <img id="prof_image2" src="/images/employees/profile_pic/profile-pic-male.jpg" class="img-circle" alt="User Image">
                                }
                            }
                            else
                            {
                                if (@File.Exists(Server.MapPath("/images/employees/profile_pic/" + image + ".jpg")).ToString() == "True")
                                {
                                    <img id="prof_image2" src="/images/employees/profile_pic/@Url.Content(Session["staff_no"].ToString() + ".jpg")" onerror="this.src = '/images/employees/profile_pic/profile-pic-female.jpg'" class="img-circle" alt="User Image">
                                }
                                else
                                {
                                    <img id="prof_image2" src="/images/employees/profile_pic/profile-pic-female.jpg" class="img-circle" alt="User Image">
                                }
                            }
                        }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.