2010-07-27 1 views
2

Je n'ai pas beaucoup d'expérience avec regexes et je voulais rectifier cela. J'ai décidé de construire une application qui prend un nom de répertoire, scanne tous les fichiers (que tous ont un numéro de série de plus en plus, mais diffèrent subtilement dans leurs noms de fichiers. Exemple: episode01.mp4, episode_02.mp4, episod03.mp4, episode04.rmvb etc.)trouver un nombre dans le nom de fichier en utilisant regex

L'application doit analyser le répertoire, trouver le numéro dans chaque nom de fichier et renommer le fichier avec l'extension à un format commun (episode01.mp4, episode02.mp4, episode03.mp4, episode04.rmvb etc.).

J'ai le code suivant:

Dictionary<string, string> renameDictionary = new Dictionary<string,string>(); 
DirectoryInfo dInfo = new DirectoryInfo(path); 
string newFormat = "Episode{0}.{1}"; 
Regex regex = new Regex(@".*?(?<no>\d+).*?\.(?<ext>.*)"); //look for a number(before .) aext: *(d+)*.* 
foreach (var file in dInfo.GetFiles()) 
{ 
    string fileName = file.Name; 
    var match = regex.Match(fileName); 
    if (match != null) 
    { 
    GroupCollection gc = match.Groups; 
    //Console.WriteLine("Number : {0}, Extension : {2} found in {1}.", gc["no"], fileName,gc["ext"]); 
    renameDictionary[fileName] = string.Format(newFormat, gc["no"], gc["ext"]); 
    } 
} 
foreach (var renamePair in renameDictionary) 
{ 
    Console.WriteLine("{0} will be renamed to {1}.", renamePair.Key, renamePair.Value); 
    //stuff for renaming here 
} 

Un problème dans ce code est qu'il inclut également les fichiers qui ne sont pas des numéros dans le renameDictionary. Il serait également utile si vous pourriez signaler d'autres pièges que je devrais faire attention.

PS: Je suppose que les noms de fichiers ne contiendront des numéros correspondant aux numéros de série (rien cam7_0001.jpg)

Répondre

1

Cette solution la plus simple est probablement d'utiliser Path.GetFileNameWithoutExtension pour obtenir le nom de fichier, puis le regex \d+$ pour obtenir le numéro à sa fin (ou Path.GetExtension et \d+ pour obtenir le numéro n'importe où).

Vous pouvez également atteindre cet objectif en une seule remplacer:

Regex.Replace(fileName, @".*?(\d+).*(\.[^.]+)$", "Episode$1$2") 

Ce regex est un peu mieux, en ce sens qu'elle force l'extension de ne pas contenir des points.

Questions connexes