begin process at 2008 07 20 15:46:52
1 213 292 membres
207 nouveaux aujourd'hui
14 166 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SNAPSHOT DISQUE DUR


Information sur la source

Catégorie :Fichiers / Disque Source .NET ( DotNet ) Classé sous : snapshot, image, scanner, disque, fichiers Niveau : Débutant Date de création : 09/05/2007 Date de mise à jour : 11/05/2007 10:49:51 Vu : 5 665

Note :
Aucune note

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

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

  • 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;
  • }
  • }
    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.
09 mai 2007 15:01:27 :
Mise a jour
11 mai 2007 10:49:51 :
Modification de la structure de données pour avoir des performances accrues. Passage d'un tableau statiaue à trois dimensions à un Dictionnaire avec indexeur.
  • signaler à un administrateur
    Commentaire de Warny le 10/05/2007 06:58:04

    Pourquoi tu n'utilises pas une classe générique list<> à la place du tableau ?

  • signaler à un administrateur
    Commentaire de Patrice99 le 10/05/2007 09:28:24

    Voir aussi :
    VBWinBackup : Sauvegarde d'une arborescence de fichiers
    www.vbfrance.com/code.aspx?ID=36613
    (pas de tableau à dimensionner à l'avance, compression > 2Go, ...)

  • signaler à un administrateur
    Commentaire de naigeon le 10/05/2007 11:19:35

    Salut,

    @Warny :
    Le problème de la classe génériaue List<,>, c'est qu'on ne peut avoir qu'une seule dimension. Or j'ai besoin de stocker trois attributs par fichier : le nom, la taille et la date de modification. D'où le tableau : nom fichier | taille | date

    Après, on pourrait effectivement passer par une liste de références qui pointent sur des structures à trois éléments (tableaux ou listes), mais l'allocation dynamique dans la boucle principale nous ferait perdre en performances.

    Avec une bonne vieille allocation statique, nous n'avons pas ce problème. Reste à allouer correctement le tableau.

    Ceci étant dit, si quelqu'un voit une solution autre que l'allocation statique d'un tableau, je suis prenneur ;)

  • signaler à un administrateur
    Commentaire de Warny le 10/05/2007 11:59:42

    Essaye ça (bien)

    struct fichier {
       string nom,
       int taille,
       datetime date,
    }

    List<fichier>


    ou ça (mal)

    List<List<string>>

  • signaler à un administrateur
    Commentaire de naigeon le 10/05/2007 14:24:28

    Oui bien sûr, c'est ce que je disais, nous allons avoir une allocation dynamique de listes pointées par la liste principale, ce qui risque de ralentir passablement l'algo.

    Je vais tout de même tester et je vous donne des nouvelles comparé au tableau.

  • signaler à un administrateur
    Commentaire de Warny le 10/05/2007 14:51:21

    Dans le cas d'un struct, l'allocation est statique :
    la déclaration d'un variable se fait comme ça :
    fichier toto;
    toto.nom=...

  • signaler à un administrateur
    Commentaire de naigeon le 11/05/2007 10:51:50

    Merci Warny, j'ai repris ton idée en remplacant simplement la liste par un  Dictionnaire. Le dictionnaire étant indexé, la comparaison des snapshots est très rapide.

  • signaler à un administrateur
    Commentaire de artpinze le 23/05/2007 06:37:32

    bonjour je suis hors sujet je pense ,mais peut-etre que vous pourez m'aider je cherche un logiciel ou un programme  qui serais capable de scanner des fichiers MP3 sur un disque dur
    pour pouvoir copier coller juste les titre pour les mettre sur un editeur de texte(world) si vous avez des pistes merci !

  • signaler à un administrateur
    Commentaire de naigeon le 25/05/2007 16:17:16

    Salut,


    Tu n'es pas hors sujet du tout ! Csanner le disque est la seule solution a ton problème.
    Au moment d'empiler ou de dépiler les fichiers du disque dans la méthode GetAllFiles(String), tu as juste à tester si le fichier est un MP3 (test de l'extension) et si c'est un MP3, tu le met de côté, par exemple dans une StringCollection.

  • signaler à un administrateur
    Commentaire de artpinze le 25/05/2007 21:58:26

    merci de tes conseils mais c'est quoi la méthode get all files(string)et string collection
    je ne cherche pas de lingerie feminine :):)

  • signaler à un administrateur
    Commentaire de Octave32 le 03/06/2007 17:16:44

    Où il y à la méthode simple en MSDOS :P

    Dépose tout tes fichiers mp3s dans le même répertoire, positionne toi dessus MSDOS et écrit:
    tree /f >> listemp3.doc

    C'est rapide et efficace pour envoyer ta liste à un copain :P
    Ça donne pas le .doc le plus prope, mais ça dépanne héhé.

  • signaler à un administrateur
    Commentaire de Patrice99 le 04/06/2007 08:36:32

    Merci pour l'astuce tree, il me semble que ça fait 20 ans que ça existe, mais j'avais oublié que c'était encore disponible !

  • signaler à un administrateur
    Commentaire de artpinze le 04/06/2007 09:31:43

    merci ! je vais essayer

  • signaler à un administrateur
    Commentaire de artpinze le 04/06/2007 10:30:01

    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

  • signaler à un administrateur
    Commentaire de artpinze le 04/06/2007 10:41:35

    C’est bon j’ai trouvé
    F:\> listemp3.doc
    je vous remercie  de votre aide  et a+

  • signaler à un administrateur
    Commentaire de Octave32 le 04/06/2007 14:33:39

    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 =)

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS