|
有时候需要扫描当前文件夹,返回给远端。
于是写了一个小代码,发现ace对目录操作并不完整,目前到6.20依旧只支持windows,其实linux下也差不多,几十行的代码量。整合进ace应该不难吧。
由于需要传输到远端,所以我定义了一个结构,记录fileinfo
这里包括如下东西。- //文件列表结构
- struct _FileInfo
- {
- char m_szFileName[500];
- int m_nFileType;
- int m_nFileSize;
- _FileInfo()
- {
- m_szFileName[0] = '\0';
- m_nFileType = 0;
- m_nFileSize = 0;
- }
- void print()
- {
- if(m_nFileType == IS_FILE)
- {
- printf("[GetDir]filename=%s, filetype=file, filesize=%d.\n", m_szFileName, m_nFileSize);
- }
- else
- {
- printf("[GetDir]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_ISNOEXIST 2
- #define IS_FILE 0
- #define IS_DIRRNT 1
- //文件列表结构
- struct _FileInfo
- {
- char m_szFileName[500];
- int m_nFileType;
- int m_nFileSize;
- _FileInfo()
- {
- m_szFileName[0] = '\0';
- m_nFileType = 0;
- m_nFileSize = 0;
- }
- void print()
- {
- if(m_nFileType == IS_FILE)
- {
- printf("[GetDir]filename=%s, filetype=file, filesize=%d.\n", m_szFileName, m_nFileSize);
- }
- else
- {
- printf("[GetDir]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[0] == '.')
- {
- objreaddir = ACE_OS::readdir(objopendir);
- }
- while(objreaddir)
- {
- char szFilePath[500] = {'\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("[GetDir]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[500] = {'\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[i].print();
- }
- getchar();
- return 0;
- }
复制代码 windows 7下测试通过,Linux下测试通过。
记录一下。
|
|