1. =info
  2.     遍历目录树 支持 Unicode
  3.     Code by 523066680@163.com
  4.     2017-03
  5.    
  6.     V0.5 使用Win32API判断目录硬链接
  7. =cut
  8.  
  9. use utf8;
  10. use Encode;
  11. use Win32API::File qw(GetFileAttributesW FILE_ATTRIBUTE_REPARSE_POINT);
  12. use Win32::Unicode;
  13. use IO::Handle;
  14. STDOUT->autoflush(1);
  15. binmode(STDOUT, ':encoding(gbk)');
  16.  
  17. our $n_files = 0;
  18. our $n_dirs = 0;
  19.  
  20. my $path = "D:/Extra";
  21. func($path, 0);
  22.  
  23. print $n_files ,"\n";
  24. print $n_dirs;
  25.  
  26. sub func
  27. {
  28.     my ($path, $lv) = (shift, shift);
  29.     my $wdir = Win32::Unicode::Dir->new;
  30.     my $code;
  31.     my $next_path;
  32.  
  33.     $wdir->open( $path );
  34.     if ( $wdir->error() =~ /找不到/ )
  35.     {
  36.         print $wdir->error();
  37.         exit;
  38.     }
  39.  
  40.     while ( my $f = $wdir->read() )
  41.     {
  42.         if ( file_type('f', $path. "/" .$f ) )
  43.         {
  44.             print "    "x$lv . "$f\n";
  45.             $n_files++;
  46.         }
  47.  
  48.         next if ($f eq ".");
  49.         next if ($f eq "..");
  50.  
  51.         $next_path = $path. "/" .$f;
  52.  
  53.         if ( file_type('d', $next_path ) )
  54.         {
  55.             $n_dirs++;
  56.             print "    "x$lv . "$f\n";
  57.             $code = GetFileAttributesW( encode('utf16-le', $next_path) ."\x00\x00" );
  58.  
  59.             if ( isLink( $code ) ) { print "skip symbolic link: $f\n"; }
  60.             else                   { func( $next_path,  $lv+1 );       }
  61.         }
  62.  
  63.     }
  64. }
  65.  
  66. sub isLink
  67. {
  68.     return ($_[0] & FILE_ATTRIBUTE_REPARSE_POINT) == FILE_ATTRIBUTE_REPARSE_POINT ?
  69.             1 : 0;
  70. }

遍历目录树 - Unicode 模式的更多相关文章

  1. 可编译为 UNICODE 和 ANSI 版本的遍历目录树程序_0.1

    路径暂时是写死的 编译两个版本的程序: g++  treeT.cpp -municode -D_UNICODE -o treeT_UNIg++  treeT.cpp -o treeT_ASC 为了观察 ...

  2. python 之遍历目录树(可匹配输出特定后缀的文件)

    涉及到的模块有os, fnmatch:1.通过os模块中的方法获取dir.subdir.files,通过os.path.join可拼接成完整路径: 2.fnmatch主要通过fnmatch.fnmat ...

  3. 利用树的先序和后序遍历打印 os 中的目录树

    [0]README 0.1)本代码均为原创,旨在将树的遍历应用一下下以加深印象而已:(回答了学习树的遍历到底有什么用的问题?)你对比下linux 中的文件树 和我的打印结果就明理了: 0.2)我们采用 ...

  4. python遍历目录os.walk(''d:\\test2",topdown=False)

    os.walk(top, topdown=True, onerror=None, followlinks=False)遍历目录,topdown=false表示先返回目录,后返回文件 参数说明: top ...

  5. python GUI编程tkinter示例之目录树遍历工具

    摘录 python核心编程 本节我们将展示一个中级的tkinter应用实例,这个应用是一个目录树遍历工具:它会从当前目录开始,提供一个文件列表,双击列表中任意的其他目录,就会使得工具切换到新目录中,用 ...

  6. WPF 目录树绑定 与 遍历

    定义树节点,(编译环境VS2017) public class GBTreeNode : INotifyPropertyChanged { private string _deviceId = str ...

  7. node.js整理 03文件操作-遍历目录和文本编码

    遍历目录 递归算法 遍历目录时一般使用递归算法,否则就难以编写出简洁的代码. 递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题 function factorial(n) { if (n = ...

  8. SSIS 遍历目录,把文件内容导入数据库

    最近接手一个项目,程序的基本框架是:程序A导出数据,以.tsv格式存储,数据列之间以tab间隔:程序B吃文档,把数据导入到数据库中,并把处理过的文档备份/移动到指定的目录中.为了快速开发,程序B设计成 ...

  9. 05.表达式目录树Expression

    参考文章 https://www.cnblogs.com/xyh9039/p/12748983.html 1. 基本了解 1.1 Lambda表达式 演变过程 using System; namesp ...

随机推荐

  1. jenkins 部署应用

    一,安装rpm包 安装jdk 安装jenkins 查看jdk是否安装成功 启动jenkins systemctl start jenkins 开机自启 systemctl enable jenkins ...

  2. shell 命令之bind,enable,ulimit

    1.bind 在shell中,内建(builtin)命令bind,格式如下: bind [-m keymap] [-lpsvPSVX] bind [-m keymap] [-q function] [ ...

  3. pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple

    pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple 快速下载

  4. Hadoop Ecosystem related ports

    本文总结了Hadoop生态系统中各个组件使用的端口,包括了HDFS,Map Reduce,HBase,Hive,Spark,WebHCat,Impala,Alluxio,Sqoop等,后续会持续更新. ...

  5. VS下如何建立一个新的MFC程序 网络编程 课设 基于C++ MFC 连接数据库 小应用 小项目浅析展示

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8191036.html 这里不知道会不会有人是真的新手 新新手 不知道怎么 如何建立一个MFC ...

  6. IDEA 导入cordova3.5工程目录注意事项

    IDEA 导入cordova3.5工程目录注意事项 1 eclipse很不稳定,有很多小问题.平时我自己用idea,但是当用cordova3.5创建好工程目录是,用eclipse导入时没有问题的.但是 ...

  7. android中的Touch研究

    android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN-& ...

  8. SVM 之 MATLAB 实现代码

    MATLAB 中 SVM 实现 直接上代码 main.m %% Initialize data clear, clc, close all; load('data.mat'); y(y == 0) = ...

  9. vim创建新的命令

    转自:http://man.chinaunix.net/newsoft/vi/doc/usr_5F40.html#usr_40.txt *40.1* 键映射 简单的映射已经在 |05.3| 介绍过了. ...

  10. 将代码托管到github,并生成链接访问

    转眼间加入github的阵营已经两年多了,看到别人建立的个人博客挺好看的,因此,自己从此喜欢上了github,总结下自己的相关知识. 推荐学习Git的网址: 猴子都能懂的GIT入门 http://ba ...