ACE目录遍历功能
有时候需要扫描当前文件夹,返回给远端。于是写了一个小代码,发现ace对目录操作并不完整,目前到6.20依旧只支持windows,其实linux下也差不多,几十行的代码量。整合进ace应该不难吧。
由于需要传输到远端,所以我定义了一个结构,记录fileinfo
这里包括如下东西。//文件列表结构
struct _FileInfo
{
char m_szFileName;
int m_nFileType;
int m_nFileSize;
_FileInfo()
{
m_szFileName = '\0';
m_nFileType = 0;
m_nFileSize = 0;
}
void print()
{
if(m_nFileType == IS_FILE)
{
printf("filename=%s, filetype=file, filesize=%d.\n", m_szFileName, m_nFileSize);
}
else
{
printf("filename=%s, filetype=direct, filesize=%d.\n", m_szFileName, m_nFileSize);
}
}
};文件名,文件大小,文件类型。
获得当前路径的文件和文件夹显示并打印出来。
添加了Linux的支持,手写了一个支持跨平台的操作。
一共159行代码,还带换行符,代码量非常少。// ACE_Dirtest.cpp : 定义控制台应用程序的入口点。
//
#ifdef WIN32
#include <stdio.h>
#include <ace/Dirent.h>
#include <vector>
#include <ace/OS.h>
#include <sys/stat.h>
#else
#include <ace/OS_main.h>
#include <ace/OS_NS_stdio.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <vector>
#include <sys/types.h>
#endif
using namespace std;
#define DIR_OK 0
#define DIR_ERR_ISFILE 1
#define DIR_ERR_ISNOEXIST2
#define IS_FILE 0
#define IS_DIRRNT 1
//文件列表结构
struct _FileInfo
{
char m_szFileName;
int m_nFileType;
int m_nFileSize;
_FileInfo()
{
m_szFileName = '\0';
m_nFileType = 0;
m_nFileSize = 0;
}
void print()
{
if(m_nFileType == IS_FILE)
{
printf("filename=%s, filetype=file, filesize=%d.\n", m_szFileName, m_nFileSize);
}
else
{
printf("filename=%s, filetype=direct, filesize=%d.\n", m_szFileName, m_nFileSize);
}
}
};
typedef vector<_FileInfo> vevFileInfo;
int GetDir( const char* pPath, vevFileInfo& objvevFileInfo )
{
#ifdef WIN32
objvevFileInfo.clear();
//查看当前路径是否为一个目录
struct ACE_DIR* objopendir = ACE_OS::opendir(pPath);
if(!objopendir)
{
//当前是一个文件不是目录
return DIR_ERR_ISFILE;
}
else
{
//是目录,打开目录
struct ACE_DIRENT * objreaddir = ACE_OS::readdir(objopendir);
//略过.和..
while(objreaddir && objreaddir->d_name == '.')
{
objreaddir = ACE_OS::readdir(objopendir);
}
while(objreaddir)
{
char szFilePath = {'\0'};
sprintf_s(szFilePath, 500, "%s%s", pPath, objreaddir->d_name);
_FileInfo objFileInfo;
sprintf_s(objFileInfo.m_szFileName, 500, "%s", objreaddir->d_name);
struct ACE_DIR* objIsdir = ACE_OS::opendir(szFilePath);
if(objIsdir == NULL)
{
objFileInfo.m_nFileType = IS_FILE;
objFileInfo.m_nFileSize = (int)ACE_OS::filesize(szFilePath);
}
else
{
objFileInfo.m_nFileType = IS_DIRRNT;
objFileInfo.m_nFileSize = 0;
}
objvevFileInfo.push_back(objFileInfo);
//printf("filename=%s.\n", objreaddir->d_name);
objreaddir = ACE_OS::readdir_emulation(objopendir);
}
ACE_OS::closedir_emulation(objopendir);
}
#else
objvevFileInfo.clear();
struct dirent *objreaddir = NULL;
DIR *pDir = opendir(pPath);
while((objreaddir=readdir(pDir))!=NULL)
{
if(strcmp(objreaddir->d_name,".")==0 || strcmp(objreaddir->d_name,"..")==0)
{
continue;
}
char szFilePath = {'\0'};
sprintf(szFilePath, "%s%s", pPath, objreaddir->d_name);
_FileInfo objFileInfo;
if(objreaddir->d_type & DT_DIR)
{
//如果是目录
sprintf(objFileInfo.m_szFileName, "%s", objreaddir->d_name);
objFileInfo.m_nFileType = IS_DIRRNT;
objFileInfo.m_nFileSize = 0;
}
else
{
//如果是文件
sprintf(objFileInfo.m_szFileName, "%s", objreaddir->d_name);
objFileInfo.m_nFileType = IS_FILE;
objFileInfo.m_nFileSize = (int)ACE_OS::filesize(szFilePath);
}
objvevFileInfo.push_back(objFileInfo);
}
#endif
return DIR_OK;
}
int main(int argc, char* argv[])
{
vevFileInfo objfilegroup;
GetDir("./", objfilegroup);
for(int i = 0; i < (int)objfilegroup.size(); i++)
{
objfilegroup.print();
}
getchar();
return 0;
}
windows 7下测试通过,Linux下测试通过。
记录一下。
可以发给ACE邮件组的人 这个用STL就很方便了,没有必要在ACE中做一个这个功能。
页:
[1]