Windows中有很多文件夾是受系統保護的,比如System Volume Information,中文名稱可以翻譯為“系統卷標信息”,這個文件夾裡就存儲著系統還原的備份信息。對於這類系統資源,應用程序是無法直接訪問其中的子目錄和文件的,所以必須讓Windows認為我們程序的當前訪問是安全的,才能讓我們訪問,這就要用到System.Security.AccessControl命名空間了,它提供了有關安全訪問系統資源的方法。
下面是C#寫的一個獲取受保護文件夾的子目錄的函數:
//注意添加名稱空間的引用:using System.Security.AccessControl;
private DirectoryInfo[] GetDirList(DirectoryInfo dirInfo)
{
if (dirInfo == null || !dirInfo.Exists)
return null;
DirectoryInfo[] dirInfos = null;
try
{
//一般情況下,按正常方法獲取目錄列表
dirInfos = dirInfo.GetDirectorIEs();
}
catch { }
//如果不為空,那麼說明目錄列表成功,否則需要添加安全訪問規則
if (dirInfos != null)
return dirInfos;
//新建賬戶安全訪問規則
FileSysteMaccessRule fsRule = new FileSystemAccessRule(System.Environment.UserName
, FileSystemRights.Modify, AccessControlType.Allow);
//添加安全訪問規則
DirectorySecurity dirSecurity = dirInfo.GetAccessControl();
dirSecurity.AddAccessRule(fsRule);
dirInfo.SetAccessControl(dirSecurity);
try
{
dirInfos = dirInfo.GetDirectorIEs();
}
catch (Exception ex)
{
MessageBox.Show("無法訪問文件夾:" + dirInfo.FullName + "\n" + ex.Message);
}
//移除安全訪問規則
dirSecurity = dirInfo.GetAccessControl();
dirSecurity.RemoveAccessRule(fsRule);
dirInfo.SetAccessControl(dirSecurity);
return dirInfos;
}