
130834
20.10.2017, aktualisiert um 20:50:35 Uhr
Unterbruch rekursiver Funktion durch Blacklist (C-Sharp)
Hallo liebe Mit-Forum-Administratoren!
Ich bin auf ein pikantes Problem gestoßen dessen Lösung sich mir nicht von alleine erschließen will.
Folgendes ist Sache. In meinem neusten C# Projekt benutze ich eine Klasse namentlich FindFiles welche ich modifizieren wollte um
einen Filter für bestimmte Strings einzubauen.
Sieht in etwa so aus:
Dann ist mir aufgefallen: Rufe ich diese Klasse mit dem Pfad C:\, *.*, Rekursiv wahr und einem Filter der in etwa "Recycle.Bin" enthält,
ist der Output davon etwa 3 Zeilen lang. Nehme ich das Recycle raus, sind es eher so 6000 Zeilen.
Da der Ordner $Recycle.Bin sollte eigentlich übersprungen werden, also die Funktion soltle sich nicht selber damit aufrufen sondern mit dem nächsten Ordner fortfahren.
Tut sie aber nicht. Sobald Recycle.Bin gefunden wird, wird die ganze Durchsuchung von C:\ abgebrochen. Warum?
Hilfe wird geschätzt, noch einen schönen Nachmittag
lg clragon
Ich bin auf ein pikantes Problem gestoßen dessen Lösung sich mir nicht von alleine erschließen will.
Folgendes ist Sache. In meinem neusten C# Projekt benutze ich eine Klasse namentlich FindFiles welche ich modifizieren wollte um
einen Filter für bestimmte Strings einzubauen.
Sieht in etwa so aus:
class FindFiles
{
// Wird mit Pfad, File-Vorlage ( zb *.txt ) uns rekursive - bool aufgerufen
public static IEnumerable<String> FindAccessableFiles(string path, string file_pattern, bool recurse)
{
Console.WriteLine(path);
var list = new List<string>();
var required_extension = "mp4";
// if input is file do break
if (File.Exists(path))
{
yield return path;
yield break;
}
// if input is not reachable do break
if (!Directory.Exists(path))
{
yield break;
}
// check if file pattern was given else use default
if (null == file_pattern)
file_pattern = "*." + required_extension;
var top_directory = new DirectoryInfo(path);
// Enumerate the files just in the top directory.
IEnumerator<FileInfo> files;
try
{
files = top_directory.EnumerateFiles(file_pattern).GetEnumerator();
}
catch (Exception)
{
files = null;
}
while (true)
{
FileInfo file = null;
try
{
if (files != null && files.MoveNext())
file = files.Current;
else
break;
}
catch (UnauthorizedAccessException)
{
continue;
}
catch (PathTooLongException)
{
continue;
}
yield return file.FullName;
}
if (!recurse)
yield break;
IEnumerator<DirectoryInfo> dirs;
try
{
dirs = top_directory.EnumerateDirectories("*").GetEnumerator();
}
catch (Exception)
{
dirs = null;
}
while (true)
{
DirectoryInfo dir = null;
try
{
if (dirs != null && dirs.MoveNext())
{
// filtering dirs who contain string
// dir_filter ist ein static public array der in der main class gesetzt wird.
// Hier entsteht das Problem <-
// Enthält der Ordner-Name eines dieser Strings in dem Fall Recycle.Bin sollte mit dem nächsten Ordner fortgefahren werden
// Mit allen Ordnern die nicht direkt Unterordner von C:\ sind funktioniert das offenbar
if (!Program.dir_filter.Any(dirs.Current.FullName.Contains))
{
// passing dir on to recursive function
dir = dirs.Current;
}
else
{
break;
}
}
else
break;
}
catch (UnauthorizedAccessException)
{
continue;
}
catch (PathTooLongException)
{
continue;
}
foreach (var subpath in FindAccessableFiles(dir.FullName, file_pattern, recurse))
yield return subpath;
}
}
Dann ist mir aufgefallen: Rufe ich diese Klasse mit dem Pfad C:\, *.*, Rekursiv wahr und einem Filter der in etwa "Recycle.Bin" enthält,
ist der Output davon etwa 3 Zeilen lang. Nehme ich das Recycle raus, sind es eher so 6000 Zeilen.
Da der Ordner $Recycle.Bin sollte eigentlich übersprungen werden, also die Funktion soltle sich nicht selber damit aufrufen sondern mit dem nächsten Ordner fortfahren.
Tut sie aber nicht. Sobald Recycle.Bin gefunden wird, wird die ganze Durchsuchung von C:\ abgebrochen. Warum?
Hilfe wird geschätzt, noch einen schönen Nachmittag
lg clragon
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 352384
Url: https://administrator.de/forum/unterbruch-rekursiver-funktion-durch-blacklist-c-sharp-352384.html
Ausgedruckt am: 24.05.2025 um 23:05 Uhr
4 Kommentare
Neuester Kommentar