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

路径暂时是写死的

编译两个版本的程序:

g++  treeT.cpp -municode -D_UNICODE -o treeT_UNI
g++  treeT.cpp -o treeT_ASC

为了观察ANSI版在遍历文件夹如果遇到Unicode字符会发生什么情况而写来作对比的

他们都可以接收终端传送的中文字符

ANSI版:

opendir/readdir 遍历目录遇到 UNICODE字符的时候会出问题

UNICODE版:

输出到stdout的时候,值>128 的UNICODE字符丢失

改为 WriteConsoleW 函数可以解决这个问题

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <fcntl.h>
 4 #include <sys/stat.h>
 5 #include <dirent.h>
 6 #include <tchar.h>
 7 #include <cwchar>
 8 #include <sys/types.h>
 9 #include <cstring>
10
11 #define NAME_MAX 1024
12
13 #ifdef _UNICODE
14     #define FMT_D "%ld"
15     #define FMT_S "%ls"
16     #define TXT_FILE "TREE_UTF.txt"
17 #else
18     #define FMT_D "%d"
19     #define FMT_S "%s"
20     #define TXT_FILE "TREE_ASC.txt"
21 #endif
22
23 void func(TCHAR path[]);
24
25 static FILE * fp = _tfopen( _TEXT( TXT_FILE ), _TEXT("wb"));
26
27 int _tmain(int argc, TCHAR *argv[] )
28 {
29     TCHAR pth[] = _TEXT("D:\\Extra");
30     func(pth);
31     fclose(fp);
32     return 0;
33 }
34
35 void func(TCHAR path[])
36 {
37     _TDIR * a = _topendir(path);
38     _tdirent * dp;
39     _TDIR * aa;
40     struct _stat stbuf;
41
42     TCHAR fullpath[NAME_MAX] = _TEXT("");
43
44     while (dp = _treaddir(a))
45     {
46         if (
47                _tcscmp(dp->d_name, _TEXT(".")) == 0
48             || _tcscmp(dp->d_name, _TEXT("..")) == 0
49         )
50         {
51             continue;
52         }
53
54         _stprintf(fullpath, _TEXT(FMT_S "\\" FMT_S), path, dp->d_name);
55         _tstat(fullpath, &stbuf);
56
57         if ( (stbuf.st_mode & S_IFMT) == S_IFDIR )
58         {
59             func( fullpath );
60         }
61         else
62         {
63             //output file list
64             _ftprintf(fp, _TEXT( FMT_D "\t" FMT_S "\r\n"),  stbuf.st_mtime, fullpath );
65             _ftprintf(stdout, _TEXT( FMT_D "\t" FMT_S "\r\n"),  stbuf.st_mtime, fullpath );
66         }
67
68     }
69     _tclosedir(a);
70 }
71
72 
时间: 2024-08-01 16:23:01

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

UNICODE与ANSI的区别

什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit.(对于字符来说ANSI以单字节存放英文字符,以双字节存放中文等字符,而Unicode下,英文和中文的字符都以双字节存放)Unicode码也是一种国际标准编码,采用二个字节编码,与ANSI码不兼容.目前,在网络.Windows系统和很多大型软件中得到应用.8bit的ANSI编码只能表示256种字符,表示26个英文字母是绰绰有余的,但是表示汉字,韩国语等有着

字符编码(续)---Unicode与ANSI字符串转换以及分辨字符编码形式

Unicode与ANSI字符串转换 我们使用windows函数MultiByteToWideChar将多字节字符串转换为宽字符字符串,如下: int MultiByteToWideChar( UINT uCodePage, DWORD dwFlags, PCSTR pMultiByteStr, int cbMultiByte, PWSTR pWideCharStr, int cchWideChar); uCodePage参数标识了与多字节字符串关联的一个代码页值.dwFlags参数允许我们进行额

Native2asciiUtil 文本文件转UNICODE编码文件(支持UTF-8,Unicode,UTF-16BE,ANSI|ASCII,GBK)

package com.ctl.util; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * * @author Administrator * @Description \u5C06\u6587\u672C\u6587\u4EF6\u8F6C\

编译安装nginx并修改版本头信息—参考实例

今天做实验的时候,想起我那台yum安装的nginx+php-fpm+mysql服务器上的nginx版本有点低了,并且还要加两个第3方模块,就去nginx官网下载了最新稳定版nginx-1.0.6,好了,废话不多说看教程吧.  系统版本: centos 5.6  ip: 192.168.1.200  需要的软件包:nginx-1.0.6.tar.gz Nginx-accesskey-2.0.3.tar.gz ngx_cache_purge-1.3.tar.gz(这3个包可以自己去下载,我就不提供了

ANSI转UNICODE,UNICODE转ANSI

(1)ANSI转UNICODE wchar_t * AnsiToUnicode(const char *pAnsi) {     int nLen = MultiByteToWideChar(CP_ACP,0,pAnsi,strlen(pAnsi),nullptr,0);     wchar_t *pUnicode = new wchar_t[nLen+1];     MultiByteToWideChar(CP_ACP,0,pAnsi,strlen(pAnsi),pUnicode,nLen);

Creating Dialogbased Win32 Application (4) / 创建基于对话框的Win32应用程序(四)Edit Control的应用、Unicode转ANSI、自动滚动 / Win32, VC++, Windows

创建基于对话框的Win32应用程序(四)——Edit Control的应用.Unicode转ANSI.自动滚动 之前的介绍中,我们用到了Button.Static Text.Checkbox这三个控件.这一节中我们将学习使用Edit Control(编辑框)控件,其中还包括Unicode转ANSI的方法.文本框自动滚动的功能等. 24.首先切换到Reasource View(Ctrl+Shift+E),找到待修改的主窗体,并从Toolbox(Ctrl+Atl+X)中添加Edit Control控

centos7编译安装mysql5.7.20版本

centos7编译安装mysql5.7.20版本 遇到问题: 之前想在线上搭建mysql5.7.20版本找了很多文档都觉得写得不怎么完善,很多需要注意的错误点都提及,所以只好自己写一篇了!个人觉得最主要注意的是mysql的data目录一定不能漏了权限问题,还有的经常遇到mysql.sock文件的错误就是因为编译的时候指定的目录要小心,然后启动前在my.cnf文件里面定义一下问题就解决了.这是我写的时候遇到最多的问题. 一.进入mysql官网下载(www.mysql.org)mysql源安装包:

探寻不同版本的SDK对iOS程序的影响

结论: 相同的代码,使用不同版本的SDK来编译,会影响MachO头中的值,从而使程序表现出不同的外观. 代码: @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIScreen *mainScreen = [UIScreen mainScreen]; CGRect fr

DELPHI低版本开发的两层程序平稳升级到三层

N年前,我们用DELPHI低版本开发的两层程序(比如工厂ERP系统),现在仍然在企业广泛地得到使用,但老系统有些跟不上企业的发展需要了.主要表现在:虽然我们的老系统对企业的业务实现得很好,可以很好地满足企业目前的业务需求,但现在企业要求我们的服务器要能够远程分布式地布署,于是我们自然会想到将原来的两层程序升级为三层,这样无疑将满足企业新的需求.大家都知道DELPHI低版本中间件的开发框架是基于微软陈旧的COM架构的MIDAS,这是一种一.二十年前的技术,MIDAS以前完全没有考虑对后来新的64位