2011-05-21 6 views
2

J'essaye d'écrire une application de console C# qui lit récursivement un certain dossier. Dans ces dossiers sont des milliers d'images .jpgComment lister récursivement tous les fichiers dans un répertoire en C# et copier tous les fichiers dans un autre répertoire

La structure du dossier est très profond dans certains niveaux et un exemple ressembler à ceci:

Scc-LocalPhoto/testfiles/1997/JAN-JUN 1997/avril 1997/7.4.97 - 11.04.97/FRI11.4.97/

Comme vous pouvez voir la structure du dossier est tout à fait désordre, mais je ne contrôle pas cela.

Ma tâche est de lire tous les dossiers. Rétractez les métadonnées des images et stockez-les dans un fichier XML. Je dois ensuite copier tous les dossiers dans la même mise en page et les coller dans un nouveau dossier.

Je pense que je serai capable de lire tous les répertoires et d'extraire les méta-données des images et de les enregistrer dans un fichier xml.

Ce que je ne sais pas comment faire est de copier et passé tous les dossiers et les images et les coller dans un nouveau répertoire en conservant la même structure de dossiers.

Est-ce que quelqu'un sait d'une manière efficace pour effectuer cette tâche ou est-il un projet, le code disponible que je pourrais utiliser comme point de départ. Je suis relativement nouveau aux applications de console d'écriture et de C#. Merci pour votre temps.

Répondre

2

Parsing Annuaires récursive

static void ParseDirectories(string root) 
{ 
    ProcessDirectory(new DirectoryInfo(root)); 

    string[] subDirectories = Directory.GetDirectories(root); 

    // No more directories to explore 
    if (subDirectories.Length == 0) 
     return; 

    foreach (string subDirectory in subDirectories) 
    { 
     ParseDirectories(subDirectory); 
    } 
} 

Traitement des fichiers dans un répertoire

static void ProcessDirectory(DirectoryInfo directory) 
{ 
    foreach (FileInfo file in directory.EnumerateFiles("*.jpg") 
    { 
     // record metadata and do other work on each file here 
    } 
} 

Copier un répertoire

static void CopyDirectoryTree(DirectoryInfo source, DirectoryInfo dest) 
{ 
    if (!Directory.Exists(dest.FullName)) 
     Directory.CreateDirectory(dest.FullName); 

    bool overwrite = true; 

    // Copy files 
    foreach (FileInfo file in source.EnumerateFiles()) 
    { 
     file.CopyTo(Path.Combine(dest.ToString(), file.Name), overwrite); 
    } 

    // Copy Sub-directories 
    foreach (DirectoryInfo subDirectory in source.GetDirectories()) 
    { 
     DirectoryInfo newDirectory = destination.CreateSubdirectory(subDirectory.Name); 
     CopyDirectoryTree(subDirectory, newDirectory); 
    } 
} 

Exemple d'utilisation

static void Main(string[] args) 
{ 
    // Process each directory 
    string initialDirectory = @"C:\path_to_folder"; 
    ParseDirectories(initialDirectory); 

    // Copy directory tree 
    string destinationDirectory = @"C:\path_to_new_root_directory"; 
    CopyDirectoryTree(
     new DirectoryInfo(initialDirectory), 
     new DirectoryInfo(destinationDirectory)); 
} 

Hope this helps!

+0

Avez-vous eu @ Jason un peu de chance avec ça? – aligray

+0

Ce code fonctionne un régal. Merci aligray. Mes excuses pour le delap de revenir à vous. Merci pour votre temps et votre aide. Très appréciée. – Jason

0

Puis-je suggérer ce qui suit, qui est, à mon avis, un peu plus simple

public static void CopyFolderTree(string sourcePath, string targetPath) 
{ 
    var sourceDir = new DirectoryInfo(sourcePath); 
    var targetDir = new DirectoryInfo(targetPath); 

    targetDir.Create(); 

    foreach(var file in sourceDir.GetFiles()) 
     file.CopyTo(Path.Combine(targetPath, file.Name), true); 

    foreach(var subfolder in sourceDir.GetDirectories()) 
     CopyFolderTree(subfolder.FullName, Path.Combine(targetPath, subfolder.Name)); 
} 
Questions connexes