找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4066|回复: 2

ACE目录遍历功能

[复制链接]
发表于 2013-10-17 15:09:49 | 显示全部楼层 |阅读模式
有时候需要扫描当前文件夹,返回给远端。
于是写了一个小代码,发现ace对目录操作并不完整,目前到6.20依旧只支持windows,其实linux下也差不多,几十行的代码量。整合进ace应该不难吧。
由于需要传输到远端,所以我定义了一个结构,记录fileinfo
这里包括如下东西。
  1. //文件列表结构
  2. struct _FileInfo
  3. {
  4.         char   m_szFileName[500];
  5.         int    m_nFileType;
  6.         int    m_nFileSize;
  7.         _FileInfo()
  8.         {
  9.                 m_szFileName[0] = '\0';
  10.                 m_nFileType     = 0;
  11.                 m_nFileSize     = 0;
  12.         }
  13.         void print()
  14.         {
  15.                 if(m_nFileType == IS_FILE)
  16.                 {
  17.                         printf("[GetDir]filename=%s, filetype=file, filesize=%d.\n", m_szFileName, m_nFileSize);
  18.                 }
  19.                 else
  20.                 {
  21.                         printf("[GetDir]filename=%s, filetype=direct, filesize=%d.\n", m_szFileName, m_nFileSize);
  22.                 }
  23.         }
  24. };
复制代码
文件名,文件大小,文件类型。
获得当前路径的文件和文件夹显示并打印出来。
添加了Linux的支持,手写了一个支持跨平台的操作。
一共159行代码,还带换行符,代码量非常少。
  1. // ACE_Dirtest.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #ifdef WIN32
  4. #include <stdio.h>
  5. #include <ace/Dirent.h>
  6. #include <vector>
  7. #include <ace/OS.h>
  8. #include <sys/stat.h>
  9. #else
  10. #include <ace/OS_main.h>
  11. #include <ace/OS_NS_stdio.h>
  12. #include <sys/stat.h>
  13. #include <stdio.h>  
  14. #include <string.h>
  15. #include <stdlib.h>  
  16. #include <dirent.h>  
  17. #include <sys/stat.h>  
  18. #include <unistd.h>  
  19. #include <vector>
  20. #include <sys/types.h>
  21. #endif
  22. using namespace std;
  23. #define DIR_OK             0
  24. #define DIR_ERR_ISFILE     1
  25. #define DIR_ERR_ISNOEXIST  2
  26. #define IS_FILE            0
  27. #define IS_DIRRNT          1
  28. //文件列表结构
  29. struct _FileInfo
  30. {
  31.         char   m_szFileName[500];
  32.         int    m_nFileType;
  33.         int    m_nFileSize;
  34.         _FileInfo()
  35.         {
  36.                 m_szFileName[0] = '\0';
  37.                 m_nFileType     = 0;
  38.                 m_nFileSize     = 0;
  39.         }
  40.         void print()
  41.         {
  42.                 if(m_nFileType == IS_FILE)
  43.                 {
  44.                         printf("[GetDir]filename=%s, filetype=file, filesize=%d.\n", m_szFileName, m_nFileSize);
  45.                 }
  46.                 else
  47.                 {
  48.                         printf("[GetDir]filename=%s, filetype=direct, filesize=%d.\n", m_szFileName, m_nFileSize);
  49.                 }
  50.         }
  51. };
  52. typedef vector<_FileInfo> vevFileInfo;
  53. int GetDir( const char* pPath, vevFileInfo& objvevFileInfo )
  54. {
  55. #ifdef WIN32       
  56.         objvevFileInfo.clear();
  57.         //查看当前路径是否为一个目录
  58.         struct ACE_DIR* objopendir = ACE_OS::opendir(pPath);
  59.         if(!objopendir)
  60.         {
  61.                 //当前是一个文件不是目录
  62.                 return DIR_ERR_ISFILE;
  63.         }
  64.         else
  65.         {
  66.                 //是目录,打开目录
  67.                 struct ACE_DIRENT * objreaddir = ACE_OS::readdir(objopendir);
  68.                 //略过.和..
  69.                 while(objreaddir && objreaddir->d_name[0] == '.')
  70.                 {
  71.                         objreaddir = ACE_OS::readdir(objopendir);
  72.                 }
  73.                 while(objreaddir)     
  74.                 {
  75.                         char szFilePath[500] = {'\0'};
  76.                         sprintf_s(szFilePath, 500, "%s%s", pPath, objreaddir->d_name);
  77.                         _FileInfo objFileInfo;
  78.                         sprintf_s(objFileInfo.m_szFileName, 500, "%s", objreaddir->d_name);
  79.                         struct ACE_DIR* objIsdir = ACE_OS::opendir(szFilePath);
  80.                         if(objIsdir == NULL)
  81.                         {
  82.                                 objFileInfo.m_nFileType = IS_FILE;
  83.                                 objFileInfo.m_nFileSize = (int)ACE_OS::filesize(szFilePath);
  84.                         }
  85.                         else
  86.                         {
  87.                                 objFileInfo.m_nFileType = IS_DIRRNT;
  88.                                 objFileInfo.m_nFileSize = 0;
  89.                         }
  90.                         objvevFileInfo.push_back(objFileInfo);
  91.                         //printf("[GetDir]filename=%s.\n", objreaddir->d_name);
  92.                         objreaddir = ACE_OS::readdir_emulation(objopendir);
  93.                 }
  94.                 ACE_OS::closedir_emulation(objopendir);
  95.         }
  96. #else
  97.         objvevFileInfo.clear();
  98.        
  99.         struct dirent *objreaddir = NULL;  
  100.         DIR *pDir = opendir(pPath);
  101.         while((objreaddir=readdir(pDir))!=NULL)  
  102.   {
  103.                  if(strcmp(objreaddir->d_name,".")==0 || strcmp(objreaddir->d_name,"..")==0)
  104.                  {  
  105.                                 continue;
  106.                  }
  107.                  
  108.                  char szFilePath[500] = {'\0'};
  109.                  sprintf(szFilePath, "%s%s", pPath, objreaddir->d_name);                 
  110.          
  111.            _FileInfo objFileInfo;       
  112.            if(objreaddir->d_type & DT_DIR)
  113.            {
  114.                            //如果是目录
  115.                                 sprintf(objFileInfo.m_szFileName, "%s", objreaddir->d_name);
  116.                                 objFileInfo.m_nFileType = IS_DIRRNT;
  117.                                 objFileInfo.m_nFileSize = 0;                       
  118.            }
  119.            else
  120.            {
  121.                      //如果是文件
  122.                                 sprintf(objFileInfo.m_szFileName, "%s", objreaddir->d_name);
  123.                                 objFileInfo.m_nFileType = IS_FILE;
  124.                                 objFileInfo.m_nFileSize = (int)ACE_OS::filesize(szFilePath);                                     
  125.            }
  126.            objvevFileInfo.push_back(objFileInfo);
  127.   }
  128. #endif
  129.         return DIR_OK;
  130. }
  131. int main(int argc, char* argv[])
  132. {
  133.         vevFileInfo objfilegroup;
  134.         GetDir("./", objfilegroup);
  135.         for(int i = 0; i < (int)objfilegroup.size(); i++)
  136.         {
  137.                 objfilegroup[i].print();
  138.         }
  139.         getchar();
  140.         return 0;
  141. }
复制代码
windows 7下测试通过,Linux下测试通过。
记录一下。
发表于 2013-10-17 23:17:53 | 显示全部楼层
可以发给ACE邮件组的人
发表于 2013-10-24 12:15:57 | 显示全部楼层
这个用STL就很方便了,没有必要在ACE中做一个这个功能。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 08:39 , Processed in 0.012258 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表