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 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); } } }
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); }
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); }