130834
Goto Top

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:

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

Content-Key: 352384

Url: https://administrator.de/contentid/352384

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: emeriks
emeriks 20.10.2017 um 16:38:45 Uhr
Goto Top
Hi,
auf die Schnelle
if (!Program.dir_filter.Any(temp.Contains))
Was soll dieses ".contains" am "temp"?

OK, C# ist jetzt nicht meine Domäne, aber C# nutzt .Net. Und da sieht mir diese Zeile nun mal was fragwürdig aus.

E.
Mitglied: 130834
130834 20.10.2017 aktualisiert um 19:25:26 Uhr
Goto Top
Das .Contains gibt den bool für das IF-Statement zurück.
Also, If(Wert1(Wert2 enthält?[false/true])

lg clragon
Mitglied: emeriks
emeriks 20.10.2017 um 19:19:01 Uhr
Goto Top
OK, danke. Habs gerade nachgestellt. Funktioniert so. face-smile
Mitglied: 130834
130834 25.12.2017 um 10:47:49 Uhr
Goto Top
Beitrag geschlossen, ohne Antwort.

lg clragon