Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        private static List <String> GetDirectories(String path, List <String> occupiedFiles)
        {
            List <String> paths;
            String        findPath;

            if (NativeAPI.TryFindFirstFile(path + @"\*", out var findHandle, out var foo)) // in
            {
                paths = StringListPool.Rent();
                while (true)
                {
                    if (!NativeAPI.TryFindNextFile(findHandle, out var findInfo))
                    {
                        break;  //error or end
                    }
                    findPath = path + @"\" + findInfo.cFileName;

                    if (!findInfo.FileAttributes.dwFileAttributes.HasFlag(FileAttributes.Directory))
                    {
                        InnerDeleteFile(findPath, findInfo.FileAttributes.dwFileAttributes, occupiedFiles);
                    }
                    else if (findInfo.cFileName != ".." && findInfo.cFileName != ".") //ignores ".." or "." .
                    {
                        paths.Add(findPath);
                    }
                }
            }
Ejemplo n.º 3
0
        private static Stack <String> TraverseDirectory(String path, List <String> occupiedFiles)
        {
            var paths  = StringListPool.Rent();
            var result = new Stack <String>();

            paths.Add(path);
            TraverseDirectoryPower(paths, result, occupiedFiles);
            return(result);
        }
Ejemplo n.º 4
0
 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);
 }