Skip to content
This repository has been archived by the owner on May 18, 2023. It is now read-only.

Commit

Permalink
you can drag&drop more objets on exe~
Browse files Browse the repository at this point in the history
  • Loading branch information
differentrain committed Sep 13, 2017
1 parent 46a4142 commit 69ce1cf
Show file tree
Hide file tree
Showing 16 changed files with 50 additions and 51 deletions.
Binary file modified .vs/DeletionTool/v15/.suo
Binary file not shown.
Binary file modified .vs/slnx.sqlite
Binary file not shown.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ Windows下的删除文件/文件夹的小工具。

## Updates 更新

2017.09.12 New Functionality: drag&drop a file/directory on exe, program shoud delete object without GUI, instead of the system sound of "EmptyRecycleBin".
2017.09.12 New Functionality: drag&drop files or(and) directories on exe, program shoud delete object without GUI, instead of the system sound of "EmptyRecycleBin".

2017.09.12 新增功能: 拖拽文件或文件夹到exe上面,程序会在不使用GUI的情况下将其删除, 并播放系统声音"EmptyRecycleBin".
2017.09.12 新增功能: 拖拽文件或(和)文件夹到exe上面,程序会在不使用GUI的情况下将其删除, 并播放系统声音"EmptyRecycleBin".

## Notice 须知

Expand Down
Binary file modified src/.vs/DeletionTool/v15/.suo
Binary file not shown.
Binary file modified src/.vs/DeletionTool/v15/sqlite3/storage.ide
Binary file not shown.
59 changes: 28 additions & 31 deletions src/DeletionTool/AdvancedDeletion/AdvancedDeletion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ public static class AdvancedDeletion
{
private const String _LongPathPrefix = @"\\?\"; //Long path prefix

private static List<String> _OccupiedFiles = StringListPool.Rent();
private static List<String> _OccupiedDirectories = StringListPool.Rent();

/// <summary>
/// Delete a file or directory.
/// </summary>
Expand Down Expand Up @@ -55,26 +52,28 @@ public static Boolean IsExists(String path, out Boolean mayHasDot)
return false;
}


private static void InnerDeleteObject(String path)
{
_OccupiedFiles.Clear();
_OccupiedDirectories.Clear();
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);
InnerDeleteDirectory(path, occupiedFiles, occupiedDirectories);
}
else
{
InnerDeleteFile(path, objType.Value.dwFileAttributes);
DeleteOccupiedFiles();
InnerDeleteFile(path, objType.Value.dwFileAttributes, occupiedFiles);
DeleteOccupiedFiles(occupiedFiles);
}
StringListPool.Return(occupiedFiles);
StringListPool.Return(occupiedDirectories);
}
// File or directory or invalid path?
private static Win32FileAttributeData? GetPathType(String path)
Expand All @@ -89,7 +88,7 @@ private static void InnerDeleteObject(String path)
return null;
}

private static void InnerDeleteFile(String path, FileAttributes fileAttributes)
private static void InnerDeleteFile(String path, FileAttributes fileAttributes, List<String> occupiedFiles)
{
if (fileAttributes.HasFlag(FileAttributes.ReadOnly))
{
Expand All @@ -98,36 +97,36 @@ private static void InnerDeleteFile(String path, FileAttributes fileAttributes)
}
if (!NativeAPI.DeleteFile(path, out var occupied) && occupied)
{
_OccupiedFiles.Add(path);
occupiedFiles.Add(path);
}
}

//Notice that win api FindFirstFile does not support the path end with "\".
private static void InnerDeleteDirectory(String path)
private static void InnerDeleteDirectory(String path, List<String> occupiedFiles, List<String> occupiedDirectories)
{
var dirList = TraverseDirectory(path); // Traverse directory and delete files.
DeleteOccupiedFiles(); //Delete occupied files
var dirList = TraverseDirectory(path, occupiedFiles); // Traverse directory and delete files.
DeleteOccupiedFiles(occupiedFiles); //Delete occupied files
foreach (var item in dirList) //Delete directories.
{
var b= NativeAPI.RemoveDirectory(item,out var occupied);
if (occupied)
{
_OccupiedDirectories.Add(item);
occupiedDirectories.Add(item);
}
}
DeleteOccupiedDirectories(dirList); //Delete occupied directories.
DeleteOccupiedDirectories(dirList, occupiedDirectories); //Delete occupied directories.
}

private static Stack<String> TraverseDirectory(String path)
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);
TraverseDirectoryPower(paths, result, occupiedFiles);
return result;
}

private static void TraverseDirectoryPower(List<String> paths, Stack<String> allPaths)
private static void TraverseDirectoryPower(List<String> paths, Stack<String> allPaths, List<String> occupiedFiles)
{
if (paths == null)
{
Expand All @@ -136,12 +135,12 @@ private static void TraverseDirectoryPower(List<String> paths, Stack<String> all
Parallel.ForEach<String>(paths, item =>
{
allPaths.Push(item);
TraverseDirectoryPower(GetDirectories(item), allPaths);
TraverseDirectoryPower(GetDirectories(item,occupiedFiles), allPaths, occupiedFiles);
});
StringListPool.Return(paths);
}

private static List<String> GetDirectories(String path)
private static List<String> GetDirectories(String path, List<String> occupiedFiles)
{
List<String> paths;
String findPath;
Expand All @@ -158,7 +157,7 @@ private static List<String> GetDirectories(String path)

if (!findInfo.FileAttributes.dwFileAttributes.HasFlag(FileAttributes.Directory))
{
InnerDeleteFile(findPath, findInfo.FileAttributes.dwFileAttributes);
InnerDeleteFile(findPath, findInfo.FileAttributes.dwFileAttributes, occupiedFiles);
}
else if (findInfo.cFileName != ".." && findInfo.cFileName != ".") //ignores ".." or "." .
{
Expand All @@ -178,26 +177,24 @@ private static List<String> GetDirectories(String path)
return paths.ToList();
}

private static void DeleteOccupiedFiles()
private static void DeleteOccupiedFiles(List<String> occupiedFiles)
{
if (_OccupiedFiles.Count > 0)
if (occupiedFiles.Count > 0)
{
Unlocker.ReleaseObjects(_OccupiedFiles.ToArray());

foreach (var item in _OccupiedFiles)
Unlocker.ReleaseObjects(occupiedFiles.ToArray());
foreach (var item in occupiedFiles)
{
NativeAPI.DeleteFile(item, out var kd);

}
}

}

private static void DeleteOccupiedDirectories(Stack<String> paths)
private static void DeleteOccupiedDirectories(Stack<String> paths, List<String> occupiedDirectories)
{
if (_OccupiedDirectories.Count > 0)
if (occupiedDirectories.Count > 0)
{
Unlocker.ReleaseObjects(_OccupiedDirectories.ToArray(),false);
Unlocker.ReleaseObjects(occupiedDirectories.ToArray(),false);

foreach (var item in paths) //all in list
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,16 @@ internal static class NativeAPI
private const Int32 ERROR_MORE_DATA = 234;
#endregion

#region The fields below is thread-safe in this project.
private static StringBuilder _SessionKey = new StringBuilder(Marshal.SizeOf(Guid.NewGuid()) * 2 + 1);
private static StringBuilder _DosDeviceName = new StringBuilder(260);
#endregion


private static StringBuilder _DosDeviceName = new StringBuilder(260); //thread-safe in this project.


public static Boolean TryRmStartSession(out UInt32 sessionHandle, out String sessionKey)
{
_SessionKey.Clear();
var error = RmStartSession(out sessionHandle, 0, _SessionKey);
sessionKey = _SessionKey.ToString();
var session = new StringBuilder(Marshal.SizeOf(Guid.NewGuid()) * 2 + 1);
var error = RmStartSession(out sessionHandle, 0, session);
sessionKey = session.ToString();
return error == 0 ? true : false;
}

Expand All @@ -88,7 +88,7 @@ public static Boolean TryRmEndSession(UInt32 pSessionHandle)

public static Boolean TryRmGetList(UInt32 sessionHandle, out RmRebootReason rebootReasons, out RmProcessInfo[] affectedApps)
{
affectedApps =null;
affectedApps = null;
var nCount = 0U;
var error = RmGetList(sessionHandle, out var nlength, ref nCount, affectedApps, out rebootReasons);
while (error == ERROR_MORE_DATA)
Expand Down Expand Up @@ -277,7 +277,7 @@ public static Boolean DeleteFile(String path, out Boolean isOccupied)
return true;
}


public static Boolean RemoveDirectory(String path, out Boolean isOccupied)
{
if (!RemoveDirectoryW(path))
Expand Down
13 changes: 10 additions & 3 deletions src/DeletionTool/Program.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Microsoft.Win32;
using System;
using System.Media;
using System.Threading.Tasks;
using System.Windows.Forms;
using YYProject.AdvancedDeletion;

Expand Down Expand Up @@ -32,10 +33,16 @@ static void Main(String[] args)
{
if (args.Length > 0)
{
var path = args[0];
if (AdvancedDeletion.IsExists(path, out var hasDot))
var hasDeleted = false;
Parallel.ForEach<String>(args, item => {
if (AdvancedDeletion.IsExists(item, out var hasDot))
{
hasDeleted = true;
AdvancedDeletion.Delete(item);
}
});
if (hasDeleted)
{
AdvancedDeletion.Delete(path);
var sound = new SoundPlayer(Registry.CurrentUser.OpenSubKey(@"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Current", false).GetValue(null) as String);
sound.PlaySync();
}
Expand Down
Binary file removed src/DeletionTool/bin/Release/DeletionTool.exe
Binary file not shown.
6 changes: 0 additions & 6 deletions src/DeletionTool/bin/Release/DeletionTool.exe.config

This file was deleted.

Binary file removed src/DeletionTool/bin/Release/DeletionTool.pdb
Binary file not shown.
Binary file modified src/DeletionTool/bin/Release/DeletionTool.zip
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
f79670f7d85e10e766432313096e63eeb831f745
Binary file modified src/DeletionTool/obj/Release/DeletionTool.exe
Binary file not shown.
Binary file modified src/DeletionTool/obj/Release/DeletionTool.pdb
Binary file not shown.
Binary file not shown.

0 comments on commit 69ce1cf

Please sign in to comment.