我循環遍歷一堆目錄。其中一些(如D:\ $ RECYCLE.BIN \ S-1-5-20)給我一個System.UnauthorizedAccessException
。我想我可以抓住它並繼續前進,但我寧願提前解決它。C#:如何檢查我是否可以讀取和/或刪除目錄
所以,當我有一個DirectoryInfo
對象。我怎麼看我是否被允許GetDirectories()
和可能的Delete()
呢?
我循環遍歷一堆目錄。其中一些(如D:\ $ RECYCLE.BIN \ S-1-5-20)給我一個System.UnauthorizedAccessException
。我想我可以抓住它並繼續前進,但我寧願提前解決它。C#:如何檢查我是否可以讀取和/或刪除目錄
所以,當我有一個DirectoryInfo
對象。我怎麼看我是否被允許GetDirectories()
和可能的Delete()
呢?
如果您打算刪除它,請嘗試刪除它,然後繼續(根據需要處理異常)。
如果您執行檢查後再刪除(如果應該可以刪除),則文件系統上存在競爭條件的可能性很小。這適用於大多數文件/目錄訪問操作。大多數文件系統操作被設計爲原子性的,並且將該邏輯移入用戶代碼中會衝突這種原子性,並且還有一個仍需需要處理可能引發的異常。
我相信你需要編寫自己的GetDirectories()
方法;那是遞歸地得到它裏面的。
This Microsoft Article有關於如何做到這一點的好文章,通過一些工作,您可以清理它以使用通用列表並使其適合您的解決方案。
簡而言之,System.IO.Directory.GetDirectories()每次遇到這些異常時都會失敗。
代碼大致是這樣的(從上面複製)應該讓你開始
List<String> directories = new List<String>();
void DirSearch(string sDir)
{
try
{
foreach (string d in Directory.GetDirectories(sDir))
{
//foreach (string f in Directory.GetFiles(d, txtFile.Text))
//{
//
//}
// use this to search for files recursivly.
directories.Add(d);
DirSearch(d);
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
}
一旦你有你的目錄列表,那麼你就可以對其進行操作,一些MODS上面的方法應該保證你有讀取列表中任何內容的權限。
我構建了以下代碼。拜託,看看是否有幫助:
//using System.IO;
//using System.Security.AccessControl;
//using System.Security.Principal;
string[] directories = Directory.GetDirectories(
Path.Combine(Environment.CurrentDirectory, @"..\.."),
"*", SearchOption.AllDirectories);
foreach (string directory in directories)
{
DirectoryInfo info = new DirectoryInfo(directory);
DirectorySecurity security = info.GetAccessControl();
Console.WriteLine(info.FullName);
foreach (FileSystemAccessRule rule in
security.GetAccessRules(true, true, typeof(NTAccount)))
{
Console.WriteLine("\tIdentityReference = {0}", rule.IdentityReference);
Console.WriteLine("\tInheritanceFlags = {0}", rule.InheritanceFlags);
Console.WriteLine("\tPropagationFlags = {0}", rule.PropagationFlags);
Console.WriteLine("\tAccessControlType = {0}", rule.AccessControlType);
Console.WriteLine("\tFileSystemRights = {0}", rule.FileSystemRights);
Console.WriteLine();
}
}
結果:
D:\Projects\ConsoleApplication1\bin IdentityReference = BUILTIN\Administrators InheritanceFlags = ContainerInherit, ObjectInherit PropagationFlags = None AccessControlType = Allow FileSystemRights = FullControl
注意IdentityReference
和FileSystemRights
性能;可能你應該在嘗試刪除一個目錄之前先測試一下你當前的ACL。
我不與Windows安全工作了很多(好吧,根本沒有),所以你可以詳細說明我可以檢查當前用戶(WindowsIdentity.GetCurrent())是否可以刪除目錄中的文件?非常感謝您的幫助 – 2011-02-10 20:19:28
我發現這個在試圖解決這個問題...
似乎有關,但相當無人維護的代碼,我沒有嘗試
問候
馬里奧
同意......再加上,在刪除之前檢查每個文件夾的刪除權似乎是處理偶爾出現的異常情況(如果沒有刪除權限是例外而不是規則)。 – 2009-10-21 23:33:28
問題是我首先得到目錄,然後在所有這些目錄上調用相同的方法。然後我檢查目錄是否爲空,如果是,我嘗試刪除它。換句話說,它首先是讀取,然後可能是刪除,取決於目錄是否仍爲空。 – Svish 2009-10-21 23:36:05
@pjabbott,我想這是一個很好的觀點。也許我只會處理異常。一些我可能應該以任何方式... – Svish 2009-10-21 23:41:15