private static void InnerDeleteObject(String path)
        {
            path = @"\\?\" + path; //UNC Path
            var objType = GetPathType(path);

            if (!objType.HasValue)
            {
                return;
            }

            var occupiedFiles       = StringListPool.Rent();
            var occupiedDirectories = StringListPool.Rent();

            if (objType.Value.dwFileAttributes.HasFlag(FileAttributes.Directory))
            {
                InnerDeleteDirectory(path, occupiedFiles, occupiedDirectories);
            }
            else
            {
                InnerDeleteFile(path, objType.Value.dwFileAttributes, occupiedFiles);
                DeleteOccupiedFiles(occupiedFiles);
            }
            StringListPool.Return(occupiedFiles);
            StringListPool.Return(occupiedDirectories);
        }
 private static void TraverseDirectoryPower(List <String> paths, Stack <String> allPaths, List <String> occupiedFiles)
 {
     if (paths == null)
     {
         return;
     }
     Parallel.ForEach <String>(paths, item =>
     {
         allPaths.Push(item);
         TraverseDirectoryPower(GetDirectories(item, occupiedFiles), allPaths, occupiedFiles);
     });
     StringListPool.Return(paths);
 }