ج#:كيفية التحقق مما إذا كان بإمكاني قراءة و/أو حذف الدليل

StackOverflow https://stackoverflow.com/questions/1604183

  •  05-07-2019
  •  | 
  •  

سؤال

أقوم بالتكرار عبر مجموعة من الدلائل بشكل متكرر.ومنهم (مثل D:\$RECYCLE.BIN\S-1-5-20) أعطني System.UnauthorizedAccessException.أفترض أنه يمكنني فقط اللحاق به والمضي قدمًا، لكنني أفضل معرفة ذلك مسبقًا.

لذلك، عندما يكون لدي DirectoryInfo هدف.كيف يمكنني معرفة ما إذا كان مسموحًا لي بذلك GetDirectories() و ربما Delete() هو - هي؟

هل كانت مفيدة؟

المحلول

إذا كنت تنوي حذفها، في محاولة لحذفه ومن ثم المضي قدما (التعامل مع استثناء حسب الاقتضاء).

إذا كنت تقوم بعملية فحص وآنذاك حذف-إذا-يجب أن يكون بين القادرين إلى حذف هناك فرصة لوجود حالة تعارض في نظام الملفات، ولكن طفيفة. وهذا ينطبق على معظم جميع عمليات الوصول إلى الملفات / الدليل. يتم تصميم معظم عمليات نظام الملفات لتكون الذري ونقل هذا المنطق إلى رمز المستخدم يتعارض هذا atomicity واحد من شأنه أن <م> لا تزال بحاجة للتعامل مع احتمال استثناء تثار.

نصائح أخرى

ولقد بنيت البرمجية التالية. من فضلك، معرفة ما اذا كان يساعد على:

//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 الحالي ضدهم قبل محاولة حذف دليل.

أعتقد أنك سوف تحتاج إلى كتابة بنفسك GetDirectories() طريقة؛الذي يحصل بشكل متكرر على ما بداخله.

هذه المادة مايكروسوفت يحتوي على مقالة جيدة حول كيفية القيام بذلك، مع قليل من العمل يمكنك تنظيفه لاستخدام القوائم العامة وجعلها مناسبة للحل الخاص بك.

ببساطة، سيفشل 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);
        }
    }

بمجرد حصولك على قائمة الأدلة الخاصة بك، يمكنك بعد ذلك تنفيذ العمليات عليها، مع بعض التعديلات، يجب أن تضمن الطريقة المذكورة أعلاه أن لديك أذونات القراءة على أي شيء في القائمة.

ولقد وجدت هذا في حين تحاول حل المشكلة ...

ويبدو ذات الصلة، ولكن كود غير المشرف عليها جدا، وأنا لم تحاول ذلك

HTTP: //technolog.nl/blogs/eprogrammer/archive/2009/06/18/Howto_3A00_-Properly-use-the-AccessCheck-API.aspx

وبالنسبة

وماريو

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top