直接上代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace ProcessItems
{public partial class Form1 : Form{public Form1(){InitializeComponent();// 启用拖放treeViewItems.AllowDrop = true;// 拖放进入事件treeViewItems.DragEnter += new DragEventHandler(treeView_DragEnter);// 拖放事件treeViewItems.DragDrop += new DragEventHandler(treeView_DragDrop);}// 允许拖放的文件类型private void treeView_DragEnter(object sender, DragEventArgs e){if (e.Data.GetDataPresent(DataFormats.FileDrop)){e.Effect = DragDropEffects.Copy; // 或者其他效果}else{e.Effect = DragDropEffects.None;}}// 处理拖放事件private void treeView_DragDrop(object sender, DragEventArgs e){string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);foreach (string file in files){// 检查文件是否存在if (/*File.Exists(file) || */Directory.Exists(file)){// 在这里添加文件到TreeView的逻辑treeViewItems.Nodes.Add(new TreeNode(file));}}}private void buttonOK_Click(object sender, EventArgs e){var items = GetAllTreeViewItems(treeViewItems);foreach (var item in items){MoveSingleSubdirectory(item);}}// 递归函数,用于获取TreeView中的所有节点文本private static void GetTreeViewItems(TreeNodeCollection nodes, List<string> itemList){foreach (TreeNode node in nodes){itemList.Add(node.Text); // 添加当前节点的文本到列表中if (node.Nodes.Count > 0){// 如果当前节点有子节点,则递归调用此函数来获取子节点的文本GetTreeViewItems(node.Nodes, itemList);}}}// 公共方法,供外部调用以获取TreeView中的所有项public static List<string> GetAllTreeViewItems(TreeView treeView){List<string> itemList = new List<string>();GetTreeViewItems(treeView.Nodes, itemList);return itemList;}static void MoveSingleSubdirectory(string dirPath){try{// 检查指定的目录是否存在if (!Directory.Exists(dirPath)){Console.WriteLine($"目录 '{dirPath}' 不存在。");return;}// 获取该目录中的所有子目录string[] subDirs = Directory.GetDirectories(dirPath);// 如果子目录数量不等于1,直接返回if (subDirs.Length != 1){Console.WriteLine($"目录 '{dirPath}' 中的子目录数量不是1。");return;}// 获取唯一的子目录路径string subDirPath = subDirs[0];// 获取上一级目录路径string parentDirPath = Directory.GetParent(dirPath).FullName;// 获取当前目录的名字string subDirName = new DirectoryInfo(dirPath).Name;// 目标路径初始为上一级目录加上子目录的名字string destPath = Path.Combine(parentDirPath, subDirName);// 检查是否存在同名目录,如果存在则添加数字进行重命名int counter = 1;while (Directory.Exists(destPath)){destPath = Path.Combine(parentDirPath, $"{subDirName}_{counter}");counter++;}// 移动子目录到上一级目录Directory.Move(subDirPath, destPath);//删除空目录DeleteIfEmpty(parentDirPath);Console.WriteLine($"子目录已成功移动到: {destPath}");}catch (Exception ex){Console.WriteLine($"操作过程中出现错误: {ex.Message}");}}public static bool DeleteIfEmpty(string directoryPath){try{// 检查目录是否存在if (!Directory.Exists(directoryPath)){Console.WriteLine($"目录 '{directoryPath}' 不存在。");return false;}// 获取目录中的所有文件和子目录string[] files = Directory.GetFiles(directoryPath);string[] subDirs = Directory.GetDirectories(directoryPath);// 如果目录中没有文件也没有子目录,则认为是空目录if (files.Length == 0 && subDirs.Length == 0){// 删除空目录Directory.Delete(directoryPath);Console.WriteLine($"空目录 '{directoryPath}' 已被删除。");return true;}else{Console.WriteLine($"目录 '{directoryPath}' 不是空目录。");return false;}}catch (Exception ex){// 捕获并处理可能出现的异常Console.WriteLine($"操作过程中出现错误: {ex.Message}");return false;}}}
}
实现效果,可以用于整理特殊结构的目录。