采用标准c进行目录文件遍历

图像处理的时候经常需要对一个目录的所有图像进行处理,遍历文件得c代码:

在windows中需要使用到宽字符。

另外,可以使用opencv封装的目录访问操作,下次给出。


 

// DirTraverse.cpp : Defines the entry point for the console application.

//



#include "stdafx.h"

#include "windows.h"

#include <string.h>

#include <Strsafe.h>

#include <iostream>





using namespace std;



char *w2c(char *pcstr,const wchar_t *pwstr, size_t len);

void TraverseDirectory(wchar_t Dir[MAX_PATH]);

char * imageDir = "D:\\enroll\\";





int main( int argc, const char** argv )

{

	locale loc( "chs" );                //支持中文输出,否则wchar可能无法输出值为中文的变量

	wcout.imbue( loc );



	TraverseDirectory(L"D:\\images\\all_0407\\");



	system("pause");

    return 0;

}







//Converting a WChar string to a Ansi string  

char *w2c(char *pcstr,const wchar_t *pwstr, size_t len)  

{  

    int nlength=wcslen(pwstr);  

    //获取转换后的长度  

    int nbytes = WideCharToMultiByte( 0, 0, pwstr, nlength, NULL,0,NULL, NULL );   

    if(nbytes>len)   nbytes=len;  

    // 通过以上得到的结果,转换unicode 字符为ascii 字符  

    WideCharToMultiByte( 0,0, pwstr, nlength,   pcstr, nbytes, NULL,   NULL );  

    return pcstr ;  

}  



//传入要遍历的文件夹路径,并遍历相应文件夹

void TraverseDirectory(wchar_t Dir[MAX_PATH])    

{

	WIN32_FIND_DATA FindFileData;

	HANDLE hFind=INVALID_HANDLE_VALUE;

	wchar_t DirSpec[MAX_PATH];                  //定义要遍历的文件夹的目录

	DWORD dwError;

	StringCchCopy(DirSpec,MAX_PATH,Dir);

        StringCchCat(DirSpec,MAX_PATH,TEXT("\\*"));   //定义要遍历的文件夹的完整路径\*



	hFind=FindFirstFile(DirSpec,&FindFileData);          //找到文件夹中的第一个文件



	if(hFind==INVALID_HANDLE_VALUE)                               //如果hFind句柄创建失败,输出错误信息

	{

		FindClose(hFind); 

		return;  

	}

	else 

	{

		while(FindNextFile(hFind,&FindFileData)!=0)                            //当文件或者文件夹存在时

		{

			if((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0&&wcscmp(FindFileData.cFileName,L".")==0||wcscmp(FindFileData.cFileName,L"..")==0)        //判断是文件夹&&表示为"."||表示为"."

			{

				 continue;

			}

			if((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0)      //判断如果是文件夹

			{

				wchar_t DirAdd[MAX_PATH];

				StringCchCopy(DirAdd,MAX_PATH,Dir);

				StringCchCat(DirAdd,MAX_PATH,TEXT("\\"));

				StringCchCat(DirAdd,MAX_PATH,FindFileData.cFileName);       //拼接得到此文件夹的完整路径

				TraverseDirectory(DirAdd);                                  //实现递归调用

			}

			if((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0)    //如果不是文件夹

			{

				//wcout<<Dir<<"\\"<<FindFileData.cFileName<<endl;            //输出完整路径

				char * fname = (char*)malloc(sizeof(char)*(2*wcslen(FindFileData.cFileName)+1));

				memset(fname,0,2*wcslen(FindFileData.cFileName)+1);

				w2c(fname, FindFileData.cFileName, 2*wcslen(FindFileData.cFileName)+1); // 获取文件名

				cout<<fname<<endl;



				if(strstr(fname, ".jpg"))

				{

					char * fullName = (char*)malloc(strlen(imageDir)+strlen(fname)+1);

					strcpy(fullName, imageDir);

					strcat(fullName, fname); // 获取完全路径

					// process

					// TODO

					//

					free(fullName);

				}

				// free

				free(fname);

			}

		}

		FindClose(hFind);

	}

}


 

 

你可能感兴趣的:(文件)