VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1029|回复: 8

遍历特定目录,以便分别处理其中的文件?

[复制链接]

3

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-19 13:00:01 | 显示全部楼层 |阅读模式
在C++中,怎么样遍历特定目录,以便分别处理其中的文件?
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-4-29 16:15:01 | 显示全部楼层
findfirst/findnext,看这2个函数的帮助
回复

使用道具 举报

0

主题

12

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-4-29 19:30:01 | 显示全部楼层
摘了网上一段代码:很容易理解
int SearchDirectory(std::vector<std::string> &refvecFiles,
                    const std::string        &refcstrRootDirectory,
                    const std::string        &refcstrExtension,
                    bool                     bSearchSubdirectories = true)
{
        std::string                strFilePath;             // Filepath
        std::string                strPattern;              // Pattern
        std::string                strExtension;            // Extension
        HANDLE                                hFile;                   // Handle to file
        WIN32_FIND_DATA                FileInformation;         // File information


        strPattern = refcstrRootDirectory + "\\*.*";

        hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation);
        string temp(FileInformation.cFileName);
        if(hFile != INVALID_HANDLE_VALUE)
        {
                do
                {
                        if(FileInformation.cFileName[0] != '.')
                        {
                        strFilePath.erase();
                        strFilePath = refcstrRootDirectory + "\\" + temp;

                        if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                        {
                                if(bSearchSubdirectories)
                                {
                                        // Search subdirectory
                                        int iRC = SearchDirectory(refvecFiles,
                                      strFilePath,
                                      refcstrExtension,
                                      bSearchSubdirectories);
                                        if(iRC)
                                        return iRC;
                                }
                        }
                        else
                        {
                                // Check extension
                                strExtension = FileInformation.cFileName;
                                strExtension = strExtension.substr(strExtension.rfind(".") + 1);

                                if(strExtension == refcstrExtension)
                        {
                                // Save filename
                                refvecFiles.push_back(FileInformation.cFileName);
                        }
                }
        }
        }
        while(::FindNextFile(hFile, &FileInformation) == TRUE);

    // Close handle
    ::FindClose(hFile);

    DWORD dwError = ::GetLastError();
    if(dwError != ERROR_NO_MORE_FILES)
        return dwError;
        }
        return 0;
}
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-4-30 15:00:01 | 显示全部楼层
unix系统下,支持opendir和readdir函数,可以自己使用这两个函数编写目录遍例
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-5-1 15:00:01 | 显示全部楼层
class Cbrowse
{
public:
Cbrowse();
bool SetInitDir(char* szdir);

void BeginBrowse();

DWORD dwfilenum;
DWORD dwdirnum;
char szSetInitDir[MAX_PATH];

protected:
bool BrowseDir(char* dir);
};

Cbrowse::Cbrowse()
{
dwfilenum = 0;
dwdirnum = 0;
}

bool Cbrowse::SetInitDir(char* szdir)
{
if (chdir(szdir) != 0)
{
return FALSE;
}
if (_fullpath(szSetInitDir, szdir, MAX_PATH)!=NULL)
{
int dwLenOfInitDir;
strcmp(szSetInitDir, szdir);
dwLenOfInitDir = strlen(szSetInitDir);
if (szSetInitDir[dwLenOfInitDir - 1] != '\\')
{
strcat(szSetInitDir, "\\*");
}
else
{
strcat(szSetInitDir, "*");
}
return TRUE;
}
return FALSE;
}

void Cbrowse::BeginBrowse()
{
Cbrowse::BrowseDir(szSetInitDir);
}

bool Cbrowse::BrowseDir(char* dir)
{
HANDLE hFile;
WIN32_FIND_DATAA FindData;
hFile = FindFirstFile(dir, &FindData);

if (hFile != INVALID_HANDLE_VALUE)
{
do
{
if (FindData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{
dwfilenum++;
}
}while (FindNextFile(hFile, &FindData));
}

hFile = FindFirstFile(dir, &FindData);
if (hFile != INVALID_HANDLE_VALUE)
{
do
{
if (FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
if (strcmp(FindData.cFileName, ".") != 0 && strcmp(FindData.cFileName, "..") != 0)
{
dwdirnum++;
char szFullSubDir[MAX_PATH];
StrCpyN(szFullSubDir,dir,strlen(dir));
strcat(szFullSubDir, FindData.cFileName);

strcat(szFullSubDir, "\\*");
//递归遍历子目录
BrowseDir(szFullSubDir);
}
}
} while(FindNextFile(hFile, &FindData));
}
FindClose(hFile);
return TRUE;
}

写的点不规范,
改的用,
个人意见,高手多多指教
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-5-1 17:45:01 | 显示全部楼层
#!/bin/sh
for file in ` find . `
do
    echo $file
done


shell版本的 呵呵
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-5-5 08:15:01 | 显示全部楼层
void SearchDir( CString dir)
{
   CFileFind file;
   BOOL bRet = FALSE;

   if ('\\' != dir[dir.GetLength()-1] )
   {
         dir = dir + "\\*.*";
                 
   }

   bRet = file.FindFile((LPCTSTR)dir, 0);
   if(!bRet )
           return;

   do
   {
           bRet = file.FindNextFile();

           if (file.IsDots())
           {
           }
           else if (file.IsDirectory() )
           {
                   //string strTemp = file.GetFilePath();
                   SearchDir(file.GetFilePath() );
           }
           else
           {
                   std::cout<<file.GetFilePath()<<std::endl;
           }
   }while(bRet);
   
}
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-5-6 15:30:01 | 显示全部楼层
注意利用递归思想
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-5-6 17:00:01 | 显示全部楼层
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <cstring>
#include <list>
#include <algorithm>
#include "windows.h"
#include "stdlib.h"
#include "Chdir.h"
#include "file.h"
//
std::list<std::string> dirs,files;
//
void path_list(const char* fname){
        using namespace std;
  Chdir set_path;
  set_path.cd(fname);
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind = INVALID_HANDLE_VALUE;
  DWORD dwError;
  //cout<<"Target directory is "<<path<<".\n";
  char aim[MAX_PATH];
  strncpy (aim, fname, strlen(fname)+1);
  strncat (aim, "\\*", 3);
  hFind = FindFirstFile(aim, &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE)
  {
    cerr<<"FindFirstFile("<<aim<<" ,&FindFileData) run error!\n";
    exit( GetLastError() );
  }
  else
  {
    //cout<<"First file name is "<<FindFileData.cFileName<<"\n";
    char s[MAX_PATH];
    if( 0!=strcmp(".",FindFileData.cFileName) ){
      _fullpath(s,FindFileData.cFileName,MAX_PATH);
                        files.push_back(s);
    }
    while (FindNextFile(hFind, &FindFileData) != 0)
    {
      if( 0==strcmp("..",FindFileData.cFileName) ) continue;
      if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){
              _fullpath(s,FindFileData.cFileName,MAX_PATH);
              dirs.push_back(s);
            }
            else{
                    _fullpath(s,FindFileData.cFileName,MAX_PATH);
              files.push_back(s);
            }
    }
    dwError = GetLastError();
    FindClose(hFind);
    if (dwError != ERROR_NO_MORE_FILES)
    {
      cerr<<"FindNextFile error!\n";
      exit(dwError);
    }
  }
}
//
void full_path_list(const char* fname){
        using namespace std;
  Chdir set_path;
  set_path.cd(fname);
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind = INVALID_HANDLE_VALUE;
  DWORD dwError;
  //cout<<"Target directory is "<<path<<".\n";
  char aim[MAX_PATH];
  strncpy (aim, fname, strlen(fname)+1);
  strncat (aim, "\\*", 3);
  hFind = FindFirstFile(aim, &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE)
  {
    cerr<<"FindFirstFile("<<aim<<" ,&FindFileData) run error!\n";
    exit( GetLastError() );
  }
  else
  {
    //cout<<"First file name is "<<FindFileData.cFileName<<"\n";
    char s[MAX_PATH];
    if( 0!=strcmp(".",FindFileData.cFileName) ){
      _fullpath(s,FindFileData.cFileName,MAX_PATH);
                        files.push_back(s);
    }
    while (FindNextFile(hFind, &FindFileData) != 0)
    {
      if( 0==strcmp("..",FindFileData.cFileName) ) continue;
      if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){
              _fullpath(s,FindFileData.cFileName,MAX_PATH);
              dirs.push_back(s);
              full_path_list(s);
            }
            else{
                    _fullpath(s,FindFileData.cFileName,MAX_PATH);
              files.push_back(s);
            }
    }
    dwError = GetLastError();
    FindClose(hFind);
    if (dwError != ERROR_NO_MORE_FILES)
    {
      cerr<<"FindNextFile error!\n";
      exit(dwError);
    }
  }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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