Guide C# – Rinominare una serie di file

help-thumbMi è capitato per lavoro di dover rinominare con un certo criterio un grosso numero di file posizionati in diverse cartelle del disco rigido. Il criterio era quello di eliminare tutte le accentature, apostrofi o caratteri che impedissero di poter essere correttamente lette attraverso qualsiasi browser. Essendo che Windows è abbastanza carente in questo, ho pensato bene di creare un piccolo eseguibile a riga di comando in C# che mi aiutasse in questo.

Visto che c’ero ho inoltre aggiunto quest’applicazione (con qualche funzionalità in più), nella pagina relativa alle applicazioni, con eseguibile, installazione e codice sorgente a vostra disposizione (sotto licenza GNU GPL).

Per prima cosa chiedo all’utente tutte le cartelle su cui deve lavorare il programma e le salvo in una lista di DirectoryInfo:

List<directoryinfo> dirs = new List</directoryinfo><directoryinfo>();
DialogResult result = DialogResult.No;
string startuppath = Application.StartupPath;

bool addDir = true;

//finchè l'utente desidera aggiungere cartelle
while (addDir)
{
//avvio una finestra di dialogo che fa scegliere una nuova cartella
using (FolderBrowserDialog dialog = new FolderBrowserDialog())
{
//imposto il percorso iniziale in base a quello dell'ultima cartella scelta (o in alternativa il percorso del programma)
dialog.SelectedPath = startuppath;
result = dialog.ShowDialog();
//se l'utente ha cliccato ok
if (result == DialogResult.OK)
{
//aggiungo la cartella scelta alla lista
dirs.Add(new DirectoryInfo(dialog.SelectedPath));
//e salvo il percorso della cartella
startuppath = dialog.SelectedPath;
}
}
//chiedo all'utente se desidera aggiungere un'ulteriore cartella
Console.Write("Aggiungere una cartella? s/n ");
addDir = (Console.ReadLine() == "s" ? true : false);
}

A questo punto, prima di procedere, voglio controllare che nel frattempo non siano state eliminate delle cartelle tra quelle scelte, perchè all’interno di esse voglio creare una sotto-cartella nella quale andrò ad inserire i vari file rinominati:

//per ogni cartella selezionata
foreach (DirectoryInfo dir in dirs)
{
//se esiste
if (dir.Exists)
{
Console.WriteLine("Scelta la cartella: {0} - OK", dir.Name);
//e se non contiene già una sotto-cartella con il nome "Renamed"
if (!Directory.Exists(dir.FullName + "\\Renamed"))
{
//creo la sotto-cartella
Directory.CreateDirectory(dir.FullName + "\\Renamed");
Console.WriteLine("Creazione cartella destinazione - OK");
}
}
else
{
//altrimenti la cartella è stata eliminata da qualcuno
Console.WriteLine("Errore cartella: {0} - ERROR", dir.Name);
//e la elimino direttamente dalla lista
dirs.Remove(dir);
}
}

Adesso posso procedere con la rinomina dei file. Per fare questo ho creato una funzione a parte che a partire da un testo lo ripulisce di tutti quei caratteri che possono creare dei problemi ed infine converte la stringa in tutti caratteri minuscoli:

private static string CleanFileName(string fileName)
{
string newFileName = fileName.Replace(" ", String.Empty);
newFileName = newFileName.Replace('é', 'e');
newFileName = newFileName.Replace('è', 'e');
newFileName = newFileName.Replace('à', 'a');
newFileName = newFileName.Replace('á', 'a');
newFileName = newFileName.Replace('ò', 'o');
newFileName = newFileName.Replace('ó', 'o');
newFileName = newFileName.Replace('ì', 'i');
newFileName = newFileName.Replace('í', 'i');
newFileName = newFileName.Replace('ù', 'u');
newFileName = newFileName.Replace('ú', 'u');
newFileName = newFileName.Replace('-', '_');
newFileName = newFileName.Replace("+", String.Empty);
newFileName = newFileName.Replace("'", String.Empty);
newFileName = newFileName.ToLower();

return newFileName;
}

Ora rinomino tutti i file:

foreach (DirectoryInfo dir in dirs)
{
Console.WriteLine("-------------------------------------------------------------");
Console.WriteLine("  Gestione file dir: {0}", dir.Name);
Console.WriteLine("-------------------------------------------------------------");
foreach (FileInfo file in dir.GetFiles("*.jpg"))
{
string newFileName = CleanFileName(file.Name);

FileInfo nFile = file.CopyTo(dir.FullName + "\\Renamed\\" + newFileName, true);

//nFile.MoveTo(file.Name.Replace(" ", String.Empty));
Console.WriteLine("Rinominato {0} -> {1} - OK", file.Name, newFileName);
}
}

In questo modo abbiamo terminato la nostra mini-applicazione e avviandola potremo immediatamente pulire i nomi di tutti i file che desideriamo!

A presto wink emoticon

This entry was posted in Applicazioni, Linguaggi .Net, Programmazione and tagged , , , , , , . Bookmark the permalink.

2 Responses to Guide C# – Rinominare una serie di file

  1. Mte90 says:

    Io ho fatto un programma tempo temp addietro e in questi giorni esce la mia nuova versione, lo fatto in vb.net usando le stesse funzioni….
    Cmq mi scarico il sorgente ehehe

  2. Denis says:

    Mte90:

    Io ho fatto un programma tempo temp addietro e in questi giorni esce la mia nuova versione, lo fatto in vb.net usando le stesse funzioni….
    Cmq mi scarico il sorgente ehehe

    shocked emoticon shocked emoticon shocked emoticon

    eheh può capitare di trovarsi a fare le stesse cose, non ho dato un’occhiata al tuo programma, comunque io ho incentrato tutto sul procedurale a riga di comando, stile linux per intenderci, tranne la richiesta delle cartelle ok emoticon
    fammi sapere che ne pensi!

    A presto!

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>