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

Printed on: May 6, 2024 at 23:05 o'clock

Member: emeriks
emeriks Oct 20, 2017 at 14:38:45 (UTC)
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 Oct 20, 2017 updated at 17:25:26 (UTC)
Goto Top
Das .Contains gibt den bool für das IF-Statement zurück.
Also, If(Wert1(Wert2 enthält?[false/true])

lg clragon
Member: emeriks
emeriks Oct 20, 2017 at 17:19:01 (UTC)
Goto Top
OK, danke. Habs gerade nachgestellt. Funktioniert so. face-smile
Mitglied: 130834
130834 Dec 25, 2017 at 09:47:49 (UTC)
Goto Top
Beitrag geschlossen, ohne Antwort.

lg clragon