2012-05-05 93 views
1

所以我有一个HTML表单,用户可以上传图像。这发布到我的行动,图像被放在一个唯一的用户的ID目录(并创建该目录,如果它不存在)。尝试保存文件:Directory.Exists()返回true时,实际上不存在目录

自从我在两个月前实施它以来,这一直工作得很好,而且我从未碰过它。最初我得到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)); 

内的代码,如果从来没有执行语句。所以,我删除它们,只是试图:

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

什么都没有发生!然后当保存图像的时候,我得到一个异常,因为该目录不存在!谁能告诉我为什么Directory.Exists()正在返回true,或者为什么Directory.CreateDirectory()在做什么都没有?

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

注意:如果我去的文件夹,然后手动创建目录,文件保存就好了

+0

也许你没有设置权限? – Mediator

+0

就像我说过的,文件夹安全性设置为给每个人完整的权限。而且,权限与Directory.Exists()无关,当它不应该返回true时 – Danny

回答

1

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

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

你的情况应该是这样的:

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

注意:删除从路径领先的“..”和它的工作!

+0

同样的结果。没有创建文件夹。 – Danny

+0

它只需要CreateDirectory中的Server.MapPath(..)为我工作,留在前面的“..” – Danny

0

显然,这是所有我需要改变:

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

投入和使用Server.Mappath现在一切正常。不知道为什么它之前工作正常,突然停止。

+0

正确,这是问题,但也是领先的“..”为我创建了一个问题。 – Prashant

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); 
相关问题