使用c语言批量修改乱码文件名

转到Linux下多数朋友遇到的第一个问题可能就是中文的显示问题了,比如界面的中文显示成乱码,但是经过下载和安装相应的字体后这种问题就会迎刃而解,但有时也会遇到另一类乱码问题,比如下载的文件夹中文件的名称是乱码

这个问题的出现多数是因为Windows对中文处理时所使用的字符编码是GBK而Linux下通常是UTF-8,由于使用文件夹或文件的名称使用的是GBK编码的,所以在Linux下(默认为UTF-8编码)自然会显示成乱码,除非你的Linux同样是使用GBK作为默认编码。

 

看着这一堆乱码不明所以,所以必需要将它们转换成“正常”的,根据上面的介绍那么处理起来思路就很简单了,那就是将文件名进行编码转换,然后将文件名更改为转换后的字符串。要怎么做呢?在Linux下我们可以这样简单地来做

 

 

这里以只有一个乱码文件为例,如果有多个的话就会出问题了,当然有多个也并不是太大的问题,比如我们可以一个一个手工地进行转换,可以使用head和tail一次得到一个文件名称,但是这样太过繁琐,所以我们可以使用一个shell脚本来完成,脚本大概会是这样的

 

 

但有时这也并不能完成解决问题,比如如果文件夹中有多个多级文件夹,这样我们可能就需要手工一个一个文件夹去解决问题,或者脚本改一改参数中输入所有需要更改的多级文件夹的文件名,所以这个问题貌似还是可以克服的嘛,但另一个问题就又来了,那就是文件名称中如果包括空格等特殊字符怎么办?

for … in ..结构中对字符串的分隔是以空白符做分割的(应该是这样吧,本人对shell脚本不懂),所以当文件名中包括空格这样的特别字符的话脚本就会失效,表现为以空格符为分割符取得了一个“新”的文件名,而显然这个文件是不存在的,比如有个文件名是1 2.txt,这时使用ls与for .. in ..结构时读取出来的文件名会是1以及2.txt,显然就不对了,我试过加双引号以及单引号来解决这个问题,可是我失败了,我想这应该和我的shell编程水平有关吧,对shell编程我就是个绝对的门外汉,也就写个hello world这样的东西了。所以基于此,决定使用c语言来写这个程序。

 

使用c语言的好处就是上面的问题都可以解决了,但使用c语言的坏处就是比shell脚本要复杂一点,因为我们要处理的不仅仅是字符编码的转换与文件名的重命名,也包括对多级文件夹的遍历,其实这很简单了,不过相对于shell脚本来说,就单代码量而言就要多得多。

 

遍历一个多级文件夹有什么好方法,第一个想到的就是递归函数了,需要注意的是递归中对文件夹的判断以及文件夹位置的移动与记录,只要这个处理好,程序就相当简单了,下面以一个实例来说明。

 

1
这个文件夹的名称就是一个乱码

2
进入这个文件夹后我们可以看到文件名称全是乱码

3
经过编码转换后我们看到了它的“真面目”

4
我们进入到其中的一个文件夹中去可以看到在这个文件夹中有拥有带有空格的文件名称

 

5
现在我们使用我们写的转换程序进行重命名(程序代码稍后给出)

6
再查看一下文件夹名称已经正确地更改过来了

7
我们来看看该文件夹中的文件名称是否也已经正确更改

8
最后我们去看看那个拥有空格文件名称的文件是否已经正确更改

 

很好,正像我们所期盼的那样,现在所有的文件名称都已经“正常”了。

下面放上c语言转换程序的代码

 

–阅读次数(56)

发表评论

电子邮件地址不会被公开。

*