這幾天本人接了個檔案管理查詢系統的小項目,踩過的坑。
其實功能都挺簡單的,大致要求客戶有很多pdf文檔,為了方便管理,所有要開發一個相當於文件管理系統,本人正好有現成的文件管理系統,修改下就可以。其中客戶要求pdf需要放到其他的盤符,不能和應用程序在一起,這個解決起來非常方便。系統上線了后,因為客戶的pdf是分目錄放的,如果上百個虛擬目錄是手動創建的話,就有點繁瑣。因此需要代碼實現。記錄如下:
/// <summary>
/// 創建虛擬目錄
/// </summary>
/// <param name="hostName">主機名稱或者網站訪問IP地址 127.0.0.1</param>
/// <param name="vDirName">需要創建虛擬目錄的名稱</param>
/// <param name="mappingPath">映射地址</param>
/// <param name="websiteID">網站應用程序ID</param>
public static void CreateVDir(string websiteID, string vDirName, string mappingPath, string hostName = "127.0.0.1")
{
/*
在創建的時候會報錯誤:System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
網上查是因為權限的問題
解決方法為:在IIS中的默認應用程序池-->高級設置...-->標識改成Local System可以解決該問題
*/
// iis 是否存在需要創建的虛擬目錄,true:存在 false:不存在
var hasVdirName = false;
try
{
// IIS://127.0.0.1/W3SVC/10/ROOT
string path = string.Format("IIS://{0}/W3SVC/{1}/ROOT", hostName, websiteID);
DirectoryEntry rootfolder = new DirectoryEntry(path);
// 循環遍歷,判斷需要創建的虛擬目錄在 iis網站上面是否存在
foreach (System.DirectoryServices.DirectoryEntry v in rootfolder.Children)
{
if (v.Name == vDirName)
{
hasVdirName = true;
break;
}
}
// 如果存在,則不需要創建
if (hasVdirName) return;
// 加入集合
DirectoryEntry newVirDir = rootfolder.Children.Add(vDirName, rootfolder.SchemaClassName);
// 指定虛擬目錄映射的實際目錄
newVirDir.Properties["Path"][0] = mappingPath;
// 提交改變
newVirDir.CommitChanges();
// 提交改變
rootfolder.CommitChanges();
newVirDir.Close();
rootfolder.Close();
rootfolder.Dispose();
newVirDir.Dispose();
}
catch (Exception ex)
{
// 錯誤日志處理
}
}
