可以实现批量在给文件命名不能包含哪几个字符名每个字符前添加固定字符吗?

批量修改文件名官方版是一款非常实用的修改文件名的软件,可批量删除文件名中的指定字符,或者从文件名中指定位置删除多个字符。当我们生活中遇到需要大批量文件要改后缀名、字符或者一些字符的时候,都可以使用这款软件进行修改,批量修改文件名可批量给文件名编号,自定义序号的位置,也支持序号前补零,可批量对文件扩展名进行更改,支持扩展名大小写转换,双击打开就能使用。使用起来也是非常的简单,喜欢的小伙伴快来下载使用吧!

批量修改文件名功能介绍

1、批量修改文件名可批量删除文件名中的指定字符,或者从文件名中指定位置删除多个字符。

2、可批量替换文件名中的字符。

3、可批量在文件名前添加字符,或在文件名后添加字符。

4、可批量给文件名编号,自定义序号的位置,也支持序号前补零。

5、可批量对文件扩展名进行更改,支持扩展名大小写转换。

6、可批量更改文件名后缀,批量修改后缀名。

7、可批量更改图片名称。

批量修改文件名注意事项

1、下载完成后不要在压缩包内运行软件直接使用,先解压

2、软件同时支持32位64位运行环境

3、如果软件无法正常打开,请右键使用管理员模式运行

批量修改文件名更新日志

1、批量修改文件名官方版增加随机乱序命名功能,修改起始序号可设为0或负数。

2、修复相同文件名,不同扩展名会判断为同一文件的问题。

3、修改左下角捐赠按钮显示方式。

前几天在网上下载了一堆教程,但是名字是用中文数字命名的,在windows文件管理下无法按数字顺序进行排序,这让强迫症的我很不爽,所以就想写个程序批量修改一下。

作为C++小白的我,花了好长时间,终于大致搞明白了。因为路径名和文件名都涉及到中文字符,所以花了很长时间,走了很多弯路,于是想写篇博客记录一下心路历程。

以后可能会经常写博客来记录一些学习心得(希望能坚持下来),也方便以后查阅。

本篇文章主要介绍用C++读取和修改文件名的方法,提供将中文数字修改为两位阿拉伯数字的算法,并介绍C++中对于中文字符(串)的处理。

第一次写,如有错误不当之处,敬请批评指正。


但是,由于路径名和文件名都涉及到中文字符,所以单纯使用这几个函数会出现乱码等问题,为了方便,统一使用宽字符wchar_t、宽字符串wstring,以及宽字符下的_wfindfirst、_wfindnext、_wfindclose函数。
这些数据类型和普通类型功能都是一样的,唯一不同的是底层的存储。为了方便,在读取和修改文件名部分使用普通类型来说明。

先声明一个结构体_finddata_t,用来存储文件信息,但无需初始化。然后可以使用三个函数来读取文件名。注意需要包含头文件< io.h >

其中attrib指的是文件属性(attribute),有以下六种:

三个函数的使用方法如下:

如果查找成功的话,将返回一个intptr_t型的唯一的查找用的句柄,实际上相当于int。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。 这个字符串要包括完整的路径名。
fileinfo :这里就是用来存放文件信息的结构体的指针。已经说过,这个结构体必须在调用此函数前声明。
函数成功后,函数会把找到的文件的信息放入这个结构体中。

注意:如果将返回值赋给long型变量,有时可能会出现编译不通过的问题,因为这个函数的返回值实际上是intptr_t而不是long,可能会造成类型不兼容。这时候把定义的long型变量改为intptr_t即可。

为了解决中文路径的问题,实际使用的是兼容中文字符的_wfinddata_t结构体,以及_wfindfirst、_wfindnext、_wfindclose三个函数,与不带w的几个函数功能完全相同,只是路径名参数也必须使用宽字符以兼容。

注意:此函数不支持宽字符类型的重载,因此中文在使用时还要转换为普通字符串。

一开始在网上找过一份批量改名的源码,虽然是用C++写的但是C风格特别浓重(分配内存用的是malloc/free且大量使用C风格字符串),这让我一个没有系统学习过C的人看着比较难受,所以又大改了一下,基本全部改为了使用string类(实际上是wstring类)的方法。

C/C++中对于字符串处理的常用函数有:

而在C++的string类中,可以用重载的+、=实现字符串连接和复制的功能,且有常用的几个成员函数:

在字符串的末尾添加文本
将字符串以C字符数组的形式返回
返回字符串中字符的数量

这里只列出了修改文件名可能用到的一些函数,string类包含的成员函数远不止这么多,具体可以查阅手册。

对于中文字符的处理其实十分简单,只需要把char改为wchar_t类型,string改为wstring类型即可,二者的功能几乎是完全一样的,只需要注意以下不同:

1、C语言是不支持宽字符类型的,C风格字符串的strcat、strcpy等函数在使用宽字符时,只需把str改为wcs,即函数名写成wcscat、wcscpy等即可。

2、若要在控制台输出宽字符/宽字符串,必须使用宽字节流对象wcin、wcout,并且要绑定为中文地区语言。
在使用前加入以下代码即可(一次即可):


 
3、对于string、wstring类各自来说,成员函数length()、size()以及C风格的strlen()功能是完全相同的,都是返回该字符串除结束符外的字符数量。但是对于string类(每个字符是char)来说,英文和数字是占1个字节,算作一个字符,汉字是占两个字节,算作两个字符。而对于wstring类(每个字符是wchar_t),无论中文、英文、数字,都是占两个字节,算作一个字符。






这里顺带一提sizeof操作符。相比较strlen()等,sizeof更像一种特殊的编译预处理而非函数,因为它的值是在编译阶段就确定的。如果对一个字符串str使用sizeof,是计算其指针所占的字节数,而字符串本身所占的空间是在堆内存分配的。在vs2017下编译,sizeof(string)和sizeof(wstring)的值都是28(这一点对于不同的库可能有所不同),而sizeof(string.c_str())和sizeof(wstring.c_str())的值都是4。


更多关于char、wchar_t的不同,如二者在底层的编码方式,以及关于ASCII、Unicode等问题,可以参考这篇文章:


宽字符与普通类型的转换

 
 
由于rename函数不支持宽字节作为参数,所以还要考虑二者相互转换的问题。关于这部分这篇文章讲的很详细:
此处限于篇幅不再赘述。

将中文数字转换为阿拉伯数字

 
 
最后提供将中文转换为阿拉伯数字的思路。由于我下载的文件全都是一百以内的编号,所以写的时候是全部转换为两位数字,而一位数如5命名为05,算法比较简单。具体的思路就是,先找到字符十,如果没有就依次寻找一~九,找到了看前后有无数字,然后决定十字是改为1还是直接删除。如果都没有,函数返回0。
完整代码如下,VS2017环境下编译:
 
 
 
 
 
 
 
 
关于更完善的数字转换算法,可以参考这个代码,不过是用Java写的:
 


python 批量处理nc文件-字符串拼接文件,有规律文件名

观察文件发现这些文件名有一定的重复,重复的地方我们可以用字符串表示,不一样的地方可以用通配符(*)表示。


 

关注本站官方公众号:程序员总部,领取三大福利! 福利一:python和前端辅导 福利二:进程序员交流微信群,专属于程序员的圈子 福利三:领取全套零基础视频教程(python,java,前端,php)
关注公众号回复python,免费领取全套python视频,回复充值+你的账号,免费为您充值1000积分

  

所属网站分类: 技术文章 >


我要回帖

更多关于 给文件命名不能包含哪几个字符 的文章

 

随机推荐