C# Program to count Files and Directories with ReparsePoint recursively.

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace CountFilesWithReparseData
{
    class Program
    {
        public static string windowsSourceFolderPath;
        public static bool windowsIgnoreHiddenFiles = false;
        public static ConsoleColor originalForegroundColor;
        public static Dictionary<string, Dictionary<string, bool>> localFilesMetaInfo = new Dictionary<string, Dictionary<string, bool>>();
        public static int totalSourceFolderFolderCount = 0;
        public static int totalSourceFileCount = 0;
        public static int ReparseData_Directories = 0;
        public static int ReparseData_Files = 0;
        public static int ProgressLogTimeDelayFileCount = 0;
        public static int PathTooLongItems = 0;
        static void Main(string[] args)
        {
            string rootFolderpath = string.Empty;

            originalForegroundColor = Console.ForegroundColor;
            Console.SetWindowSize(Console.WindowWidth * 2, Console.WindowHeight * 2);
            Console.WriteLine();
            Console.WriteLine("Please enter the windows path where you want to count the files with ReparseData:");

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine();
            Console.Write("Example 1: ");
            Console.ForegroundColor = originalForegroundColor;
            Console.WriteLine("C:/MigrationData/BigFolder/");
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write("Example 2: ");
            Console.ForegroundColor = originalForegroundColor;
            Console.WriteLine(@"\\Kakinada\Jagannaikpur\");


            Console.WriteLine();
            Console.Write("Enter here >> ");
            windowsSourceFolderPath = Console.ReadLine();
            Console.WriteLine("Path entered = "+ windowsSourceFolderPath);

            // Print START time
            Console.WriteLine();
            Console.Write("Counting started at ");
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.Write(DateTime.Now);
            Console.ForegroundColor = originalForegroundColor;

            // Process the path
            CountFilesWithReparseData();

            // Print END time
            Console.WriteLine();
            Console.WriteLine();
            Console.Write("Counting ended at ");
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine(DateTime.Now);
            Console.ForegroundColor = originalForegroundColor;

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("=============");
            Console.WriteLine("R E S U L T");
            Console.WriteLine("=============");
            Console.WriteLine();
            Console.WriteLine("Total Folder count = "+ totalSourceFolderFolderCount);
            Console.WriteLine("Total File   count = " + totalSourceFileCount);
            if (PathTooLongItems > 0)
            {
                Console.WriteLine("Skipped " + PathTooLongItems + " items and subitems because of PathTooLong >256 characters exception");
            }
            Console.WriteLine();
            Console.WriteLine("Total Folder count (with ReparseData) = "+ ReparseData_Directories);
            Console.WriteLine("Total Folder count (with ReparseData) = "+ ReparseData_Files);
            Console.WriteLine();

            // Don't close the console window.
            Console.ReadKey();
        }

        public static void WalkDirectoryTree(System.IO.DirectoryInfo dir)
        {
            List<DirectoryInfo> dirs = null;
            try
            {
                dirs = dir.GetDirectories().ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine(" ");
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex.Message + " Skipping this folder.");
                Console.ForegroundColor = originalForegroundColor;
                Console.WriteLine(" ");
                return;
            }

            if (dirs != null)
            {
                var filtered = !(windowsIgnoreHiddenFiles) ? dirs : dirs.Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden));
                foreach (DirectoryInfo subDir in filtered)
                {
                    string path = string.Empty;
                    try
                    {
                        path = subDir.FullName;
                    }
                    catch (PathTooLongException)
                    {
                        PathTooLongItems++;
                    }

                    if (!localFilesMetaInfo.ContainsKey(path))
                    {
                        ++totalSourceFolderFolderCount;
                        if ((ProgressLogTimeDelayFileCount++)%100 == 0)
                        {
                            string currentTimeStamp = string.Format("[{0:dd-MMM/HH:mm:ss}] ", DateTime.Now);
                            Console.Write("\r" + currentTimeStamp + " Indexing " + (totalSourceFolderFolderCount) + " Local folders.");
                        }

                        if (HasReparseData(path))
                        {
                            ReparseData_Directories++;
                        }

                        localFilesMetaInfo.Add(path, new Dictionary<string, bool>());
                    }
                    WalkDirectoryTree(subDir);
                }
            }
        }

        public static bool HasReparseData(string path)
        {
            if (String.IsNullOrEmpty(path))
                return false;

            FileInfo pathInfo = new FileInfo(path);
            return pathInfo.Attributes.HasFlag(FileAttributes.ReparsePoint);
        }

        public static void CountFilesWithReparseData()
        {
            Console.WriteLine(" ");

            // Index folders first
            localFilesMetaInfo.Add(windowsSourceFolderPath, new Dictionary<string, bool>());
            Console.WriteLine();
            WalkDirectoryTree(new DirectoryInfo(windowsSourceFolderPath));

            Console.WriteLine();
            foreach (KeyValuePair<string, Dictionary<string, bool>> uniqueLocalFolder in localFilesMetaInfo)
            {
                DirectoryInfo DirInfo = new DirectoryInfo(uniqueLocalFolder.Key);
                FileInfo[] sfilesList;
                try
                {
                    sfilesList = DirInfo.GetFiles();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(" ");
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(ex.Message + " Skipping this file.");
                    Console.ForegroundColor = originalForegroundColor;
                    Console.WriteLine(" ");
                    continue;
                }

                sfilesList = (windowsIgnoreHiddenFiles) ? sfilesList.Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden)).ToArray() : sfilesList;
                int sourceFolder_fCount = sfilesList.Length;
                foreach (var fileInfo in sfilesList)
                {
                    ++totalSourceFileCount;
                    if ((ProgressLogTimeDelayFileCount++) % 100 == 0)
                    {
                        string currentTimeStamp = string.Format("[{0:dd-MMM/HH:mm:ss}] ", DateTime.Now);
                        Console.Write("\r" + currentTimeStamp + " Indexing " + (totalSourceFileCount) + " Local files.");
                    }

                    string path = string.Empty;
                    try
                    {
                        path = fileInfo.FullName;
                    }
                    catch (PathTooLongException ex)
                    {
                        PathTooLongItems++;
                    }

                    if (HasReparseData(path))
                    {
                        ReparseData_Files++;
                    }
                }
            }
        }
    }
}

No comments:

Post a Comment