2017-08-07 1 views
0

J'ai une structure de chemin qui ressemble à ceci:Comment compter le nombre de fichiers dans un sous-dossier avec un nom spécifique en utilisant C#?

Main_Folder 
     ***Sub_Folder1*** 
      **1) FOLDER_Y** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
       FolderN 
        picture1.png 
        picture2.png 
        picturen.png 
      **2) FOLDER_X** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
      **3) FOLDER_Z** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
    ***Sub_Folder2*** 
      **1) FOLDER_Y** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
       FolderN 
        picture1.png 
        picture2.png 
        picturen.png 
      **2) FOLDER_X** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
      **3) FOLDER_Z** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
    ***Sub_Folder3*** 
      **1) FOLDER_Y** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
       FolderN 
        picture1.png 
        picture2.png 
        picturen.png 
      **2) FOLDER_X** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
      **3) FOLDER_Z** 
       Folder1 
        picture1.png 
        picture2.png 
        picturen.png 
       Folder2 
        picture1.png 
        picture2.png 
        picturen.png 
> Desired mock output: 
> FOLDER_Y # files: 27 
> FOLDER_X # files: 18 
> FOLDER_Z # files: 18 

Je veux essentiellement l'utilisateur d'entrer un chemin vers le dossier principal , puis itérer à travers chaque sub_folder. Ensuite, affichez le nombre total de fichiers dans TOUS les dossiers de tous les sous-dossiers. Et la même chose pour Folder_X, Folder_Z.

J'ai essayé plusieurs méthodes sans succès.

public void getFOLDER_Y(string strPath) 
{ 
    string partialName = "FOLDER_Y"; 

    DirectoryInfo hdDirectoryInWhichToSearch = new DirectoryInfo(strPath); 
    FileInfo[] filesInDir = hdDirectoryInWhichToSearch.GetFiles("*" + partialName + "*.*"); 
    DirectoryInfo[] dirsInDir = hdDirectoryInWhichToSearch.GetDirectories("*" + partialName + "*.*"); 

    foreach (FileInfo foundFile in filesInDir) 
    { 
     string fullName = foundFile.FullName; 
     richtxt_results.Text += fullName + "\n"; 

    } 

    foreach (DirectoryInfo foundDir in dirsInDir) 
    { 
     string fullName = foundDir.FullName; 
     richtxt_results.Text += fullName + "\n"; 
    } 
} 

Répondre

5
public static void CountFiles(string path) 
    { 
     int xFileCount = 0; 
     int yFileCount = 0; 
     int zFileCount = 0; 

     var files = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories); 

     foreach(string file in files) 
     { 
      string folder = new DirectoryInfo(Path.GetDirectoryName(file)).Name; 
      if (folder == "FOLDER_X") 
       xFileCount++; 
      if (folder == "FOLDER_Y") 
       yFileCount++; 
      if (folder == "FOLDER_Z") 
       zFileCount++; 
     } 

     Console.WriteLine("X Files : {0}", xFileCount); 
     Console.WriteLine("Y Files : {0}", yFileCount); 
     Console.WriteLine("Z Files : {0}", zFileCount); 
    } 

Quelques conseils:

  • Si vous souhaitez rechercher un type spécifique de fichiers (disons, par exemple, seuls les fichiers texte), vous pouvez passer modèle de recherche à Directory.GetFiles(), comme ".txt" au lieu de ". *".
  • Si vous voulez rendre cela plus générique, au lieu de simplement coder en dur vos noms de dossier, vous pouvez le passer en paramètre.

Je voudrais vraiment utiliser cette fonction, et l'appeler avec ce nom du dossier que vous voulez:

public static int CountFiles(string path, string folderToSearch) 
    { 
     int fileCount = 0; 

     var files = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories); 

     foreach (string file in files) 
     { 
      string folder = new DirectoryInfo(Path.GetDirectoryName(file)).Name; 
      if (folder == folderToSearch) 
       fileCount++; 
     } 

     return fileCount; 
    } 

Ensuite, appelez-le comme suit:

static void Main(string[] args) 
    { 
     int xFiles = CountFiles("path goes here", "FOLDER_X"); 
     int yFiles = CountFiles("path goes here", "FOLDER_Y"); 
     int zFiles = CountFiles("path goes here", "FOLDER_Z"); 
    } 

EDIT: Fait un petit changement à la façon dont vous obtenez le nom du répertoire immédiat.

EDIT2: Edité pour intégrer la suggestion de @MickyD.

EDIT3: Cela répond à vos exigences les plus récentes.

public static int CountFiles2(string path, string folderToSearch) 
    { 
     int fileCount = 0; 
     var dirs = Directory.EnumerateDirectories(path, folderToSearch, SearchOption.AllDirectories).ToList(); 

     foreach (string dir in dirs) 
     { 
      var files = Directory.EnumerateFiles(dir, "*.*", SearchOption.AllDirectories); 
      if (files != null) 
       fileCount += files.Count(); 
     } 

     return fileCount; 
    } 
+2

** Note ** - vous devez utiliser EnumerateFiles ** ** lorsqu'ils traitent avec un grand nombre de fichiers en particulier avec les dossiers de l'enfant, car il renvoie un ** IEnumerable <> ** au lieu d'un tableau. – MickyD

+0

Je ne le savais pas et me semble être une information utile à connaître. Merci! – Sach

+0

Vous êtes le bienvenu bon monsieur :) – MickyD