Board logo

标题: [原创教程] [总结]Perl在遇到Unicode字符文件名时的各种处理方法 [打印本页]

作者: 523066680    时间: 2015-3-27 11:37     标题: [总结]Perl在遇到Unicode字符文件名时的各种处理方法

本帖最后由 523066680 于 2015-3-27 15:28 编辑

环境 XP/WIN7  Perl v5.16
编辑整理:523066680

常见的那些文件操作函数都不支持,于是为了达到目的,需要各种方法配合,应该是不如其他语言方便。
我只是想看看Perl到底是否适合做这件事,于是折腾了一回。

文件的建立:


目录的建立

文件的枚举


复制某个文件夹内的文件(文件名含unicode字符)


判断文件是否存在:


重命名:


获取文件的日期信息:

作者: CrLf    时间: 2015-3-27 16:07

原来 perl 这么麻烦。。
作者: 523066680    时间: 2015-3-27 16:27

本帖最后由 523066680 于 2015-3-27 16:32 编辑

回复 2# CrLf


     然后用Perl撸了一个将备份目录和源目录之间差异的文件进行提取的脚本。
准备改撸C艹但是估计要好长时间摸索了

作者: CrLf    时间: 2015-3-27 16:37

差异文本是什么概念,以什么为依据?
作者: 523066680    时间: 2015-3-27 16:40

本帖最后由 523066680 于 2015-3-27 16:59 编辑

回复 4# CrLf


    文件,不是文本。
用Robocopy的做目录同步的时候,如果选择 /MIR模式,会删除、替换三种文件:较旧的文件,较新的文件,多出的文件
然后撸了一个Perl专门提取这三种文件,支持unicode字符的路径、文件名

之前看到论坛有人介绍 SyncToy,试了一下,可以保留同步过程中被删除的文件,但是被统一存放在垃圾桶里…… 并且不包含目录结构
作者: 523066680    时间: 2015-5-23 08:42

回复 6# tigerpower


    感谢分享,省了很多繁琐。
作者: 523066680    时间: 2017-3-12 11:32

本帖最后由 523066680 于 2017-3-12 11:38 编辑

tigerpower 曾经在这里回复推荐了  Win32::Unicode,然后他自己删了帖。

我以前执着于用自带的模块做文件系统的事情,现在想想真没必要,应该怎么方便怎么来。

这里重新补充

http://bbs.bathome.net/redirect. ... 89&fromuid=3337
  1. use Win32::Unicode;
  2. use utf8;
  3. my $dirname="CreateDir・测试";
  4. my $dirname_long="CreateDir・测试1/CreateDir・测试2/CreateDir・测试3";
  5. my $dirname_new="CreateDir・测试・新";
  6. my $filename="CreateFile・测试";
  7. mkdirW $dirname;
  8. chdirW $dirname;
  9. mkpathW $dirname_long;
  10. $fh = Win32::Unicode::File->new('>', $filename);
  11. $fh->close;
  12. chdirW $dirname_long;
  13. touchW $filename.'1';
  14. chdirW '../../../..';
  15. cptreeW $dirname.'/',$dirname_new;
复制代码

作者: 523066680    时间: 2019-2-23 18:05

本帖最后由 523066680 于 2019-2-23 18:07 编辑

Chilkat模块亦支持unicode字符路径,而且还挺好用(这个模块很早就知道了,官网示例很齐全,就是没怎么用过)

CkDirTree参考文档
dirTree_iterate示例

对官方示例稍作修改,通过 put_Utf8 打开编码开关:
  1. use chilkat();
  2. use File::Slurp;
  3. $dirTree = chilkat::CkDirTree->new();
  4. $dirTree->put_BaseDir("F:/temp/UPathTest");
  5. $dirTree->put_Recurse(1);
  6. $dirTree->put_Utf8(1);
  7. $success = $dirTree->BeginIterate();
  8. if ($success != 1) {
  9.     print $dirTree->lastErrorText() . "\r\n";
  10.     exit;
  11. }
  12. my $buff = "";
  13. while ($dirTree->get_DoneIterating() != 1)
  14. {
  15.     $buff .= $dirTree->fullPath() . "\r\n";
  16.     #  Advance to the next file or sub-directory in the tree traversal.
  17.     $success = $dirTree->AdvancePosition();
  18.     if ($success != 1) {
  19.         if ($dirTree->get_DoneIterating() != 1) {
  20.             print $dirTree->lastErrorText() . "\r\n";
  21.             exit;
  22.         }
  23.     }
  24. }
  25. write_file("Files.txt", {"binmode"=>":raw"}, $buff );
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2