尝试保存文件:Directory.Exists()在目录实际不存在时返回true

时间:2012-05-05 06:50:59

标签: c# asp.net .net asp.net-mvc

所以我有一个HTML表单,用户可以上传图像。这发布到我的操作,图像被放入用户id唯一的目录中(如果该目录尚不存在,则创建该目录)。

自从我在两个月前实施它以来,它一直运行得很好,我从此不必触摸它。最初我得到UnauthorizedAccessExceptions,但通过进入我的上传目录的安全设置并授予对“每个人”的完全控制权来解决这个问题。

很明显,我再也无法保存图像了。我开始再次获取UnauthorizedAccessExceptions,尽管一次又一次地更改文件夹的安全设置以尝试修复它。最后阅读有关在ASP.net中进行帐户模拟的内容。

所以,现在我没有得到UnauthorizedAccessExceptions而是遇到了我的网站问题,认为该目录已经存在。

以下是我的表单操作的摘录:

if (Directory.Exists(Path.GetDirectoryName(Server.MapPath("../uploads/" + currentUser.UserId))) == false)
{
   Directory.CreateDirectory(Path.GetDirectoryName("../uploads/" + currentUser.UserId));
}
if (Directory.Exists(Path.GetDirectoryName(Server.MapPath("../uploads/" + currentUser.UserId + "/" + newEntry.EntryId))) == false)
{
   Directory.CreateDirectory(Path.GetDirectoryName("../uploads/" + currentUser.UserId + "/" + newEntry.EntryId));
}

ImageFile.SaveAs(Server.MapPath("../" + savedFileName));

if语句中的代码永远不会执行。所以,我删除了它们,只是尝试了:

Directory.CreateDirectory(Path.GetDirectoryName("../uploads/" + currentUser.UserId));

什么都没发生!然后,当是时候保存图像时,我会抛出一个异常,因为该目录不存在!任何人都可以告诉我为什么Directory.Exists()正在返回true,或者为什么Directory.CreateDirectory()绝对没有做什么?

或者为什么这段代码没有受到影响并且工作好几个月并且突然决定投入合适?

注意:如果我转到该文件夹​​并手动创建目录,该文件保存得很好

3 个答案:

答案 0 :(得分:1)

Path.GetDirectoryName只返回目录名而不是目录的完全限定路径。 Directory.Exists将获取目录的完全限定路径,然后检查目录是否存在。

如果Directory.Exists将在Web应用程序的根目录中检查该文件夹是否存在而不是查看uploads文件夹内,则您的情况将失败。

你的情况应该是这样的:

if (Directory.Exists(Server.MapPath("/uploads/" + currentUser.UserId)) == false)
{
    Directory.CreateDirectory(Server.MapPath("/uploads/" + currentUser.UserId));
}

注意:从路径中移除了前导“..”并且它有效!!

答案 1 :(得分:0)

显然,这就是我需要改变的全部内容:

Directory.CreateDirectory(Server.MapPath("../uploads/" + currentUser.UserId));

放入Server.MapPath,现在一切正常。不知道为什么它之前工作正常然后突然停止了。

答案 2 :(得分:0)

试试这个:

var path = Server.MapPath(string.Format("~/uploads/{0}/{1}/", userId, entryId));

//MSDN: Creates all directories and subdirectories as specified by path
Directory.CreateDirectory(path);

var filePath = Path.Combine(path, savedFileName);

ImageFile.SaveAs(filePath );