Snapshot disque dur

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

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.