vs2005下的dirent.h
来源:互联网 发布:freebsd 删除软件 编辑:程序博客网 时间:2024/04/28 04:20
dirent.h是gcc下的一个头文件,而在VS2005中是没有的。这个文件中封装了几个对目录进行操作函数:
static DIR *opendir (const char *dirname);static struct dirent *readdir (DIR *dirp);static int closedir (DIR *dirp);
对于在linux->windows之间进行程序移植来讲常常会造成一些困扰,在网上仔细搜了一下,发现原来已经有位好同志写了相应的移植代码,如下所示:
typedef struct dirent { /* name of current directory entry (a multi-byte character string) */ char d_name[MAX_PATH + 1];
/* file attributes */ WIN32_FIND_DATA data;} dirent;
typedef struct DIR { /* current directory entry */ dirent current;
/* is there an un-processed entry in current? */ int cached;
/* file search handle */ HANDLE search_handle;
/* search pattern (3 = zero terminator + pattern "//*") */ TCHAR patt[MAX_PATH + 3];} DIR;
static DIR *opendir (const char *dirname);static struct dirent *readdir (DIR *dirp);static int closedir (DIR *dirp);
/* use the new safe string functions introduced in Visual Studio 2005 */#if defined(_MSC_VER) && _MSC_VER >= 1400# define STRNCPY(dest,src,size) strncpy_s((dest),(size),(src),_TRUNCATE)#else# define STRNCPY(dest,src,size) strncpy((dest),(src),(size))#endif
/* * Open directory stream DIRNAME for read and return a pointer to the * internal working area that is used to retrieve individual directory * entries. */static DIR*opendir( const char *dirname){ DIR *dirp; assert (dirname != NULL); assert (strlen (dirname) < MAX_PATH);
/* construct new DIR structure */ dirp = (DIR*) malloc (sizeof (struct DIR)); if (dirp != NULL) { TCHAR *p; /* prepare search pattern */#ifdef _UNICODE
/* convert directory name to wide character string */ MultiByteToWideChar( CP_ACP, /* code page */ 0, /* conversion flags */ dirname, /* mb-string to convert */ -1, /* length of mb-string */ dirp->patt, /* wc-string to produce */ MAX_PATH); /* max length of wc-string */ dirp->patt[MAX_PATH] = '/0'; /* append search pattern to directory name */ p = wcschr (dirp->patt, '/0'); if (dirp->patt < p && *(p-1) != '//' && *(p-1) != ':') { *p++ = '//'; } *p++ = '*'; *p = '/0';
#else /* !_UNICODE */ /* take directory name... */ STRNCPY (dirp->patt, dirname, sizeof(dirp->patt)); dirp->patt[MAX_PATH] = '/0'; /* ... and append search pattern to it */ p = strchr (dirp->patt, '/0'); if (dirp->patt < p && *(p-1) != '//' && *(p-1) != ':') { *p++ = '//'; } *p++ = '*'; *p = '/0'; #endif /* !_UNICODE */
/* open stream and retrieve first file */ dirp->search_handle = FindFirstFile (dirp->patt, &dirp->current.data); if (dirp->search_handle == INVALID_HANDLE_VALUE) { /* invalid search pattern? */ free (dirp); return NULL; }
/* there is an un-processed directory entry in memory now */ dirp->cached = 1; } return dirp;}
/* * Read a directory entry, and return a pointer to a dirent structure * containing the name of the entry in d_name field. Individual directory * entries returned by this very function include regular files, * sub-directories, pseudo-directories "." and "..", but also volume labels, * hidden files and system files may be returned. */static struct dirent *readdir( DIR *dirp){ assert (dirp != NULL);
if (dirp->search_handle == INVALID_HANDLE_VALUE) { /* directory stream was opened/rewound incorrectly or it ended normally */ return NULL; }
/* get next directory entry */ if (dirp->cached != 0) { /* a valid directory entry already in memory */ dirp->cached = 0; } else { /* read next directory entry from disk */ if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { /* the very last file has been processed or an error occured */ FindClose (dirp->search_handle); dirp->search_handle = INVALID_HANDLE_VALUE; return NULL; } }
/* copy directory entry to d_name */#ifdef _UNICODE /* convert entry name to multibyte */ WideCharToMultiByte( CP_ACP, /* code page */ 0, /* conversion flags */ dirp->current.data.cFileName, /* wc-string to convert */ -1, /* length of wc-string */ dirp->current.d_name, /* mb-string to produce */ MAX_PATH, /* max length of mb-string */ NULL, /* use sys default character */ NULL); /* don't care */ dirp->current.d_name[MAX_PATH] = '/0'; #else /* !_UNICODE */
/* copy as a multibyte character string */ STRNCPY (dirp->current.d_name, dirp->current.data.cFileName, sizeof(dirp->current.d_name)); dirp->current.d_name[MAX_PATH] = '/0';
#endif /* !_UNICODE */ return &dirp->current;}
/* * Close directory stream opened by opendir() function. Close of the * directory stream invalidates the DIR structure as well as any previously * read directory entry. */static intclosedir( DIR *dirp){ assert (dirp != NULL); /* release search handle */ if (dirp->search_handle != INVALID_HANDLE_VALUE) { FindClose (dirp->search_handle); dirp->search_handle = INVALID_HANDLE_VALUE; }
/* release directory handle */ free (dirp); return 0;}
此文件可从http://www.softagalleria.net/dirent/index.en.html下载得到,直接将它放在VS2005的include目录就OK 了!
- vs2005下的dirent.h
- vs2005下的dirent.h
- vs2005下的dirent.h
- windows下MSVC兼容的dirent.h
- dirent.h
- dirent.h
- dirent.h
- Linux下的struct dirent
- 在windows7下给vs2010配置dirent.h头文件
- 在windows7下给vs2015配置dirent.h头文件
- #include <dirent.h>作用
- unix dirent.h
- linux dirent.h 使用
- dirent.h使用详解
- linux下的DIR,dirent,stat
- 批量读取图片中关于缺失dirent.h的问题
- [C] dirent.h库函数以及extern语法的介绍
- /include/linux/dirent.h (版本 0.99.11) 与 /include/linux/dirent.h (版本 0.98) 之间的区别(见红色标记):
- STL 中文站
- 杂谈
- C++ & VC 6.0 基础编程
- Ubuntu8.04系列一--系统安装篇
- 看看人家是怎样去玩STL,才知道自己是多么的无知
- vs2005下的dirent.h
- 新闻列表无间断滚动
- 项目经理的工具箱---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三)
- 测试用例设计技术之三-------因果图法
- 在使用otl的时候,otl_stream构造函数第一个参数buffer size的使用说明.
- 详细解说STL hash_map系列
- 孙鑫VC++Lesson2
- 数据库专栏
- qt程序debug release两个版本链接时只有一个能成功