首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 虛擬主機環境下 Directory.CreateDirectory 權限錯誤解決方案

     編輯:關於ASP.NET

在共享虛擬主機環境,呼叫 System.IO.Directory.CreateDirectory 或 DirectoryInfo.CreateSubdirectory 常拋出 DirectoryNotFoundException: 未找到路徑 "E:\" 的一部分。原因:Directory 類別內部會嘗試遍歷磁碟根目錄(如 E:\)檢查權限,但虛擬主機的 Network Service / IIS_IUSRS 帳號通常無磁碟根目錄讀取權限。

現象與堆疊追蹤

System.IO.DirectoryNotFoundException: 未找到路徑 "E:\" 的一部分。
   at System.IO.__Error.WinIOError(Int32 errorCode, String str)
   at System.IO.Directory.InternalCreateDirectory(String fullPath, String path)
   at System.IO.Directory.CreateDirectory(String path)

錯誤路徑顯示為磁碟根目錄(E:\、D:\ 等),而非目標資料夾路徑,證實是遍歷根目錄時遭拒。

方案一:使用 FileSystemObject (COM) 繞過 .NET IO 安全檢查

前提:主機啟用 Microsoft Scripting Runtime (scrrun.dll) 且信任層級允許 COM Interop。

  1. 專案 → 加入參考 → COM → Microsoft Scripting Runtime
  2. 程式碼:
    using Scripting;
    
    public void CreateFolder(string path)
    {
        FileSystemObject fso = new FileSystemObjectClass();
        if (!fso.FolderExists(path))
        {
            fso.CreateFolder(path);
        }
    }
    

優點:不觸發 .NET 根目錄遍歷。缺點:依賴 COM 元件、64 位元相容性需測試、中信任環境可能被禁止。

方案二:使用 Server.MapPath 確保路徑正確 + 檢查寫入權限

許多錯誤源於路徑拼接錯誤導致指向非預期根目錄。

string targetPath = Server.MapPath("~/Uploads/" + folderName);
// 確保父目錄存在
DirectoryInfo di = new DirectoryInfo(targetPath);
if (!di.Parent.Exists) 
    di.Parent.Create(); // 這裡仍可能觸發權限問題
di.Create();

若仍報錯,請要求主機商對 Uploads 資料夾授予 IIS_IUSRS 修改 權限(寫入+刪除)。

方案三:改用 ASP.NET Core / .NET 5+ 內建 API(長期解決)

// ASP.NET Core 控制器中
var uploads = Path.Combine(_env.WebRootPath, "uploads", folderName);
Directory.CreateDirectory(uploads); // Core 版本已優化權限檢查邏輯

.NET Core 執行時不再強制遍歷磁碟根目錄,相容性大幅提升。

方案四:暫存區隔離策略(不依賴實體路徑)

  • 使用 Path.GetTempPath() 系統暫存目錄(通常有寫入權限)。
  • 或使用 Azure Blob / AWS S3 / MinIO 物件儲存,完全避開本地檔案系統權限問題。

主機商溝通關鍵點

  1. 請求對網站根目錄下特定資料夾(如 /Uploads、/App_Data)授予 IIS_IUSRS 修改權限。
  2. 確認信任層級:Medium Trust 以上才能使用 FileIO 權限。
  3. 詢問是否支援 Microsoft Scripting Runtime COM 元件。

總結建議

方案適用情境風險
FSO COM舊專案、無法改權限、主機支援 COM相容性、安全性疑慮
要求主機授權最標準、最乾淨需主機商配合、等待時間
遷移至雲端儲存新專案、高擴充性需求架構變更成本
升級 .NET Core長期維護專案重寫成本

遇到此問題時,優先嘗試「要求主機商授權特定資料夾權限」,若不可行再評估 FSO 或架構調整。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved