void ProcessFilesOfDirectory(string path, FileProcessorStatistics currentStatistics)
 {
     /// Get all files in the directory @path
     IEnumerable<string> files = System.IO.Directory.EnumerateFiles(path);
     foreach (string file in files)
     {
         /// The file should exists, so if false is returned then
         /// the file is unaccessible
         if (!System.IO.File.Exists(file))
         {
             currentStatistics.UnaccessibleFileCount++;
         }
         else
         {
             /// Get informations of the file @file
             System.IO.FileInfo info = new System.IO.FileInfo(file);
             if ((info.Attributes & System.IO.FileAttributes.Hidden) == System.IO.FileAttributes.Hidden)
             {
                 currentStatistics.HiddenFileCount++;
             }
             else
             {
                 currentStatistics.TotalFileCount++;
             }
         }
     }
     files.GetEnumerator().Dispose();
 }
        /// <summary>
        /// Process and returns a "object" that contains statistics
        /// </summary>
        /// <param name="pathToDirectory"></param>
        /// <returns></returns>
        public FileProcessorStatistics ProcessFromDirectory(string pathToDirectory)
        {
            FileProcessorStatistics statistics = new FileProcessorStatistics(pathToDirectory);

            if (System.IO.Directory.Exists(pathToDirectory))
            {
                ProcessDirectory(pathToDirectory, statistics);
            }

            return statistics;
        }
        /// <summary>
        /// Recursive method that counts files, hidden files, directories, unaccessible directories
        /// </summary>
        /// <param name="path"></param>
        /// <param name="currentStatistics"></param>
        void ProcessDirectory(string path, FileProcessorStatistics currentStatistics)
        {
            /// Process files of directory @path
            ProcessFilesOfDirectory(path, currentStatistics);

            /// Get all directories in the directory @path
            IEnumerable<string> directories = System.IO.Directory.EnumerateDirectories(path);
            foreach (string directory in directories)
            {
                /// The directory should exists, so if false is returned then
                /// the directory is unaccessible
                /// "If you do not have at a minimum read-only permission to the directory, the Exists method will return false." from MSDN
                if (!System.IO.Directory.Exists(directory))
                {
                    currentStatistics.UnaccessibleDirectoryCount++;
                }
                else
                {
                    /// Get informations of the directory @directory
                    System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(directory);
                    if ((info.Attributes & System.IO.FileAttributes.Hidden) == System.IO.FileAttributes.Hidden)
                    {
                        currentStatistics.HiddenDirectoryCount++;
                    }
                    else
                    {
                        currentStatistics.TotalDirectoryCount++;
                    }

                    try
                    {
                        ProcessDirectory(directory.ToString(), currentStatistics);
                    }
                    catch { }
                }
            }
            directories.GetEnumerator().Dispose();
        }