سؤال

أنا باستخدام DirectoryInfo.GetDirectories() بشكل متكرر إلى العثور على كافة الدلائل الفرعية تحت مسار معين.ومع ذلك أريد أن استبعاد مجلدات النظام و هناك لا توجد طريقة واضحة على ذلك.في FindFirstFile/FindNextFile كانت الأمور أكثر وضوحا مع الصفات.

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

المحلول

@rslite هو الحق،.صافي لا تعطي هذه التصفية خارج المربع ، ولكن ليس من الصعب تنفيذ:

static IEnumerable<string> GetNonSystemDirs(string path)
{
    var dirs = from d in Directory.GetDirectories(path)
               let inf = new DirectoryInfo(d)
               where (inf.Attributes & FileAttributes.System) == 0
               select d;

    foreach (var dir in dirs)
    {
        yield return dir;
        foreach (var subDir in GetNonSystemDirs(dir))
        {
            yield return subDir;
        }
    }
}

MSDN الروابط:

FileSystemInfo.سمات الملكية

FileAttributes التعداد

نصائح أخرى

هذا هو مثال عظيم من سيناريو حيث Linq و أساليب الإرشاد جعل الأمور حقا نظيفة وسهلة.

public static DirectoryInfo[] GetNonSystemDirectories(
    this DirectoryInfo directory,
    string searchPattern,
    SearchOption searchOption)
{
    return directory.GetDirectories(searchPattern, searchOption)
        .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0)
        .ToArray();
}

إذا كنت بناء .net v2 التطبيق ثم يمكنك استخدام LinqBridge لإعطاء لك الوصول إلى جميع باردة Linq إلى كائنات الطرق (مثل فيها() و ToArray() أعلاه).

تحرير

في .صافي v4 كنت تستخدم EnumerateDirectories بدلا من GetDirectories والذي يسمح لك أن تكرار عبر النتائج دون بناء المصفوفة في الذاكرة الأولى.

public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
    this DirectoryInfo directory,
    string searchPattern,
    SearchOption searchOption)
{
    return directory.EnumerateDirectories(searchPattern, searchOption)
        .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}

كنت على الارجح الى حلقة من خلال النتائج و رفض تلك السمات التي لا تريد (استخدام الخاصية سمات).

تستخدم في نهاية المطاف الحلو Linq

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top