[c++]代码库
整理15万个文档表格办公文件-2022年9月16日
https://www.autoahk.com/?p=43829
https://www.cnblogs.com/delphixx/p/16699537.html
第1步:收集文档表格办公文件
用FastCopy(64位) ver4.2.0 简体中文汉化版复制所有文档表格办公文件到
速度最快的磁盘分区中的 \应整理的文件\F 文件夹。
在执行复制之前填写FastCopy的过滤器的包括内容为
*.doc;*.docx;*.xls;*.xlsx;*.jpg;*.png
从Synology群晖NAS或者微软的 Windows Server 2022 文件服务器中复制文件需要先用RaiDrive连接WebDAV Server并映射网络驱动器虚拟磁盘 Z:
不同的文件来源复制到不同的子文件中,子文件名称可以是:
\应整理的文件\F\群晖NAS
\应整理的文件\F\Windows-Server-2022
\应整理的文件\F\闪迪4TB移动固态硬盘E81
\应整理的文件\F\USB3.0移动机械硬盘5TB
\应整理的文件\F\银灿IS903可启动U盘USM-PE-v6
等等
第2步:删除重复文件
依次用Vistanita Duplicate Finder和DoubleKiller Pro这两款软件删除文件夹\应整理的文件\F中的重复文件
第3步:提取高价值文档表格办公文件
用FileLocator Pro搜索并提取高价值文件到文件夹 \应整理的文件\高价值文件
文件名称空着不填。
包含文本填公司简称、姓名简称、项目简称或者其他高价值的相关关键字。
查找位置填写D:\应整理的文件\F。
我的速度最快的磁盘分区是D:,假如您的最快分区不是D:请调整查找位置。
文件比较多时可以分批进行移动,找满500个文件时停止查找并全选所有找到的文件并剪切选中的文件。
第4步:提取暂时无用的文档表格办公文件
按照第3步的方法移动暂时无用的文档表格办公文件到文件夹 \应整理的文件\暂时无用的文件 。
检查并删除确实无用的文件。
第5步:按照文件扩展名分类整理文档表格办公文件
用FileLocator Pro提取高价值文件并用FileLocator Pro删除无用文件之后再用
按照文件扩展名分类整理的工具对剩余的文件进行分类整理
使用DropIt
http://www.dropitproject.com/
或者使用 Alternate Archiver
https://www.alternate-tools.com/pages/c_archiver.php?lang=GER
或者使用 AutoHotkey脚本
按照文件扩展名分类整理文档表格办公文件
; ========== 此AHK脚本从此行开始 ==========
; 按照文件类型批量整理子文件夹中所有文件的AHK脚步
#SingleInstance,force
loop,5
{
DetectHiddenWindows,On
Sleep,5
IfWinExist,QQ595076941_fenlei
ExitApp
}
Gui, Show, Hide,QQ595076941_fenlei
runwith("admin","ansi") ;强制自身以 ansi + 管理员权限 运行。
#Persistent
; #NoTrayIcon
DetectHiddenWindows,On
SetTitleMatchMode,2
; ========== 此行是此AutoHotkey脚本的代码块段落分隔行 ==========
;~ 在大批量移动文件之前必需先询问一下
MsgBox, 4, , "Loop All Files in ScriptDir"`n"是否立即按照文件类型批量整理子目录中所有文件?"`n`ncontinue?
IfMsgBox, No
ExitApp
MsgBox, 4, , "Loop All Files in ScriptDir"`n"是否立即按照文件类型批量整理子目录中所有文件?"`n`ncontinue?
IfMsgBox, No
ExitApp
FileCreateDir,%A_ScriptDir%\F
FileCreateDir,%A_ScriptDir%\!Classify
;~ 为重要文件的文件夹写上前缀标记
global importantmark
;~ global ProgressParam
;~ ProgressParam:=0
loop,Files,%A_ScriptDir%\F\*.*,R ;递归遍历穷举文件夹和子文件夹中的文件
{
;; 进度条窗口不可以移动,并且比较烦人
;; ProgressParam:=ProgressParam+0.5
;; if(ProgressParam>99)
;; ProgressParam:=0
;; ;~ 进度条
;; Progress, %ProgressParam%, %a_loopfilename%,"Moveing Files ...", "Classify And Arrange Files in Folder F"
if(A_LoopFileExt="")
{
IfNotExist,%A_ScriptDir%\!Classify\NullFileExt
FileCreateDir,%A_ScriptDir%\!Classify\NullFileExt
FileMove,%A_LoopFileFullPath%,%A_ScriptDir%\!Classify\NullFileExt\%A_LoopFileName%
Sleep,9
continue
}
importantmark:=""
if((A_LoopFileExt="docx") or(A_LoopFileExt="xlsx") or (A_LoopFileExt="jpg") )
importantmark:="1_"
if((A_LoopFileExt="ani") or (A_LoopFileExt="au3") or (A_LoopFileExt="flac") or (A_LoopFileExt="avi") or (A_LoopFileExt="doc") or (A_LoopFileExt="dotx") or (A_LoopFileExt="xls") or (A_LoopFileExt="xltx") or (A_LoopFileExt="dot") or (A_LoopFileExt="xlt") or (A_LoopFileExt="ISO") or (A_LoopFileExt="GHO") or (A_LoopFileExt="flv") or (A_LoopFileExt="jpeg") or (A_LoopFileExt="mp4") or (A_LoopFileExt="png") or (A_LoopFileExt="ppt") or (A_LoopFileExt="pdf") or (A_LoopFileExt="7z") or (A_LoopFileExt="ahk") or (A_LoopFileExt="bat") or (A_LoopFileExt="chm") or (A_LoopFileExt="cmd") or (A_LoopFileExt="dot") or (A_LoopFileExt="exe") or (A_LoopFileExt="ico") or (A_LoopFileExt="mdb") or (A_LoopFileExt="mkv") or (A_LoopFileExt="mp3") or (A_LoopFileExt="pas") or (A_LoopFileExt="rar") or (A_LoopFileExt="txt") or (A_LoopFileExt="rmvb") or (A_LoopFileExt="vbs") or (A_LoopFileExt="zip"))
importantmark:="2_"
;~ MsgBox,% A_LoopFileSizeMB
IfGreater,A_LoopFileSizeMB,500
importantmark:="3_Big500MB_"
;~ 如果当前文件是此脚本本身那么跳过当前循环的剩余部分并继续下一次循环递归遍历穷举文件
if(A_ScriptFullPath=A_LoopFileFullPath)
{
continue
}
;~ 如果当前脚本所在目录没有当前循环的文件则直接移动文件并继续下一个循环
IfNotExist,%A_ScriptDir%\!Classify\%importantmark%%A_LoopFileExt%\%A_LoopFileName%
{
IfNotExist,%A_ScriptDir%\!Classify\%A_LoopFileExt%
FileCreateDir,%A_ScriptDir%\!Classify\%importantmark%%A_LoopFileExt%
FileMove,%A_LoopFileFullPath%,%A_ScriptDir%\!Classify\%importantmark%%A_LoopFileExt%\%A_LoopFileName%
Sleep,9
continue
}
;;如果当前循环的文件就在当前脚本所在目录中那么跳过当前循环的剩余部分并继续下一次循环
ScriptDirLoopFileName=%A_ScriptDir%\!Classify\%importantmark%%A_LoopFileExt%\%A_LoopFileName%
if( ScriptDirLoopFileName=A_LoopFileFullPath)
{
continue
}
;~ MsgBox,%A_LoopFileFullPath%
;~ 重命名重复文件
DuplicateFileCount:=1
loop
{
IfExist,%A_ScriptDir%\!Classify\%importantmark%%A_LoopFileExt%\%DuplicateFileCount%_%A_LoopFileName%
{
DuplicateFileCount=% ++DuplicateFileCount
continue
}
else
{
IfNotExist,%A_ScriptDir%\!Classify\%A_LoopFileExt%
FileCreateDir,%A_ScriptDir%\!Classify\%importantmark%%A_LoopFileExt%
FileMove,%A_LoopFileFullPath%,%A_ScriptDir%\!Classify\%importantmark%%A_LoopFileExt%\%DuplicateFileCount%_%A_LoopFileName%
Sleep,9
break
}
}
}
MsgBox, 64, , %A_ScriptDir%"All Files in ScriptDir is Classifyed And Arranged"`n"恭喜你, 已经按照文件类型完成所有当前脚本所在目录和子目录中文件的分类整理"!
;~ MsgBox, 64, , "操作失败的文件共有"%ErrFileCount%"个,详细出错原因列表见ErrFileList.txt文件"!
return
; ========== 此行是此AutoHotkey脚本的代码块段落分隔行 ==========
; 强制自身进程以 管理员权限 或 普通权限 或 ANSI 或 U32 或 U64 版本运行。
; 例1: runwith("admin","u32") 强制自身以 u32 + 管理员权限 运行。
; 例2: runwith("","ansi") 强制自身以 ansi 版本运行(权限不变)。
; 例3: runwith("normal") 强制自身以 普通权限 运行(版本不变)。
RunWith(RunAsAdmin:="Default", ANSI_U32_U64:="Default")
{
; 格式化预期的模式
switch, RunAsAdmin
{
case "Normal","Standard","No","0": RunAsAdmin:=0
case "Admin","Yes","1": RunAsAdmin:=1
case "default": RunAsAdmin:=A_IsAdmin
default: RunAsAdmin:=A_IsAdmin
}
switch, ANSI_U32_U64
{
case "A32","ANSI","A": ANSI_U32_U64:="AutoHotkeyA32.exe"
case "U32","X32","32": ANSI_U32_U64:="AutoHotkeyU32.exe"
case "U64","X64","64": ANSI_U32_U64:="AutoHotkeyU64.exe"
case "default": ANSI_U32_U64:="AutoHotkey.exe"
default: ANSI_U32_U64:="AutoHotkey.exe"
}
; 获取传递给 “.ahk” 的用户参数(不是 /restart 之类传递给 “.exe” 的开关参数)
for k, v in A_Args
{
if (RunAsAdmin=1)
{
; 转义所有的引号与转义符号
v:=StrReplace(v, "\", "\\")
v:=StrReplace(v, """", "\""")
; 无论参数中是否有空格,都给参数两边加上引号
; Run 的内引号是 "
ScriptParameters .= (ScriptParameters="") ? """" v """" : A_Space """" v """"
}
else
{
; 转义所有的引号与转义符号
; 注意要转义两次 Run 和 RunAs.exe
v:=StrReplace(v, "\", "\\")
v:=StrReplace(v, """", "\""")
v:=StrReplace(v, "\", "\\")
v:=StrReplace(v, """", "\""")
; 无论参数中是否有空格,都给参数两边加上引号
; RunAs.exe 的内引号是 \"
ScriptParameters .= (ScriptParameters="") ? "\""" v "\""" : A_Space "\""" v "\"""
}
}
; 判断当前 exe 是什么版本
if (!A_IsUnicode)
RunningEXE:="AutoHotkeyA32.exe"
else if (A_PtrSize=4)
RunningEXE:="AutoHotkeyU32.exe"
else if (A_PtrSize=8)
RunningEXE:="AutoHotkeyU64.exe"
; 运行模式与预期相同,则直接返回。 ANSI_U32_U64="AutoHotkey.exe" 代表不对 ahk 版本做要求。
if (A_IsAdmin=RunAsAdmin and (ANSI_U32_U64="AutoHotkey.exe" or ANSI_U32_U64=RunningEXE))
return
; 如果当前已经是使用 /restart 参数重启的进程,则报错避免反复重启导致死循环。
else if (RegExMatch(DllCall("GetCommandLine", "str"), " /restart(?!\S)"))
{
预期权限:=(RunAsAdmin=1) ? "管理员权限" : "普通权限"
当前权限:=(A_IsAdmin=1) ? "管理员权限" : "普通权限"
ErrorMessage=
(LTrim
预期使用: %ANSI_U32_U64%
当前使用: %RunningEXE%
预期权限: %预期权限%
当前权限: %当前权限%
程序即将退出。
)
MsgBox 0x40030, 运行状态与预期不一致, %ErrorMessage%
ExitApp
}
else
{
; 获取 AutoHotkey.exe 的路径
SplitPath, A_AhkPath, , Dir
if (RunAsAdmin=0)
{
; 强制普通权限运行
switch, A_IsCompiled
{
; %A_ScriptFullPath% 必须加引号,否则含空格的路径会被截断。%ScriptParameters% 必须不加引号,因为构造时已经加了。
; 工作目录不用单独指定,默认使用 A_WorkingDir 。
case, "1": Run, RunAs.exe /trustlevel:0x20000 "\"%A_ScriptFullPath%\" /restart %ScriptParameters%",, Hide
default: Run, RunAs.exe /trustlevel:0x20000 "\"%Dir%\%ANSI_U32_U64%\" /restart \"%A_ScriptFullPath%\" %ScriptParameters%",, Hide
}
}
else
{
; 强制管理员权限运行
switch, A_IsCompiled
{
; %A_ScriptFullPath% 必须加引号,否则含空格的路径会被截断。%ScriptParameters% 必须不加引号,因为构造时已经加了。
; 工作目录不用单独指定,默认使用 A_WorkingDir 。
case, "1": Run, *RunAs "%A_ScriptFullPath%" /restart %ScriptParameters%
default: Run, *RunAs "%Dir%\%ANSI_U32_U64%" /restart "%A_ScriptFullPath%" %ScriptParameters%
}
}
ExitApp
}
}
; ========== 此AutoHotkey脚本到此行结束 ==========
第6步:批量将多个文件按指定数量分配到多个文件夹里
访问存放过多文件的文件夹时会速度缓慢或者电脑卡死
所以有必要把大量文件分成多份并分别保存在不同的子文件夹中
; ========== 此bat批处理脚本从此行开始 ==========
rem 批量将多个文件按指定数量分配到多个文件夹里的批处理脚本文件
@echo off
setlocal enabledelayedexpansion
set fileNum=1000
set fileID=0
set folderPre=MyFolder
set folderSuf=0
for /f "delims=" %%a in ('dir /b /a-d') do (
set /a mod=!fileID! %% %fileNum%
if "!mod!" == "0" (
set /a folderSuf+=1
md "%folderPre%_!folderSuf!"
)
set /a fileID+=1
copy "%%a" "%folderPre%_!folderSuf!\"
move "%%a" "%folderPre%_!folderSuf!\"
)
; ========== 此bat批处理脚本到此行结束 ==========
第7步:上传整理好的文件夹
使用 WinSCP 版本: 5.21.2 异地远程连接群晖NAS的WebDAV Server(DDNS动态域名解析,无线路由器服务端口映射转发)并上传整理好的文件夹 \应整理的文件 到
Synology 群晖 NAS
第8步:文档、表格和图片等办公文件的管理方案
一、键盘输入、经常使用或者需要与他人共享的文件保存在用微信扫码登录的" 金山文档 " 客户端。
二、除了金山文档中的文档表格外,其他文件保存在
Synology 群晖 NAS
三、需要高速读写编辑的文件(例如:视频素材、大型软件源代码等等)保存在 SanDisk 闪迪 E81 移动固态硬盘 4TB 并用 GoodSync Version 12.0.2.2 定时单向同步上传文件到 Synology 群晖 NAS
除了以上3个文件筛选分类整理收纳保存位置以外,严禁把文件保存在其他位置(电脑桌面等位置只可用于临时存放文件),所有电子文件都集中统一筛选分类整理收纳保存在以上3个位置。
电子文件的筛选分类整理收纳保存方式方法应当以能够在今后快速高效的找到并使用所需文件为标准。
能够快速高效的找到文件的存放方式方法就是好的文件保存方案。
合情合理的,合适恰当的,让人看着舒服舒适的文件保存方法就是好的文件保存方案。
第9步:清理以上3个位置以外的,其他位置的文档、表格和图片等办公文件
所有文档、表格和图片等办公文件只保存在以上3个位置,其他位置不保存2文档表格图片,原来分散保存的文档表格图片应当彻底整理并清理删除。
; ========== 此AutoHotkey脚本从此行开始 ==========
; 批量删除群晖NAS中的办公文档、办公表格和办公图片(*.doc;*.docx;*.xls;*.xlsx;*.jpg;*.png)
#SingleInstance,Ignore
loop,5
{
DetectHiddenWindows,On
Sleep,5
IfWinExist,QQ595076941_fenlei
ExitApp
}
Gui, Show, Hide,QQ595076941_fenlei
runwith("admin","ansi") ;强制自身以 ansi + 管理员权限 运行。
#Persistent
; #NoTrayIcon
DetectHiddenWindows,On
SetTitleMatchMode,2
; ========== 此行是此AutoHotkey脚本的代码块段落分隔行 ==========
; 批量操作之前请仔细检查一下,防止误删误改丢失重要文件
;~ 在大批量删除文件之前必需先询问一下
MsgBox, 4, , "Loop All Files in ScriptDir"`n"是否立即批量删除群晖NAS中的办公文档和办公表格?"`n`ncontinue?
IfMsgBox, No
ExitApp
;~ 在大批量删除文件之前必需再次询问一下
MsgBox, 4, , "Loop All Files in ScriptDir"`n"是否立即批量删除群晖NAS中的办公文档和办公表格?"`n`ncontinue?
IfMsgBox, No
ExitApp
loop,6
{
loop,Files,Z:\020-硬盘5-Hyper-Backup单一版本单向备份到此文件夹-Basic池\*,R ;递归遍历穷举文件夹和子文件夹中的文件
{
; 可在 loop,Files 文件循环中使用的特殊变量请阅读 AutoHotkey 中文帮助 CHM 文档
; 需要时,可以使用表达式对获取的变量做进一步计算转换加工运算
; A_LoopFileName 当前获取的文件或文件夹的名称(不含路径).
; A_LoopFileExt 当前文件的扩展名(例如 TXT, DOC 或 EXE). 不含句点(.).
; A_LoopFilePath 当前获取的文件/文件夹的路径和名称.
if((A_LoopFileExt="docx") or(A_LoopFileExt="xlsx") or (A_LoopFileExt="doc") or(A_LoopFileExt="xls") or (A_LoopFileExt="jpg") or(A_LoopFileExt="png"))
{
; FileMove
FileDelete,%A_LoopFileFullPath%
}
}
;
loop,Files,Z:\030-硬盘6-Cloud-Sync单向同步到此文件夹-Basic池\*,R ;递归遍历穷举文件夹和子文件夹中的文件
{
if((A_LoopFileExt="docx") or(A_LoopFileExt="xlsx") or (A_LoopFileExt="doc") or(A_LoopFileExt="xls") or (A_LoopFileExt="jpg") or(A_LoopFileExt="png"))
{
; FileMove
FileDelete,%A_LoopFileFullPath%
}
}
}
MsgBox, 64, , %A_ScriptDir%"All Files in ScriptDir is Classifyed And Arranged"`n"恭喜你, 已经批量删除Synology群晖NAS中的办公文档、办公表格和办公图片"!
return
; ========== 此行是此AutoHotkey脚本的代码块段落分隔行 ==========
; 强制自身进程以 管理员权限 或 普通权限 或 ANSI 或 U32 或 U64 版本运行。
; 例1: runwith("admin","u32") 强制自身以 u32 + 管理员权限 运行。
; 例2: runwith("","ansi") 强制自身以 ansi 版本运行(权限不变)。
; 例3: runwith("normal") 强制自身以 普通权限 运行(版本不变)。
RunWith(RunAsAdmin:="Default", ANSI_U32_U64:="Default")
{
; 格式化预期的模式
switch, RunAsAdmin
{
case "Normal","Standard","No","0": RunAsAdmin:=0
case "Admin","Yes","1": RunAsAdmin:=1
case "default": RunAsAdmin:=A_IsAdmin
default: RunAsAdmin:=A_IsAdmin
}
switch, ANSI_U32_U64
{
case "A32","ANSI","A": ANSI_U32_U64:="AutoHotkeyA32.exe"
case "U32","X32","32": ANSI_U32_U64:="AutoHotkeyU32.exe"
case "U64","X64","64": ANSI_U32_U64:="AutoHotkeyU64.exe"
case "default": ANSI_U32_U64:="AutoHotkey.exe"
default: ANSI_U32_U64:="AutoHotkey.exe"
}
; 获取传递给 “.ahk” 的用户参数(不是 /restart 之类传递给 “.exe” 的开关参数)
for k, v in A_Args
{
if (RunAsAdmin=1)
{
; 转义所有的引号与转义符号
v:=StrReplace(v, "\", "\\")
v:=StrReplace(v, """", "\""")
; 无论参数中是否有空格,都给参数两边加上引号
; Run 的内引号是 "
ScriptParameters .= (ScriptParameters="") ? """" v """" : A_Space """" v """"
}
else
{
; 转义所有的引号与转义符号
; 注意要转义两次 Run 和 RunAs.exe
v:=StrReplace(v, "\", "\\")
v:=StrReplace(v, """", "\""")
v:=StrReplace(v, "\", "\\")
v:=StrReplace(v, """", "\""")
; 无论参数中是否有空格,都给参数两边加上引号
; RunAs.exe 的内引号是 \"
ScriptParameters .= (ScriptParameters="") ? "\""" v "\""" : A_Space "\""" v "\"""
}
}
; 判断当前 exe 是什么版本
if (!A_IsUnicode)
RunningEXE:="AutoHotkeyA32.exe"
else if (A_PtrSize=4)
RunningEXE:="AutoHotkeyU32.exe"
else if (A_PtrSize=8)
RunningEXE:="AutoHotkeyU64.exe"
; 运行模式与预期相同,则直接返回。 ANSI_U32_U64="AutoHotkey.exe" 代表不对 ahk 版本做要求。
if (A_IsAdmin=RunAsAdmin and (ANSI_U32_U64="AutoHotkey.exe" or ANSI_U32_U64=RunningEXE))
return
; 如果当前已经是使用 /restart 参数重启的进程,则报错避免反复重启导致死循环。
else if (RegExMatch(DllCall("GetCommandLine", "str"), " /restart(?!\S)"))
{
预期权限:=(RunAsAdmin=1) ? "管理员权限" : "普通权限"
当前权限:=(A_IsAdmin=1) ? "管理员权限" : "普通权限"
ErrorMessage=
(LTrim
预期使用: %ANSI_U32_U64%
当前使用: %RunningEXE%
预期权限: %预期权限%
当前权限: %当前权限%
程序即将退出。
)
MsgBox 0x40030, 运行状态与预期不一致, %ErrorMessage%
ExitApp
}
else
{
; 获取 AutoHotkey.exe 的路径
SplitPath, A_AhkPath, , Dir
if (RunAsAdmin=0)
{
; 强制普通权限运行
switch, A_IsCompiled
{
; %A_ScriptFullPath% 必须加引号,否则含空格的路径会被截断。%ScriptParameters% 必须不加引号,因为构造时已经加了。
; 工作目录不用单独指定,默认使用 A_WorkingDir 。
case, "1": Run, RunAs.exe /trustlevel:0x20000 "\"%A_ScriptFullPath%\" /restart %ScriptParameters%",, Hide
default: Run, RunAs.exe /trustlevel:0x20000 "\"%Dir%\%ANSI_U32_U64%\" /restart \"%A_ScriptFullPath%\" %ScriptParameters%",, Hide
}
}
else
{
; 强制管理员权限运行
switch, A_IsCompiled
{
; %A_ScriptFullPath% 必须加引号,否则含空格的路径会被截断。%ScriptParameters% 必须不加引号,因为构造时已经加了。
; 工作目录不用单独指定,默认使用 A_WorkingDir 。
case, "1": Run, *RunAs "%A_ScriptFullPath%" /restart %ScriptParameters%
default: Run, *RunAs "%Dir%\%ANSI_U32_U64%" /restart "%A_ScriptFullPath%" %ScriptParameters%
}
}
ExitApp
}
}
; ========== 此AutoHotkey脚本到此行结束 ==========
[代码运行效果截图]
[源代码打包下载]