检查服务器上是否存在文件

16

我正在尝试使用我的ASP.NET网页的C#代码检查服务器上是否有一个文件。我知道这个文件确实存在,因为我之前用一段代码将其放在了服务器上。有人能看出为什么它找不到这个文件吗?这是代码:

wordDocName = "~/specifications/" + Convert.ToInt32(ViewState["projectSelected"]) + ".doc";
ViewState["wordDocName"] = wordDocName;
if (File.Exists(wordDocName))
{
    btnDownloadWordDoc.Visible = true;
}
else
{
    btnDownloadWordDoc.Visible = false;
}

你在Windows上使用Unix路径规则吗? - Kevin Hsu
@GreenScreen:为什么你要将你的ViewState转换成整数?它将会被转换回字符串,这样就有两次转换的风险,可能会出现ConversionException。 - slfan
8个回答

48

文件路径应该是物理路径而非虚拟路径。使用

if (File.Exists(Server.MapPath(wordDocName)))

3
有关物理路径与虚拟路径的附加信息:ASP.NET Web 项目路径 - MikeM
答案如果是针对vb.net编写的,需要额外添加第三个闭合括号。我无法仅通过编辑一个字符来修改答案,因此我在评论中进行了说明。 - Doreen

2

File.Exists()和你想对文件进行的其他操作都需要真实路径。

你的wordDocName是一个相对URL。

只需使用

string fileName = Server.MapPath(wordDocName);

1

使用

Server.MapPath("~/specifications/" + Convert.ToInt32(ViewState["projectSelected"]) + ".doc")

获取完全限定路径。这应该能为您完成所需的任务。


1

你需要使用 Server.MapPath,例如:

    wordDocName = Server.MapPath("~/specifications/" + Convert.ToInt32(ViewState["projectSelected"]) + ".doc");
    ViewState["wordDocName"] = wordDocName;
    if (File.Exists(wordDocName))
    {
        btnDownloadWordDoc.Visible = true;
    }
    else
    {
        btnDownloadWordDoc.Visible = false;
    }

1

如果文件所在的目录被符号链接/符号连接引用,这可能无法正常工作。我在自己的应用程序中遇到了这种情况,如果我将文件的真实路径放入其中,File.Exists()返回true。但是,如果我使用Server.MapPath,但实际上该文件夹是一个指向文件夹的链接,似乎会失败。有人经历过相同的行为吗?


0
您需要使用Server.MapPath(relativePath)将路径转换为物理路径。
if (File.Exists(filePath))

wordDocName = "~/specifications/" + ViewState["projectSelected"] + ".doc";        
btnDownloadWordDoc.Visible = File.Exists(Server.MapPath(wordDocName));

0
字符 "~" 是 ASP.NET 中的特殊字符,用于获取虚拟路径规范,简单地意味着 "应用程序的根目录"。它不像File API那样被 .NET BCL 理解,必须首先使用 Server.MapPath() 将其映射到物理路径,正如其他人所述。

-3

string docname="traintatkalantnoy.txt";

string a = (Server.MapPath(docname)); if (File.Exists(a))

这段代码与编程有关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接