ListV1.3 枚举目录树文件结构以及文件大小

头像
vicyang
版主
版主
帖子: 47
注册时间: 2016年07月21日 20:35
拥有现金: 锁定
储蓄: 锁定
Has thanked: 7 times
联系:

ListV1.3 枚举目录树文件结构以及文件大小

帖子 #1 vicyang » 2017年03月13日 17:16

支持将 Unicode 文件名输出、重定向。
编译:
g++ -municode "listV1.3.cpp" -o "listV1.3.exe"

Code: [全选] [展开/收缩] [Download] (listV1.3.cpp)
  1. /*
  2.     Code by:523066680@163.com
  3.     2017-01
  4.  
  5.     v1.3 对于超过4G的文件,需要将 stat 改为 _stat64
  6.     以及在 print 中将 %ld 改为 %lld
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <fcntl.h>
  11. #include <dirent.h>
  12. #include <wchar.h>
  13. #include <sys/stat.h>
  14. #include <sys/types.h>
  15. #include <string.h>
  16. #include <windows.h>
  17.  
  18. #define NAME_MAX 10240
  19.  
  20. void func(wchar_t path[]);
  21. void console_print(const wchar_t str[]);
  22. void CheckConsoleRedirect(void);
  23.  
  24. DWORD written = 0;
  25. static bool g_bRedirect = false;
  26.  
  27. int wmain(int argc, wchar_t *argv[] )
  28. {
  29.     wchar_t pth[NAME_MAX] = L"D:\\Extra\\";
  30.    
  31.     //首先判断是否为重定向
  32.     CheckConsoleRedirect();
  33.  
  34.     if ( argc >= 2 )
  35.     {
  36.         if ( argv[1][wcslen(argv[1])-1] == '\\' )
  37.             swprintf(pth, L"%ls", argv[1] );
  38.         else
  39.             swprintf(pth, L"%ls\\", argv[1] );
  40.     }
  41.  
  42.     func( pth );
  43.  
  44.     return 0;
  45. }
  46.  
  47. void func( wchar_t path[] )
  48. {
  49.     DWORD attr;
  50.     _WDIR * a = _wopendir(path);
  51.     _wdirent * dp;
  52.     _WDIR * aa;
  53.     struct _stat64 stbuf;
  54.     wchar_t full_info[NAME_MAX] = L"";
  55.  
  56.     WCHAR fullpath[NAME_MAX] = L"";
  57.  
  58.     swprintf(full_info, L"FOLD: %ls\r\n", path );
  59.     console_print( full_info );
  60.  
  61.     //打印目录内容
  62.     while ( dp = _wreaddir(a) )
  63.     {
  64.         //排除 当前文件夹 和 上一级 文件夹
  65.         if (
  66.                ( wcscmp(dp->d_name, L"." )  == 0 )
  67.             || ( wcscmp(dp->d_name, L".." ) == 0 )
  68.         )
  69.         { continue; }
  70.         swprintf(fullpath, L"%ls%ls", path, dp->d_name);
  71.         _wstat64(fullpath, &stbuf);
  72.         attr = GetFileAttributesW(fullpath);
  73.  
  74.         //排除符号链接类型的文件和目录
  75.         if ( (attr & FILE_ATTRIBUTE_REPARSE_POINT) != FILE_ATTRIBUTE_REPARSE_POINT )
  76.         {
  77.             if ( (attr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY )
  78.             {
  79.                 swprintf(full_info, L"%16ls %ls\r\n", L"DIR", dp->d_name );
  80.                 console_print( full_info );
  81.             }
  82.             else
  83.             {
  84.                 swprintf(full_info, L"%16lld %ls\r\n", stbuf.st_size, dp->d_name );
  85.                 console_print( full_info );
  86.             }
  87.         }
  88.     }
  89.     _wclosedir(a);
  90.  
  91.     //递归流程
  92.     a = _wopendir(path);
  93.     while ( dp = _wreaddir(a) )
  94.     {
  95.         //排除 当前文件夹 和 上一级 文件夹
  96.         if (
  97.                ( wcscmp(dp->d_name, L"." )  == 0 )
  98.             || ( wcscmp(dp->d_name, L".." ) == 0 )
  99.         )
  100.         {
  101.             continue;
  102.         }
  103.  
  104.         swprintf(fullpath, L"%ls%ls", path, dp->d_name);
  105.         attr = GetFileAttributesW(fullpath);
  106.  
  107.         //排除符号链接类型的文件和目录
  108.         if ( (attr & FILE_ATTRIBUTE_REPARSE_POINT) != FILE_ATTRIBUTE_REPARSE_POINT )
  109.         {
  110.             if ( (attr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY )
  111.             {
  112.                 swprintf(fullpath, L"%ls%ls\\", path, dp->d_name);
  113.                 func( fullpath );
  114.             }
  115.         }
  116.     }
  117.     _wclosedir(a);
  118. }
  119.  
  120. void console_print(const wchar_t str[])
  121. {
  122.     if ( ! g_bRedirect )
  123.     {
  124.         WriteConsoleW(
  125.             GetStdHandle(STD_OUTPUT_HANDLE), str, wcslen(str)  , &written, NULL
  126.         );
  127.     }
  128.     else
  129.     {
  130.         WriteFile(
  131.             GetStdHandle(STD_OUTPUT_HANDLE), str, wcslen(str) * sizeof( str[0] ) , &written, NULL
  132.         );
  133.     }
  134. }
  135.  
  136. void CheckConsoleRedirect(void)
  137. {
  138.     if (!GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &written))
  139.     {
  140.         g_bRedirect = true;
  141.         //WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), "\xFF\xFE", 2, &written, 0);
  142.     }
  143. }

回到 “文件与系统”

在线用户

用户浏览此论坛: 没有注册用户 和 1 访客