Se avete bisogno di recuperare l'elenco dei file contenuti in una directory ordinati, ad esempio, in base alla dimensione o alla data di creazione, e magari applicando più filtri (ad esempio: *.jpg e *.gif), utilizzate la classe DirectoryHelper qui esposta:
public sealed class DirectoryHelper
{
///
/// Determina il tipo di ordinamento da eseguire
///
public enum SortType
{
MinToMax,
MaxToMin
}
///
/// Esegue l'ordinamento in base alla proprietà passata al costruttore
///
private class FileCompare : IComparer
{
string _property = "FullName"; // ordinamento di default
SortType _sortType = SortType.MinToMax; // tipo di ordinamento di default
#region Costruttori
///
/// Costruttore di default
///
public FileCompare() {}
///
/// Imposta la proprietà da utilizzare per l'ordinamento
///
///
public FileCompare(string property):this()
{
_property = property;
}
///
/// Imposta la proprietà e il tipo di ordinamento da eseguire
///
///
///
public FileCompare(string property, SortType sortType):this(property)
{
_sortType = sortType;
}
#endregion
///
/// Esegue il confronto tra due oggetti
///
///
///
///
// Implementazione dell'interfaccia IComparer.Compare
int IComparer.Compare( Object x, Object y )
{
// Ricavo il tipo FileInfo
Type fi = typeof(FileInfo);
// Invoco dinamicamente la proprietà richiesta per
// l'ordinamento sui due oggetti da confrontare
object a = fi.InvokeMember(_property, BindingFlags.GetProperty, null, (FileInfo)x, null);
object b = fi.InvokeMember(_property, BindingFlags.GetProperty, null, (FileInfo)y, null);
// Eseguo il confronto in base al tipo di ordinamento scelto
if (_sortType==SortType.MinToMax)
{
return( (new CaseInsensitiveComparer()).Compare( a, b ) );
}
else
{
return( (new CaseInsensitiveComparer()).Compare( b, a ) );
}
}
}
///
/// Restituisce un elenco ordinato di file sulla base di filtri multipli.
///
///
///
///
public static FileInfo[] GetFiles(string directory, string[] filters, string sortBy)
{
// Istanzio l'oggetto Directory
DirectoryInfo dir = new DirectoryInfo(directory);
// Creo un array con i file risultato dei diversi filtri applicati
ArrayList al = new ArrayList();
foreach(string filter in filters) al.AddRange(dir.GetFiles(filter));
// Eseguo l'ordinamento sulla base del parametro sortBy
al.Sort(new FileCompare(sortBy));
// Eseguo l'unboxing dell'array nel tipo FileInfo
return (FileInfo[])al.ToArray(typeof(FileInfo));
}
}
utilizzabile così:
string[] filters = {"*.jpg", "*.jpeg", "*.gif"};
FileInfo[] files = DirectoryHelper.GetFiles(sPath, filters, "FullName");
ovviamente il codice può essere migliorato (purtroppo DirectoryInfo è sealed)...ma è un buon inizio!!!
bye