Belirli bir yol altındaki tüm alt dizinleri bulmak için DirectoryInfo.GetDirectories()
özyineleminde kullanıyorum. Bununla birlikte, Sistem klasörlerini hariç tutmak istiyorum ve bunun net bir yolu yok. FindFirstFile/FindNextFile öğelerinde, öznitelikler daha açıktı.DirectoryInfo.GetDirectories() ve özellikleri
6
A
cevap
8
@rslite NET dışı kutu Böyle bir süzme vermez, haklı, ama uygulamak zor değil:
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 bağlantılar:
0
Muhtemelen sonuçlardan geçmeli ve istemediğiniz niteliklere sahip olanları reddetmelisiniz (Öznitelikler özelliğini kullanın).
3
Bu, Linq ve uzantı yöntemlerinin işleri gerçekten temiz ve kolay hale getirdiği bir senaryonun mükemmel bir örneğidir. Bir .net v2 uygulama inşa ediyorsanız
public static DirectoryInfo[] GetNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.GetDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0)
.ToArray();
}
, o zaman (Nerede() ve ToArray() Yukarıdaki gibi) nesneler yöntemlere tüm serin Linq erişiminizi sağlamak LinqBridge kullanabilirsiniz.
.net Düzen
Eğer ilk hafızada bir dizi oluşturulmadan sonuçlarına tekrarlatacak sağlayan yerine GetDirectories ait EnumerateDirectories kullanmayı tercih ediyorum v4.
public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.EnumerateDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}
0
ondan Öznitelikler'i nasıl elde edersiniz, nihai Sweet Linq
IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
Directory.GetDirectories dizeleri döndürür kullanarak? :) – aku
@aku Directory.GetDirectories statik yöntemini değil DirectoryInfo.GetDirectories örnek yöntemini kullanıyorum. –
Verim iadesi kullanarak gerçek bir yinelemeli yineleyici oluşturmak kadar verimli/kullanılabilir değil. SearchOption.AllDirectories kullanarak büyük dizin hiyerarşileri çok iyi değil. – Ash