吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2677|回复: 49
收起左侧

[原创工具] 短剧文件重命名补位

  [复制链接]
onlyclxy 发表于 2024-8-20 11:14
本帖最后由 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.这个 论坛可以搜到.这个我试了试. 感觉不如这个流畅. 那个软件拖整体目录后. 改名会卡主界面半天.
因为他是一次性改名,而挂载的文件读取比较慢. 越是大量文件那个软件卡的时间越久.

image.png


[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)

免费评分

参与人数 7吾爱币 +14 热心值 +6 收起 理由
ot1686 + 2 + 1 谢谢@Thanks!
固相膜 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wg521125 + 1 还能这样,原来碰到过这种问题,当时怎么没想到重命名呢,当时一直研究怎么能.
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gorbydon + 1 + 1 我很赞同!
1045837055lucy + 1 + 1 谢谢@Thanks!
zylz9941 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

蒲公英876 发表于 2024-8-20 13:40

同一部短剧,在不同平台片名不同,经常抖音里要付费的短剧,在那个番茄小说app里面都有,就是片名不同,正常搜索短剧的主角名就能找到,番茄里面都是免费看的,现在短剧泛滥,同剧情的好多版本。
Noangler 发表于 2024-8-20 17:21
wensha1 发表于 2024-8-20 11:18
y52pojie 发表于 2024-8-20 11:22
好好好好好
jzyamia 发表于 2024-8-20 11:51
不明白意义
360204878 发表于 2024-8-20 14:40
感谢分享
thisxzs 发表于 2024-8-20 14:44
感谢分享
 楼主| onlyclxy 发表于 2024-8-20 15:45

就是比如纯数字的文件名,位数不一样话 按文件名排列的话会按首字符排列. 比如正常播放顺序是1 2 3 4 5..99 如果按着文件名排 则可能会变成 1  10  11 12 13...19 2 20 21. 这样到播放器里就跳集了. 第一集直接播到第10集. 如果数字位数一致的话. 就不会有这个问题了. 比如 001 002  003这种 各种播放器也能按自然数顺序播放了.
 楼主| onlyclxy 发表于 2024-8-20 15:59
蒲公英876 发表于 2024-8-20 13:40
同一部短剧,在不同平台片名不同,经常抖音里要付费的短剧,在那个番茄小说app里面都有,就是片名不同, ...

对..一个剧情好多团队拍来拍去..
好多剧情都不能细想..
然后我就光挑演员好看的看... 不好看的就跳过了
liang8544 发表于 2024-8-20 16:03
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 07:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表