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

本文关键字:Exists Directory true 返回 不存在 保存文件 实际上 | 更新日期: 2023-09-27 18:33:19

所以我有一个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()什么都不做?

或者为什么这段代码几个月来一直没有动过并且工作正常,突然决定抛出一个适合?

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

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

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

如果 Directory.Exists 将检查 Web 应用程序的根目录,而不是查看上传文件夹内部,则您的条件将失败。

您的条件应该是这样的:

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

注意:从路径中删除了前导"..",它起作用了!!

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

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

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

试试这个:

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