private static void RecursivelyMoveThroughDirectoryInternal <TDataType>(string parentName,
                                                                                DirectoryInfo current, bool moveSubDirs,
                                                                                bool moveFiles, TDataType callbackData,
                                                                                RecursiveDirectoryMoveHandler <TDataType>
                                                                                callback)
        {
            //
            DirectoryInfo info = current;

            if (info.Exists)
            {
                string currentDir = parentName + Path.DirectorySeparatorChar + info.Name + Path.DirectorySeparatorChar;
                if (moveFiles)
                {
                    FileInfo[] files = info.GetFiles();
                    foreach (FileInfo file in files)
                    {
                        if (!callback(file.FullName, currentDir + file.Name, true, callbackData))
                        {
                            return;
                        }
                    }
                }
                if (moveSubDirs)
                {
                    DirectoryInfo[] directories = info.GetDirectories();
                    foreach (DirectoryInfo directory in directories)
                    {
                        if (!callback(directory.FullName, currentDir + directory.Name, false, callbackData))
                        {
                            return;
                        }
                    }
                    directories = info.GetDirectories();
                    foreach (DirectoryInfo directory in directories)
                    {
                        RecursivelyMoveThroughDirectoryInternal(parentName + Path.DirectorySeparatorChar + info.Name, directory, true,
                                                                moveFiles, callbackData, callback);
                    }
                }
            }
        }
        private static void RecursivelyMoveThroughDirectory <TDataType>(string directoryPath, bool moveSubDirs, bool moveFiles,
                                                                        TDataType callbackData,
                                                                        RecursiveDirectoryMoveHandler <TDataType> callback)
        {
            DirectoryInfo info = new DirectoryInfo(directoryPath);

            if (info.Exists)
            {
                if (moveFiles)
                {
                    FileInfo[] files = info.GetFiles();
                    foreach (FileInfo file in files)
                    {
                        if (!callback(file.FullName, file.Name, true, callbackData))
                        {
                            return;
                        }
                    }
                }
                if (moveSubDirs)
                {
                    DirectoryInfo[] directories = info.GetDirectories();
                    foreach (DirectoryInfo directory in directories)
                    {
                        if (!callback(directory.FullName, directory.Name, false, callbackData))
                        {
                            return;
                        }
                    }
                    directories = info.GetDirectories();
                    foreach (DirectoryInfo directory in directories)
                    {
                        RecursivelyMoveThroughDirectoryInternal(string.Empty, directory, true, moveFiles, callbackData, callback);
                    }
                }
            }
        }