Snapshot disque dur

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 887 fois - Téléchargée 19 fois

Contenu du snippet

Cette classe permet :
  • De faire un snapshot d'un disque dur ou d'un répertoire en scannant récursivement tous les fichiers et sous dossiers présents. Le parcours de l'arborescence a été dérecursifié grâce à une pile pour garder des performances correctes. Le parcours est donc rapide et efficace. Le résultat du snapshot est stocké en attribut de la classe.
  • De comparer deux snapshots du disque ou du répertoire scanné. La comparaison fournit un Dictionnaire dont les modifications entre les deux snapshot sont marquées en rouge en format Html. (balise span, attribut style et color).


On garde en mémoire le nom des fichiers, leur date de création ainsi que leur taille. La comparaison s'effectue sur tous ces critères.

Source / Exemple :


public struct OneFile
    {
        public String size;
        public String lastDate;
    }
    
    ///<summary>This class is used for hard drive methods</summary>
    ///<remarks> 
    ///Contains method for hard drive snapshot, comparing hard drive snapshot and incrementing the number of scaned files
    ///</remarks> 
    class DriveAccess
    {
        /// <summary>
        /// StringCollection containing the scaned folder paths
        /// </summary>
        //private static String[,] _allFiles;
        Dictionary<String, OneFile> _allFiles;

        public Dictionary<String, OneFile> allFiles
        {
            get { return _allFiles; }
            set { _allFiles = value; }
        }
        
        /// <summary>
        /// Construct, instanciates the StringCollection
        /// </summary>
        public DriveAccess() 
        {
            //allFiles = new String[50000,3];
            _allFiles = new Dictionary<String, OneFile>();
        }

        /// <summary>
        /// Methods which gets all files and folders in a directory. It uses a Stack which is the best way to
        /// deal with non recursive algorithm for scan.
        /// </summary>
        /// <param name="inDirectory">The directory we want to scan</param>
        public void GetAllFiles(String inDirectory)
        {
            // Define new stack
            Stack<String> myStack = new Stack<String>();

            // Get all subdirectories in inDirectory
            String[] files = Directory.GetFileSystemEntries(inDirectory);

            // Define String containing the poped value from stack
            String poped;

            // We push all subdirectories in the stack
            foreach (String fileName in files)
            {
                myStack.Push(fileName);
            }

            int i = 0;

            // Let's do the main loop
            while (myStack.Count > 0)
            {
                // Pop a value
                poped = myStack.Pop();

                // If it is a directory
                if (Directory.Exists(poped))
                {
                    try
                    {
                        // Get it's subdirectories
                        files = Directory.GetFileSystemEntries(poped);

                        // Push these subdirectories
                        foreach (String fileName in files)
                        {
                            myStack.Push(fileName);
                        }
                    }
                    catch
                    { }
                }
                // We got a file
                else
                {
                    // Get informations about the file
                    FileInfo myFileInfo = new FileInfo(poped);
                    
                    // Add it to the StringCollection attribute
                    //allFiles[i, 0] = poped;
                    //allFiles[i, 1] = myFileInfo.Length.ToString();
                    //allFiles[i, 2] = myFileInfo.LastWriteTime.ToString();
                    //i++;
                    OneFile myOneFile;
                    myOneFile.size = myFileInfo.Length.ToString();
                    myOneFile.lastDate = myFileInfo.LastWriteTime.ToString();

                    _allFiles[poped] = myOneFile;

                    // Number of scaned files and directories ++
                    incNum();
                }
            } 
        }

        

        /// <summary>
        /// Compares two StringCollections and returns the differences between these StringCollections
        /// </summary>
        /// <param name="inStringCollec">One of the StringCollection we want to compare</param>
        /// <returns>Differences between the two StringCollections</returns>
        public Dictionary<String, OneFile> compare(Dictionary<String, OneFile> inStringCollec)
        {
            // Define the StringCollection we will return
            Dictionary<String, OneFile> returnCollection = new Dictionary<String, OneFile>();
            OneFile myTempOneFile;

            // Foreach String into one of the String[,]
            foreach(KeyValuePair<String, OneFile> myPair in _allFiles)
            {
                if (inStringCollec.ContainsKey(myPair.Key))
                {
                    if (inStringCollec[myPair.Key].lastDate != myPair.Value.lastDate)
                    {
                        myTempOneFile.lastDate = "<span style=\"color:red;\">" + _allFiles[myPair.Key].lastDate + "</span>";
                        myTempOneFile.size = _allFiles[myPair.Key].size;
                        returnCollection[myPair.Key] = myTempOneFile;
                    }

                    if (inStringCollec[myPair.Key].size != myPair.Value.size)
                    {
                        myTempOneFile.lastDate = _allFiles[myPair.Key].lastDate;
                        myTempOneFile.size = "<span style=\"color:red;\">" + _allFiles[myPair.Key].size + "</span>";
                        returnCollection[myPair.Key] = myTempOneFile;
                    }
                }
                else
                {
                    myTempOneFile.lastDate = _allFiles[myPair.Key].lastDate;
                    myTempOneFile.size = _allFiles[myPair.Key].size;
                    returnCollection["<span style=\"color:red;\">" + myPair.Key + "</span>"] = myTempOneFile;
                }
            }
            return returnCollection;
        }
    }

Conclusion :


J'ai respecté un guide de style assez fréquent lors du développement de cette classe.
Cette classe fait partie d'un projet de développement logiciel bien plus volumineux visant à automatiser des tests de Setups.

A voir également

Ajouter un commentaire Commentaires
Messages postés
23
Date d'inscription
lundi 1 novembre 2004
Statut
Membre
Dernière intervention
17 novembre 2007

merci pour cet source je ment suis servie pour réccupérer des fichiers
avec des extension choisies.
ex:
StreamWriter str;
string exi = "";
DriveAccess dra = new DriveAccess();
string [] les_fichiers ;
dra.GetAllFiles(disque[N_disque]);
les_fichiers = new string[dra.allFiles.Keys.Count];
dra.allFiles.Keys.CopyTo(les_fichiers,0);//Met tous les repertoire de l'unité dans Le_repertoires
try
{
for (int n_fichier = 0; n_fichier < les_fichiers.Length; n_fichier++)
{
exi = Path.GetExtension(les_fichiers[n_fichier]);
if (exi == "." + ext)
{
str.WriteLine(les_fichiers[n_fichier]);
}
}
}

catch (System.Exception ex)
{
}
Messages postés
18
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
8 décembre 2008

En faite /f devrait servir à afficher aussi le contenu des répertoires enfants, car moi par exemple je classe mes chansons par albums alors il faut qu'il m'affiche ce qu'il y à dans les dossiers des albums =)
Messages postés
7
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
4 juin 2007

C'est bon j'ai trouvé
F:\> listemp3.doc
je vous remercie de votre aide et a+
Messages postés
7
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
4 juin 2007

f corespond a quoi?
ca ne scanne que ma partition C/
que change t'on pour scanner un disque dur externe f/
ceci :F:\Documents a conserver\MP3>tree /f >>listemp3.doc

mais dans ce cas la ou vas le rapport?
quand j'essai la ligne ci dessus il me repond que F n'est pas reconnu en tant que commande interne ou externe
Messages postés
7
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
4 juin 2007

merci ! je vais essayer
Afficher les 17 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.