142 votes

Liste de tous les fichiers et répertoires dans un répertoire + sous-répertoires

Je veux lister tous les fichiers et répertoires contenus dans un répertoire et les sous-répertoires de ce répertoire. Si je choisis C:\ comme répertoire, le programme obtiendra tous les noms de fichiers et de dossiers du disque dur auxquels il a accès.

Une liste pourrait ressembler à

fd\\1.txt
fd\\2.txt
fd\\a\\
fd\\b\\
fd\\a\\1.txt
fd\\a\\2.txt
fd\\a\\a\\
fd\\a\\b\\
fd\\b\\1.txt
fd\\b\\2.txt
fd\\b\\a
fd\\b\\b
fd\\a\\a\\1.txt
fd\\a\\a\\a\\
fd\\a\\b\\1.txt
fd\\a\\b\\a
fd\\b\\a\\1.txt
fd\\b\\a\\a\\
fd\\b\\b\\1.txt
fd\\b\\b\\a

2voto

Garry Points 21

J'utilise le code suivant avec un formulaire qui a 2 boutons, un pour la sortie et l'autre pour le démarrage. Un dialogue de navigation dans les dossiers et un dialogue d'enregistrement des fichiers. Le code est indiqué ci-dessous et fonctionne sur mon système Windows10 (64) :

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Directory_List
{

    public partial class Form1 : Form
    {
        public string MyPath = "";
        public string MyFileName = "";
        public string str = "";

        public Form1()
        {
            InitializeComponent();
        }    
        private void cmdQuit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }    
        private void cmdGetDirectory_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.ShowDialog();
            MyPath = folderBrowserDialog1.SelectedPath;    
            saveFileDialog1.ShowDialog();
            MyFileName = saveFileDialog1.FileName;    
            str = "Folder = " + MyPath + "\r\n\r\n\r\n";    
            DirectorySearch(MyPath);    
            var result = MessageBox.Show("Directory saved to Disk!", "", MessageBoxButtons.OK);
                Application.Exit();    
        }    
        public void DirectorySearch(string dir)
        {
                try
            {
                foreach (string f in Directory.GetFiles(dir))
                {
                    str = str + dir + "\\" + (Path.GetFileName(f)) + "\r\n";
                }    
                foreach (string d in Directory.GetDirectories(dir, "*"))
                {

                    DirectorySearch(d);
                }
                        System.IO.File.WriteAllText(MyFileName, str);

            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

2voto

Reznicencu Bogdan Points 623

C'est une bonne approche car la structure référencée serait remplie de diverses données telles que AlternativeName, LastTmeCreated, modified, attributs, etc .

Mais comme vous utilisez .net framework, vous devez entrer dans la zone non gérée.

2voto

brainoverflow98 Points 389

Une version améliorée avec un niveau maximum pour descendre dans le répertoire et une option pour exclure des dossiers :

using System;
using System.IO;

class MainClass {
  public static void Main (string[] args) {

    var dir = @"C:\directory\to\print";
    PrintDirectoryTree(dir, 2, new string[] {"folder3"});
  }

  public static void PrintDirectoryTree(string directory, int lvl, string[] excludedFolders = null, string lvlSeperator = "")
  {
    excludedFolders = excludedFolders ?? new string[0];

    foreach (string f in Directory.GetFiles(directory))
    {
        Console.WriteLine(lvlSeperator+Path.GetFileName(f));
    } 

    foreach (string d in Directory.GetDirectories(directory))
    {
        Console.WriteLine(lvlSeperator + "-" + Path.GetFileName(d));

        if(lvl > 0 && Array.IndexOf(excludedFolders, Path.GetFileName(d)) < 0)
        {
          PrintDirectoryTree(d, lvl-1, excludedFolders, lvlSeperator+"  ");
        }
    }
  }
}

répertoire d'entrée :

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
      file6.txt
  -folder3
    file3.txt
  -folder4
    file4.txt
    file5.txt

sortie de la fonction (le contenu du dossier 5 est exclu en raison de la limite de niveau et le contenu du dossier 3 est exclu parce qu'il est dans le tableau des dossiers exclus) :

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
  -folder3
  -folder4
    file4.txt
    file5.txt

1voto

Une réponse tardive, mais je pense que quelqu'un pourrait en bénéficier. Un démarreur de version itératif basé sur la pile avec un support pour la gestion des erreurs et le retour des chemins relatifs :

private static IEnumerable<string> TryEnumerate(Func<IEnumerable<string>> action)
{
    try
    {
        return action.Invoke();
    }
    catch
    {
       //TODO logging
       return Enumerable.Empty<string>();
    }
}

private static IEnumerable<string> FindFilesAndDirectories(string dir, bool returnRelativePaths = false, string filePattern="*.*")
{
    var searchStack = new Stack<string>();
    searchStack.Push(dir);
    var initialDirectory = new DirectoryInfo(dir).FullName;
    var initialDirLength = initialDirectory.Length;

    while (searchStack.Count > 0)
    {
        var currentDirectory = searchStack.Pop();

        yield return (returnRelativePaths && 
                string.Compare(currentDirectory, initialDirectory, StringComparison.OrdinalIgnoreCase) != 0) ? 
                 currentDirectory.Substring(initialDirLength) : currentDirectory;

        foreach (var file in TryEnumerate(() =>
                 Directory.EnumerateFiles(currentDirectory, filePattern)))
        {
            yield return returnRelativePaths ? file.Substring(initialDirLength) : file;
        }

        foreach (var directory in TryEnumerate(() =>
                 Directory.EnumerateDirectories(currentDirectory, filePattern)))
        {
            searchStack.Push(directory);
        }
    }
}

static void Main(string[] args)
{
    foreach (var result in FindFilesAndDirectories(@"c:\", true))
    {
        Console.WriteLine(result);
    }
}

0voto

aah Points 35
using System.IO;
using System.Text;
string[] filePaths = Directory.GetFiles(@"path", "*.*", SearchOption.AllDirectories);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X