freeeyes 发表于 2013-10-17 15:09:49

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下测试通过。
记录一下。

winston 发表于 2013-10-17 23:17:53

可以发给ACE邮件组的人

魔鬼 发表于 2013-10-24 12:15:57

这个用STL就很方便了,没有必要在ACE中做一个这个功能。
页: [1]
查看完整版本: ACE目录遍历功能