2016-10-26 8 views
1

Hier ist mein Code:Gehen Sie durch jeden Ordner mit GetDirectory

private static bool checkifDirectoryContainsFilesWithSpecifiedExtention(string path, string fileExestention) //Like C:\\smth, *.html 
    {   
      foreach (string f in Directory.GetFiles(path,fileExestention)) 
      { 
       return true; 
      } 
      foreach (string d in Directory.GetDirectories(path)) 
      { 
       return checkifDirectoryContainsFilesWithSpecifiedExtention(d,fileExestention); 
      } 
      return false; 
    } 

In dieser Funktion kehrt das Programm jede Datei mit dem angegebenen extention aber wenn ich nur eine Datei mit der angegebenen Erweiterung im letzten Ordner enthalten, die Funktion false zurückgibt, was keinen Sinn macht, weil es

Meine Frage besteht, ist, warum es das tut ...

es ausprobieren. Ich kann den Fehler nicht wirklich finden.

+0

Können Sie zeigen **, wie Sie ** solche Funktion aufgerufen? –

Antwort

0

dies in einer Abfrage LINQ

private static bool CheckifDirectoryContainsFilesWithSpecifiedExtention(string path, string fileExestention) 
     //Like C:\\smth, *.html 
    { 
     return Directory.GetFiles(path, fileExestention).Any() || 
       Directory.GetDirectories(path) 
         .Select(d => CheckifDirectoryContainsFilesWithSpecifiedExtention(d, fileExestention)) 
         .FirstOrDefault(); 
    } 

es mit auf die ein paar Debug-Ordner Versuchte Turned * .exe als Maske und es gibt true zurück. Es durchläuft auch Unterordner. Nicht sicher, was du mit einer Datei im letzten Ordner meinst.

Sehen Sie, ob es für Sie arbeitet.

1

Das Problem ist die "Rückkehr" innerhalb der foreach (Zeichenfolge d in Directory.GetDirectories (Pfad)) Schleife. Es wird nur das erste Verzeichnis pro Level überprüft. Sie müssen so etwas wie dieses (nicht schön, aber Ihre Art/Format zu halten)

bool ok = false; 
foreach (string d in Directory.GetDirectories(path)) 
{ 
    ok = ok || checkifDirectoryContainsFilesWithSpecifiedExtention(d, 
     fileExestention); 
} 
return ok; 

Noch besser wäre es, verwenden Sie die Linq, die Marc zur Verfügung gestellt.

0

funktioniert dies für mich

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace StackOverflowSnippets 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      String path = @"C:\smth"; String pattern = "*.html"; 

      Console.WriteLine("__" + checkifDirectoryContainsFilesWithSpecifiedExtention(path, pattern)); 

      Console.ReadLine(); 
     } 

     private static bool checkifDirectoryContainsFilesWithSpecifiedExtention(string path, string fileExestention) //Like C:\\smth, *.html 
     { 
      foreach (string f in Directory.GetFiles(path, fileExestention)) 
      { 
       return true; 
      } 
      foreach (string d in Directory.GetDirectories(path)) 
      { 
       if (checkifDirectoryContainsFilesWithSpecifiedExtention(Path.Combine(path, d), fileExestention)) 
       { 
        return true; 
       } 
      } 

      return false; 
     } 
    } 
} 
Verwandte Themen