Nella gestione dei file e delle directory, in System.IO, si utilizzano principalmente: File, FileInfo, Directory, Directory Info e la DriveInfo. La DriveInfo è bella perchè da un sacco di informazioni sul disco:
DriveInfo d = new DriveInfo("d:\\");
String info = "Drive: " + d.Name +
"Drive Format " + d.DriveFormat +
"\nDrive Type " + d.DriveType +
"\nVolume " + d.VolumeLabel +
"\nTotal Size " + d.TotalSize.ToString() +
"\nAvailable FreeSpace " + d.AvailableFreeSpace.ToString() +
"\nTotal Free Space " + d.TotalFreeSpace.ToString();
Console.WriteLine(info);
dove DriveType indica CDRom, Fixed, Network, Removable,Ram,.. e DriveFormat dice NTFS or FAT32.
Interessante anche il FileSystemWatcher per le notifiche, su cui c’e’ anche un post di Mirko Gatti, http://blogs.ugidotnet.org/mitch/archive/2006/09/22/48513.aspx . Confesso che con il framework 2.0 nei miei test questo non ho verificato l’errore in creazione, ma in un caso di copia di file.
Per giocare un po’ mi sono fatta una funzioncina di utilità che copia tutta una directory e assegna a tutti i file e directory una certa data di creazione/ultima modifica. Questa me la metto in una console application e do’ il risultato il pasto al setup e ho tutte le cose belle ordinate. Magari c’e’ un’opzione da qualche parte che lo fa da solo, pero’ con questa ci posso poi mettere dei filtri e saltare alcuni tipi di file...
private static void CopyAll(string from, string to, DateTime date)
{
//dati delle directory di partenza
DirectoryInfo dFrom = new DirectoryInfo(from);
//dati delle directory di destinazione
DirectoryInfo dTo = new DirectoryInfo(to);
if (!dTo.Exists)
{
//ricreo la directory
System.IO.Directory.CreateDirectory(to);
dTo.CreationTime = date; //metto le date di creazione, modifica
dTo.LastWriteTime = date;
}
//leggo tutti i file
FileInfo[] files = dFrom.GetFiles();
foreach (FileInfo f in files)
{
//copio il file
string newFile = System.IO.Path.Combine(to, f.Name);
System.IO.File.Copy(f.FullName, newFile );
FileInfo fNew = new FileInfo(newFile);
//determino se è readonly
bool bReadOnly = (fNew.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly;
//se è readonly .. tolgo l'attributo
if (bReadOnly) fNew.Attributes = fNew.Attributes ^ FileAttributes.ReadOnly;
fNew.CreationTime = f.CreationTime; //assegno data di creazione originale
fNew.LastWriteTime = date; //assegno date di ultima modifiche/accesso
fNew.LastAccessTime = date;
//se occorre rimetto a posto il readonly
if (bReadOnly) fNew.Attributes = fNew.Attributes ^ FileAttributes.ReadOnly;
}
//vado in ricorsione per le directory
DirectoryInfo[] dir = dFrom.GetDirectories();
foreach (DirectoryInfo d in dir)
CopyAll(d.FullName, System.IO.Path.Combine(to, d.Name), date);
}
Per completare il lavoro serve una funzione di DeleteAll della directory di destinazione, prima di iniziare la copia.
Se ci sono file ReadOnly non ci si puo’ limitare ad usare dTo.Delete(true), viene un’eccezione.. occorre andare a togliere l’attributo.