.net framework提供了三个途径创建目录:
Directory.CreateDirectory(string)
DirectoryInfo.Create()
DirectoryInfo.CreateSubdirectory(string)通过以上任何一种途径,只要权限许可,都可以成功创建目录。在创建时.net将自动根据路径从驱动器开始逐级检查目录是否存在(不存在就创建),可谓比较智能化了。本来这是没什么问题的,但要命的是在asp.net中就出问题了。为了安全,web站点一般只给站点根目录分配权限,比如只给aspnet帐户拥有C:\inetpub\wwwroot的完全控制权限而不会拥有C:或者C:\inetpub的任何权限。在这样的情况下,以上三种创建目录的方式都因找不到目录c:\inetpub(因为没有读权限,自然找不到,但能找到wwwroot目录)而引起异常:
“未找到路径“E:\”的一部分”换句话说,在这样的情况下无法创建目录。本来我是想反编译dll后看看微软是怎么实现Directory类的,然后自己写一个类来解决,不过没找到dll文件中的Directory类。哪位有高招解决这个问题?

解决方案 »

  1.   

    将aspnet帐户加入本地windows管理员组
    再将要访问的目录的访问权限,放给aspnet帐户
      

  2.   

    我刚来,楼主是想在aspnet默认权限情况下,在wwwroot目录下递归建目录是吗?
      

  3.   

    加入权限后肯定是没问的了,但我的意是。我是想在虚拟主机上使用程序来管理文件和目录,而虚拟主机上一般都不可能在自己的WEB目录外有权限的(甚至最弱的读权限),不然岂不把别人的站点中的保密信息给取出来了?要求管理员给权限也不现实。以前使用asp的fso时只检查要创建目录的父目录就可以了,现在要用asp.net实现同样的功能在这样的情况下显然是不行的。
      

  4.   

    fso如果可以,那么,楼主调用fso试试object fso = HttpContext.Current.Server.CreateObject("Scripting.FileSystemObject");
    然后用反射调用它里面的方法
      

  5.   

    如果是你自己的server,那加aspnet用戶到管理員組.
    如果是虛擬主機,不可能讓你在你沒有權限的地方訪問文件,這個道理顯而易見.
      

  6.   

    干吗要从根目录开始查找?如果没有权限不论代码怎么做都是不可能创建的,权限是由操作系统控制的。
    你可以从ApplicationPath映射的物理路径作为根目录开始查找。不知你创建目录做什么用?能说明用意么?也许方案上有问题。
      

  7.   

    我同意(sykpboy(小憩---开始回答问题了))的说话
      

  8.   

    cuike519 说的没错 ,权限是由操作系统控制的 ,你给文件夹足够权限即可
      

  9.   

    weisunding(鼎鼎): 
       fso如果可以,那么,楼主调用fso试试object fso = HttpContext.Current.Server.CreateObject("Scripting.FileSystemObject");
    然后用反射调用它里面的方法
    能详细说说吗。如何调用,如何创建
      
     
      

  10.   

    假设虚拟主机用户的目录在E盘,首先我们找到E盘,并在其上点击右键>属性 并切换到 安全 选项卡,点击右下方的 高级按钮,进入高级安全设置
    点击 添加 按钮,查找并且选择 ASPNET 用户:
    然后点击 确定按钮,这时会出现一个窗口,让您选择此用户所能拥有的权限。在这里,我们将除了 "读取属性" 这个权限不拒绝以外,其它的全部拒绝(不将"读取属性"这一项拒绝是非常重要的,如果将其拒绝,则会导致ASP.NET程序在拥有权限的目录下也不能完成所有的操作(如在自己的目录下创建目录时提示: 未找到路径“X:\”的一部分 这样的错误)
    这样,ASP.NET程序就只能对其所在目录进行操作,而无法涉及到其它的文件目录。如果想在D盘创建目录的话,那就在刚才的地方开启ASPNET读写权限就行了
      

  11.   

    权限问题,没有对路径"X:\"的Server.MapPath权限,呵
      

  12.   

    呵呵,楼主一定是在Win2000下面进行创建目录,如果不把整个盘(比如E:)的读写权限付给ASPNET帐号的话,即使你给该盘下的目录E:\test付了权限,也不行的。Win2003好像没有这个问题。
    ==========================================
    我也碰到这样的问题,而且客户的服务器是托管的,找了对方的管理员,就是不肯给这样的权限(我们也理解对方的做法),正郁闷中呢
      

  13.   

    http://community.csdn.net/Expert/topic/4285/4285885.xml?temp=.9128687
    搜到这个,试一下,我有时间再试
      

  14.   

    >>liujiayu10(大宇)
    设置ASPNET帐号权限,没必要,只要设置读取和列表权限
      

  15.   

    用impersonatation啊  ImpersonateUser(name,domain,password)
      // 
         do whatever you want to under the impersonated account
      //
      Impersonate.Undo当然是要调用Win32 API 的。 advapi32 -> LogonUser
    advapi32 -> DuplicateToken
    kernel32 -> CloseHandle
      

  16.   

    楼上各位可能没理解楼主意思
    这个问题确实存在,要想在此盘下创建目录必须拥有此盘根目录的读取权限(一般设置IIS_WPG组),以及父目录的读写权限,但并不是楼主说的各级父目录的读取权限,其原因可能是.NET在建立目录时需要从磁盘根目录读取一些关于目录的特殊信息,不知道这算不算是.NET的一个BUG. 楼主可以向虚机服务商说明此问题,因为只是磁盘根目录的读取权限,应该不会对安全造成多大影响。实在不行就只能用FSO或其它方法了其实关于ASP.NET的安全问题一直是让虚机服务商头疼的,因为不太容易控制网站的可访问目录
    因为ASP网站其默认的运行权限是其匿名登录用户,可通过给每个网站建一个用户的方式来控制其可访目录,而ASP.NET程序运行权限取决于其应用程序池安全账户设置,默认为 网络服务,属于IIS_WPG组,很多服务商都是把ASP.NET网站的根目录设为IIS_WPG组 完全控制权限,这样做的安全问题就是,你可以访问其它站点的根目录,并可完全控制,很恐怖哟。所以说仅仅一个磁盘根目录的读取权限根本不算什么的。 :)=========================================四海之内皆兄弟!