Najważniejsza zasada podczas wyszukiwania w folderze, który potencjalnie zawiera niedostępnych podfolder jest:
Czy NIE korzystanie SearchOption.AllDirectories
!
Zastosowanie SearchOption.TopDirectoryOnly
zamiast połączeniu z rekurencyjnego wyszukiwania dla wszystkich dostępnych katalogów.
Korzystanie z naruszenia dostępu spowoduje przerwanie całej pętli nawet przed przetworzeniem pliku/katalogu. Ale jeśli używasz SearchOption.TopDirectoryOnly
, pomijasz tylko to, co jest niedostępne.
Istnieje trudniejszy sposób użycia Directory.GetAccessControl()
na sprawdzenie katalogu podrzędnego, aby sprawdzić, czy masz dostęp do katalogu przed rozdaniem (ta opcja jest raczej trudna - nie polecam tego, chyba że wiesz dokładnie, jak to zrobić system działa).
Dla rekurencyjnego wyszukiwania, mam ten kod realizowane na własny użytek:
public static List<string> GetAllAccessibleDirectories(string path, string searchPattern) {
List<string> dirPathList = new List<string>();
try {
List<string> childDirPathList = Directory.GetDirectories(path, searchPattern, SearchOption.TopDirectoryOnly).ToList(); //use TopDirectoryOnly
if (childDirPathList == null || childDirPathList.Count <= 0) //this directory has no child
return null;
foreach (string childDirPath in childDirPathList) { //foreach child directory, do recursive search
dirPathList.Add(childDirPath); //add the path
List<string> grandChildDirPath = GetAllAccessibleDirectories(childDirPath, searchPattern);
if (grandChildDirPath != null && grandChildDirPath.Count > 0) //this child directory has children and nothing has gone wrong
dirPathList.AddRange(grandChildDirPath.ToArray()); //add the grandchildren to the list
}
return dirPathList; //return the whole list found at this level
} catch {
return null; //something has gone wrong, return null
}
}
ten sposób można nazwać
List<string> accessibleDirs = GetAllAccessibleDirectories(myrootpath, "*");
Potem trzeba tylko poszukać/dodać pliki między wszystkie katalogi dostępne.
Uwaga: to pytanie jest dość ciekawe: klasyczna. Sądzę, że istnieją również inne lepsze rozwiązania.
A w przypadku istnieją pewne katalogi które szczególnie chcą uniknąć po odebraniu wszystkich dostępnych katalogów, można również filtrować wyniki List
przez LINQ wykorzystując część nazwy podkatalogu jako słowa kluczowego (tj Recycle.Bins
).
To oczywiste, że nie powinieneś wchodzić w tę TRASĘ. – Hemal
po prostu przeszukując *** wszystkie katalogi w katalogu d: *** doprowadzi do ** wielu ** folderów systemowych, do których normalne konta użytkowników nie powinny mieć dostępu, a dostaniesz taki dostęp odmówiono. – Claies
Nie mam kosza na dysku. Właśnie szukam folderu lub pliku. Rozumiem, że nie powinniśmy iść do kosza. Daj mi znać, jak przynajmniej staram się unikać wyszukiwania w koszu. –