好友
阅读权限30
听众
最后登录1970-1-1
|
本帖最后由 onlyclxy 于 2024-8-20 15:56 编辑
这次这个很小众了.
先介绍下写这个的背景:
就是比如纯数字的文件名,位数不一样话 按文件名排列的话会按首字符排列. 比如正常播放顺序是
1.mp4
2.mp4
3.mp4
....
99.mp4
如果按着文件名排 则可能会变成
1.mp4
10.mp4
11.mp4
12.mp4
13.mp4
...
18.mp4
19.mp4
2.mp4
20.mp4
21.mp4
22.mp4
...
99.mp4
这样的话,到播放器里就跳集了. 第一集直接播到第10集. 如果数字位数一致的话. 就不会有这个问题了.
比如
001.mp4
002.mp4
003.mp4
这种到各种播放器也能按自然数顺序播放了,不会出现跳集的情况
所以遇到这种纯数字的视频.把文件名的位数补到一致,可以方便的按文件名排序.从而在各个播放器里顺序播放视频文件.
然后是最近一阵看短剧.找到的一些短剧资源.文件名都是这种位数不一致的文件名. 导致播放的时候顺序有点乱
遂写了这个,来统一文件名
我这边短剧的文件名,多是纯数字文件,比如1.mp4 2.mp4 ..挂载到本地硬盘后, 播放器不太方便读取到正确顺序的目录. 然后就写了这个专用的改名工具
用于把纯数字的文件名,补位到三位数
改001.mp4 002.mp4 等..
非纯数字的文件名,不做处理
可以撤销一次重命名
用法也特别固定. 我这边Alist+Raidrive挂载到本地硬盘后,, 直接把挂载整个短剧的目录拖过来按回车就行了.
这个这两天用这个确实挺方便..所以发上来..
另外说一下, 另外我后来也找到个专业的改名软件,也可以补位.ReNamer.这个 论坛可以搜到.这个我试了试. 感觉不如这个流畅. 那个软件拖整体目录后. 改名会卡主界面半天.
因为他是一次性改名,而挂载的文件读取比较慢. 越是大量文件那个软件卡的时间越久.
[C#] 纯文本查看 复制代码 using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 短剧层级改名
{
class Program
{
// 用于保存原始文件名和新文件名的字典,方便撤回
static Dictionary<string, string> renamedFiles = new Dictionary<string, string>();
static void Main(string[] args)
{
// 默认补位长度为3
int paddingLength = 3;
while (true)
{
// 提示用户输入文件夹路径
Console.WriteLine("短剧层级改名,补到3位");
Console.WriteLine("请输入要补位的文件夹路径(输入“撤回”以撤销上次改名操作,输入“退出”以结束程序):");
string input = Console.ReadLine().Trim('"'); // 去掉双引号
// 检查用户是否输入了“退出”
if (input.Equals("退出", StringComparison.OrdinalIgnoreCase))
{
break;
}
// 检查用户是否输入了“撤回”
if (input.Equals("撤回", StringComparison.OrdinalIgnoreCase))
{
UndoLastRename();
continue;
}
// 检查输入的路径是否有效
if (Directory.Exists(input))
{
var files = Directory.GetFiles(input, "*.*", SearchOption.AllDirectories);
var predictedNames = PredictNewNames(files, paddingLength);
if (CheckForNameConflicts(predictedNames))
{
Console.WriteLine("改名操作检测到文件名冲突,操作被取消。");
continue;
}
// 处理文件夹及子目录中的文件
RenameFiles(input, paddingLength);
}
else
{
Console.WriteLine("无效的路径,请重新输入。");
}
}
}
static List<string> PredictNewNames(string[] files, int paddingLength)
{
List<string> predictedNames = new List<string>();
foreach (var file in files)
{
// 获取不带扩展名的文件名
string fileName = Path.GetFileNameWithoutExtension(file);
string fileExtension = Path.GetExtension(file);
// 检查文件名是否为纯数字
if (int.TryParse(fileName, out int numericFileName))
{
// 判断是否需要补位
if (fileName.Length < paddingLength)
{
// 用前导零填充数字文件名
string paddedFileName = numericFileName.ToString().PadLeft(paddingLength, '0');
// 生成新的文件路径
string newFilePath = Path.Combine(Path.GetDirectoryName(file), paddedFileName + fileExtension);
predictedNames.Add(newFilePath);
}
}
}
return predictedNames;
}
static bool CheckForNameConflicts(List<string> predictedNames)
{
// 检查预测名称列表中的重复项
var duplicateFiles = predictedNames.GroupBy(x => x).Where(g => g.Count() > 1).Select(g => g.Key);
if (duplicateFiles.Any())
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("警告:检测到以下文件名冲突,请检查后重新操作:");
foreach (var file in duplicateFiles)
{
Console.WriteLine(file);
}
Console.ResetColor();
return true;
}
// 检查文件系统中的现有文件
foreach (var file in predictedNames)
{
if (File.Exists(file))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"警告:文件 {file} 已经存在,改名操作被取消。");
Console.ResetColor();
return true;
}
}
return false;
}
static void RenameFiles(string directoryPath, int paddingLength)
{
// 清空上次的记录
renamedFiles.Clear();
// 获取目录及子目录中的所有文件
var files = Directory.GetFiles(directoryPath, "*.*", SearchOption.AllDirectories);
foreach (var file in files)
{
try
{
// 获取不带扩展名的文件名
string fileName = Path.GetFileNameWithoutExtension(file);
string fileExtension = Path.GetExtension(file);
// 检查文件名是否为纯数字且需要补位
if (int.TryParse(fileName, out int numericFileName) && fileName.Length < paddingLength)
{
// 用前导零填充数字文件名
string paddedFileName = numericFileName.ToString().PadLeft(paddingLength, '0');
// 生成新的文件路径
string newFilePath = Path.Combine(Path.GetDirectoryName(file), paddedFileName + fileExtension);
// 记录原始文件名和新文件名
renamedFiles.Add(newFilePath, file);
// 重命名文件
File.Move(file, newFilePath);
Console.WriteLine($"目录 {Path.GetDirectoryName(file)} 下的 {fileName}{fileExtension} 重命名为 {paddedFileName}{fileExtension}");
}
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"重命名文件 {file} 时出错:{ex.Message}");
Console.ResetColor();
}
}
Console.WriteLine("重命名完成。");
}
static void UndoLastRename()
{
if (renamedFiles.Count == 0)
{
Console.WriteLine("没有可撤回的操作。");
return;
}
Console.WriteLine("开始撤回操作...");
// 遍历字典并撤回文件名更改
foreach (var entry in renamedFiles)
{
try
{
// 如果新文件名仍然存在,则撤回为原始文件名
if (File.Exists(entry.Key))
{
File.Move(entry.Key, entry.Value);
Console.WriteLine($"目录 {Path.GetDirectoryName(entry.Value)} 下的 {Path.GetFileName(entry.Key)} 撤回为 {Path.GetFileName(entry.Value)}");
}
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"撤回文件 {entry.Key} 时出错:{ex.Message}");
Console.ResetColor();
}
}
// 清空撤回记录
renamedFiles.Clear();
Console.WriteLine("撤回操作完成。");
}
}
}
文件下载地址:
短剧改名.rar - 蓝奏云 (lanzoul.com) |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|