Windows相册文件批量管理工具

news/2025/2/21 17:50:15/

背景

电脑存了很多手机备份的照片,备份一次就是一个文件夹,比较分散,名字不方便查找,想统一放到一个文件夹内,按照年月分组,每一年每个月的照片放到一起。
所以用大半天时间用winform简单做了一个批处理工具。(winform不熟悉一直百度)

主要功能

在这里插入图片描述

主要功能:

  • 文件按照年份和月份二级文件夹目录分组
  • 可选按文件创建最早时间进行重命名
  • 实时显示处理进度
  • 默认复制文件,可选移动文件
  • 简单去重(时间相等文件判断md5值)
  • 支持取消

源文件:
在这里插入图片描述

新文件:
在这里插入图片描述

电梯直达

白嫖下载测试点我

代码

gayhub地址
gitcode地址

using System;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;namespace HnoyiTools
{public partial class HnoyiTools : Form{public HnoyiTools(){InitializeComponent();}//记录文件总数,显示进度static long FileNum = 0;static bool MoveEnable = false;//随机数private static Random random = new Random();/// <summary>/// 随机字符串/// </summary>/// <param name="chars"></param>/// <param name="length"></param>/// <returns></returns>public string GetRandomStr(string chars, int length){if (string.IsNullOrEmpty(chars)){chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghizklmnopqrstuvwxyz0123456789";}//const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());}private void SrcPathbutton_Click(object sender, EventArgs e){FolderBrowserDialog folder = new FolderBrowserDialog();folder.Description = "选择文件所在文件夹目录";  //提示的文字if (folder.ShowDialog() == DialogResult.OK){SrcPathBox.Text = folder.SelectedPath;}}private void DestPathbutton_Click(object sender, EventArgs e){FolderBrowserDialog folder = new FolderBrowserDialog();folder.Description = "选择文件所在文件夹目录";  //提示的文字if (folder.ShowDialog() == DialogResult.OK){DestPathBox.Text = folder.SelectedPath;}}private void BackWorker_DoWork(object sender, DoWorkEventArgs e){// 遍历所有文件var files = Directory.GetFiles(SrcPathBox.Text, "*.*", SearchOption.AllDirectories);int i = 0;foreach (var file in files){//判断退出if (BackWorker.CancellationPending == true){e.Cancel = true;break;}//获取文件创建时间等信息FileInfo fi = new FileInfo(file);/*Console.WriteLine("创建时间:" + fi.CreationTime);Console.WriteLine("修改时间:" + fi.LastWriteTime);Console.WriteLine("访问时间:" + fi.LastAccessTime);*///取最早时间,copy的文件创建时间会很新DateTime Time = fi.CreationTime;if (DateTime.Compare(fi.CreationTime, fi.LastWriteTime) > 0){Time = fi.LastWriteTime;}//按年月方式创建目录string DestPath = DestPathBox.Text + @"\" + Time.Year + @"\" + Time.Month + @"\";if (!Directory.Exists(DestPath)){Directory.CreateDirectory(DestPath);}//重命名文件string SourceFile = file;string DestFile = DestPath + Time.ToString("yyyy-MM-dd__HH_mm_ss") + fi.Extension;//防止重名if (File.Exists(DestFile)){DestFile = DestPath + Time.ToString("yyyy-MM-dd__HH_mm_ss") + "_" + GetRandomStr(null, 4) + fi.Extension;}//移动文件if (MoveEnable){File.Move(SourceFile, DestFile);}else{//默认复制文件File.Copy(SourceFile, DestFile);}//通知进度string ProcessMsg = "原文件:" + SourceFile + "\r\n" + "新文件" + DestFile + "\r\n";//Console.WriteLine(ProcessMsg);i++;BackWorker.ReportProgress(i, ProcessMsg);}}private void BackWorker_ProgressChanged(object sender, ProgressChangedEventArgs e){//BackWorker.ReportProgress方法传递过来的参数userStatestring state = (string)e.UserState;progressBar.Value = e.ProgressPercentage;ProgresLabel.Text = "处理进度:" + Convert.ToString(e.ProgressPercentage) + "/" + FileNum;MsgBox.Text += e.UserState.ToString();}private void BackWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){//计算过程中的异常会被抓住,在这里可以进行处理。//这里没做异常处理if (e.Error != null){Type errorType = e.Error.GetType();switch (errorType.Name){case "ArgumentNullException":case "MyException"://do something.break;default://do something.break;}}}private void StartWorkButton_Click(object sender, EventArgs e){//判断是否正在运行异步操作if (BackWorker.IsBusy)return;if (SrcPathBox.Text.Length < 1 || DestPathBox.Text.Length < 1){MessageBox.Show("请选择源文件目录和目标文件夹目录!");return;}////判断文件操作模式if (MoveCheckBox.Checked){MoveEnable = true;}//清空显示ProgresLabel.Text = "处理进度:";MsgBox.Text = "";//填充总文件数表示进度FileNum = progressBar.Maximum = Directory.GetFiles(SrcPathBox.Text, "*.*", SearchOption.AllDirectories).Length;//给业务传递参数,就是把前台的要处理的参数传递进去BackWorker.RunWorkerAsync();StopWorkButton.Enabled = true;}private void StopWorkButton_Click(object sender, EventArgs e){//取消后台进程BackWorker.CancelAsync();}}
}

参考

  • MSDN
  • 使用C#怎么修改文件的创建和修改时间
  • C#遍历文件夹
  • c#产生随机字符串的两种方法
  • c#中使用BackgroundWorker
  • C# BackgroundWorker 详解
  • C#获取文件夹内文件数目

http://www.ppmy.cn/news/492610.html

相关文章

多选图片一次上传(as+js) ,仿QQ相册

做上传图片功能的时候&#xff0c;经常会遇到这样一个问题&#xff0c;有时候可能需要一次上传多张图片&#xff0c;而用html中默认的上控件&#xff0c;却只能选定一个文件&#xff0c;且不能对文件的后缀进行筛选。需要一次上传多个文件的需求&#xff0c;往往可以通过添加多…

android qq分享纯图片,手机照片批量上传QQ空间一键分享省流量

【IT168 资讯】十一双假期刚刚结束&#xff0c;无论回家还是出游&#xff0c;不管是家里的庭院小景还是一路上的美景扑面&#xff0c;你一定会拿起手机不断按下快门&#xff0c;记录每一个美的瞬间。如今长假归来&#xff0c;我们都希望能够马上和好友一起分享假期的美景趣事。…

阿里面试很难吗?不是有手就行吗?

我一直想写点什么&#xff0c;但当时我觉得在得到几家大厂的offer之后再谈会更有说服力。但从目前的结果来看&#xff0c;结果并不十分令人满意。 去年年底&#xff0c;我陆续面试了一些公司&#xff0c;比如迅雷、OPPO、阿里巴巴等。当时&#xff0c;我并没有做任何准备&#…

PTGUI全景合成软件使用教程之镜头参数设置

拍摄全景照片尽量选择大广角或者鱼眼镜头进行拍摄&#xff0c;这样合成一张全景照片所需要的照片数量大为减少&#xff0c;照片数量越少合成全景照片难度越小&#xff0c;但相应的照片成像会有所下降&#xff0c;手机观赏的话影响不大。 现在大部分拍摄所使用的一些广角、鱼眼或…

HTB Popcorn[Hack The Box HTB靶场]writeup系列4

本题是retire的第四题Popcorn 目录 0x00 靶机情况 0x01 扫描端口 0x02 web目录文件扫描 0x03 get webshell 0x04 提权 0x00 靶机情况 本题是linux的靶机&#xff0c;整体看起来难度在3-4之间&#xff0c;比之前的题目有了一些难度&#xff0c;不过做过vulnhub的题目之后&…

CLR系列:浅析泛型的本质

泛型早在.net2.0就出来了&#xff0c;大家已经对它的使用很熟悉了&#xff0c;在工作中也大量的使用过它&#xff0c;但是大家对其工作原理&#xff0c;以及MS针对泛型对CLR做了那些工作是否了解呢。本文就是对泛型的本质进行讲解&#xff0c;希望能对大家有所帮助。 1.引入泛型…

颜色分类——荷兰国旗

题目来源 颜色分类_牛客题霸_牛客网 题目 给定一个包含红色&#xff0c;白色&#xff0c;蓝色&#xff0c;一同 n 个元素的数组&#xff0c;对其进行排序使得相同的颜色相邻并且按照红色&#xff0c;白色&#xff0c;蓝色的顺序排序。 数组中 0 代表红色&#xff0c;1 代表…

【外网不好用】可以尝试添加dns即可解决上不去外网的问题。

【外网不好用】可以尝试添加dns即可解决上不去外网的问题。 参考文章&#xff1a; &#xff08;1&#xff09;【外网不好用】可以尝试添加dns即可解决上不去外网的问题。 &#xff08;2&#xff09;https://www.cnblogs.com/zhuzhubaoya/p/10856385.html &#xff08;3&…