C++ Java Qt 遍历文件夹

本文介绍几个遍历文件夹的方法,包括 Linux 下使用 C++,Windows 下使用 C++ 和 Qt 中的文件夹遍历。

Linux 下使用 C++

#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <list>
#include<iostream>
#include<stdlib.h>
using namespace std;

void dfsDirectory(string dir,list<string> &files)
{
	DIR* dp;
    struct dirent* dirp;
    struct stat st;
	/* open dirent directory */
	if((dp = opendir(dir.c_str())) == NULL)
	{
		cout << "Faile to opendir " << dir << endl;
		exit(-1);
	}
	
	/* read all files in this dir */
	while((dirp = readdir(dp)) != NULL)
	{
		char fullname[256];
		memset(fullname, 0, sizeof(fullname));
		/* ignore hidden files */
		if(dirp->d_name[0] == '.')
			continue;
		strcpy(fullname, dir.c_str());
		strcat(fullname, "/");
		strcat(fullname, dirp->d_name);
		/* get dirent status */
		if(stat(fullname, &st) == -1)
		{
			perror("stat");
			fputs(fullname, stderr);
			exit(-1);
		}
		/* if dirent is a directory, call itself */
		if(S_ISDIR(st.st_mode))
		{
			dfsDirectory(fullname, files);
		}
		/*is a file*/
		else
			files.push_back(fullname);
	}
}

Windows 下使用 C++

#include <list>
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;

void dfsDirectory(string dir, list<string> &files)
{
	char szFile[MAX_PATH] = {0};
	char szFind[MAX_PATH];
	char root[MAX_PATH];

	WIN32_FIND_DATA FindFileData;
	strcpy(szFind,dir.c_str());
	strcat(szFind,"\\*.*");
	HANDLE hFind = FindFirstFile(szFind,&FindFileData);

	if(INVALID_HANDLE_VALUE == hFind)
		return ;
	while(TRUE)
	{
	    /* is a directory*/
		if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
		    /* ignore hidden files */
			if(FindFileData.cFileName[0]!='.')
			{
				strcpy(szFile,dir.c_str());
				strcat(szFile,"\\");
				strcat(szFile,FindFileData.cFileName);
				dfsDirectory(szFile, files);
			}
		}
		/*is a file*/
		else
		{
			strcpy(root, dir);
			strcat(root, "\\");
			strcat(root,FindFileData.cFileName);
			files.push_back(root);
		}
		if(!FindNextFile(hFind,&FindFileData))
			break;
	}
	FindClose(hFind);
}

Qt 遍历文件夹

#include <list>
#include<iostream>
#include<string>
#include <QMainWindow>
#include <QDir>
#include <QDirIterator>
using namespace std;

void dfsDirectory(string dir, list<string> &files)
{
    // 判断路径是否存在
    QDir qdir(QString::fromLocal8bit(dir.c_str()));
    if(!qdir.exists())
    {
          return;
    }
    // 获取所选文件类型过滤器
    QStringList filters;
    filters<< QString("*.jpeg") << QString("*.jpg") << QString("*.png") << QString("*.tiff") << QString("*.gif") << QString("*.bmp");
    // 定义迭代器并设置过滤器
    QDirIterator dirIte(QString::fromLocal8bit(dir.c_str()), filters, QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories);
    while(dirIte.hasNext())
    {
        dirIte.next();
        QFileInfo fileInfo = dirIte.fileInfo();
        QString absoluteFilePath = fileInfo.absoluteFilePath();
        files.push_back(absoluteFilePath.toStdString());
    }
}

Java 遍历文件夹

import java.io.File;
import java.util.ArrayList;

public class ShowFiles {

    private static ArrayList filelist = new ArrayList(); 
    
    public static void main(String[] args) {
        dfsDirectory("directory path here");
    }
    
    public static void dfsDirectory(String dir) { 
        File file = new File(dir); 
        File[] files = dir.listFiles(); 
        
        if (files == null) 
            return; 
        for (int i = 0; i < files.length; i++) { 
            if (files[i].isDirectory()) { 
                dfsDirectory(files[i].getAbsolutePath()); 
            } else { 
                filelist.add(files[i].getAbsolutePath());                    
            } 
        } 
    }
}
Tagged on: , , ,

发表评论

电子邮件地址不会被公开。