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

  • 看了一下还不错,但不是自己想要的,谢谢楼主

  • 山穷水尽疑无路,真正制作

  • 谁能告诉我怎么用??都没有使用说明的,用不了,不信的可以下载试试

    把“添加前后缀及去掉前后n个字符.exe”可执行程序拷贝到你要批量修改的文件相同的文件夹下,打开“配置文件.TXT”文件,把要要批量修改的文件名都放置到改文件夹下,保存,运行可执行文件,如果想增加前缀或者去掉文件名前n个字符,就选择前缀,如果想在在文件前加上您要批量修改的字符,在追加前缀文本框里填上要追加的字符,点击“文件名加/去前缀”按钮即可完成,如果想去掉文件名前3个字符,点击选中“前缀”和“去掉文件名前n字符”,然后点击“文件名加/去前缀”按钮即可完成,追加后缀和去掉后缀同前缀类似。如有不懂之处可以qq我

  • 这个用了,确实可以用~

  • 版本号: 2.0程序库才能运行。

    #批量修改文件名缤纷软件清爽版截图

前几天在网上下载了一堆教程,但是名字是用中文数字命名的,在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写的:
 

我要回帖

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

 

随机推荐