windows下使用CC++怎么遍历目录并读取目录下的文件列表

windows下使用CC++怎么遍历目录并读取目录下的文件列表,第1张

// FileScancpp : 定义控制台应用程序的入口点。

//

#include "stdafxh"

#include <filesystem>

#include <windowsh>

#define OK 0

#define ERR -1

#define TEST_FILE_MAX_SIZE "467G"

#define EXT_LEN 8

#define TYPE_LEN 8

#define DIR_MAX_LEN 260 //文件路径最多256个字符,加上D:\\

//ftell()返回int,最大2G 1<<32-1

typedef enum COND_VALUE

{

COND_VALUE_MORE = 0 ,//大于

COND_VALUE_LESS = 1 ,//小于

COND_VALUE_EUAQL = 2 ,//等于

COND_VALUE_MAX = 0xf

}COND_VALUE_E;

typedef enum COND_TYPE

{

COND_TYPE_SIZE = 0 ,

COND_TYPE_CTIME = 1 ,

COND_TYPE_MTIME = 2,

COND_TYPE_EXTNAME = 4,

COND_TYPE_FILETYPE = 8,

COND_TYPE_MAX  = 0xf

}COND_TYPE_E;

typedef struct COND_INFO

{

char cCondType : 4;

char cCondValue : 4;

}COND_INFO_S;

typedef struct FILE_COND

{

//按照bit位来划分,前面四个bit位表示条件类型,后面四个bit位表示条件值

char cSymbol;//用来标志大于或者小于,搜索时间,大小,类型,扩展名,属性

char szRes[ 3 ];//预留3个字节,四字节对齐

unsigned int uiSizeHigh;//文件大小 高位

unsigned int uiSizeLow;//低位

unsigned int uiCStartTime;//创建时间

unsigned int uiCEndTime;

unsigned int uiMStartTime;//修改时间

unsigned int uiMEndTime;

char szExtName[ EXT_LEN ];//扩展名

char szFileType[ TYPE_LEN ];//文件类型

unsigned int uiFileAttrib;//文件属性

unsigned int uiFolderSizeHight;//文件夹大小

unsigned int uiFolderSizeLow;

}FILE_COND_S;

//最大允许多少个条件搜索

#define CONDITION_MAX 4

FILE_COND_S g_astCond[ CONDITION_MAX ] = { 0 };

int g_iCondCnt = 0;

int DisposeFile(char szFilePath[] , WIN32_FIND_DATA stWinFile)

{

DWORDLONG dwHighBase = MAXDWORD;

dwHighBase += 1;

DWORDLONG FileSize = stWinFilenFileSizeHigh dwHighBase + stWinFilenFileSizeLow;

printf("%s\\%s--Size:%lu\n" , szFilePath , stWinFilecFileName , FileSize);

return OK;

}

//转换字符串文件大小(如 4567G)到int类型的文件大小

#define SECTION_CNT 2

#define MAX_NUM_DEC 100

#define UNIT_CNT 4

#define KB_OFFSET 10 //1KB == 1BIT<<10;

#define MB_OFFSET 20

#define GB_OFFSET 30

#define TB_OFFSET 40

#define INT_OFFSET 32

int ConvertSizeStr2SizeLong(char szSizeStr[],unsigned int puiSizeHigh,unsigned int puiSizeLow)

{

int aNumSect[ SECTION_CNT ] = { 0 };//分别存整数位和小数位

//char sz = "";

char acValidUint[UNIT_CNT] = { 'K' , 'M' , 'G' , 'T' };//数组

//char acValidUint[] = "KMGT";//字符串

char acOffset[ UNIT_CNT ] = { KB_OFFSET , MB_OFFSET , GB_OFFSET , TB_OFFSET };

char cOffset = 0;

int iBaseNum;

char pcTmp;

int index = 0;

int i;

int iMask;

//入参判断

if (szSizeStr == NULL)

{

return ERR;

}

pcTmp = szSizeStr;

while (pcTmp!=0)

{

if (pcTmp == '')

{

index++;

if ( index >= SECTION_CNT )

{

return ERR;

}

}

else if ( pcTmp >= '0' && pcTmp <= '9' )

{

//小数位取3位,剩余的舍去

if ( index == 1 && aNumSect[ index ] > MAX_NUM_DEC )

{

pcTmp++;

continue;

}

else if (index == 0 && aNumSect[index] > MAX_NUM_DEC)

{

//1234G 不合法,应该写成1234T

return ERR;

}

aNumSect[ index ] = aNumSect[ index ]  10 + pcTmp - '0';

}

else

for ( i = 0; i < UNIT_CNT;++i )

{

if ( toupper(pcTmp) == acValidUint[ i ] )

{

break;

}

}

if (i == UNIT_CNT)

{

return ERR;

}

}

pcTmp++;

}

if (cOffset == 0)

{

puiSizeHigh = 0;

puiSizeLow = aNumSect[ 0 ];

else

{

//先转为下一级单位

iBaseNum = ( aNumSect[ 0 ] << KB_OFFSET ) + aNumSect[ 0 ];//能保证小于MAX_UNIT

cOffset -= KB_OFFSET;

}

iMask = ( 1 << cOffset ) - 1;//用于取低于(INT_OFFSET - cOffset)数据

puiSizeHigh = ( iBaseNum >> ( INT_OFFSET - cOffset ) ) & iMask;

puiSizeLow = iBaseNum << cOffset;

return OK;

}

//比较文件大小

int CompareFileSize(WIN32_FIND_DATA stWinFile , FILE_COND_S stCond,char cCondValue)

{

switch ( cCondValue )

{

case COND_VALUE_LESS:

{

if ( stWinFilenFileSizeHigh > stConduiSizeHigh )

{

return ERR;

}

else if ( stWinFilenFileSizeHigh ==stConduiSizeHigh )

{

if ( stWinFilenFileSizeLow > stConduiSizeLow )

{

return ERR;

}

}

break;

}

case COND_VALUE_MORE:

{

if ( stWinFilenFileSizeHigh < stConduiSizeHigh )

{

return ERR;

}

else if ( stWinFilenFileSizeHigh == stConduiSizeHigh )

{

if ( stWinFilenFileSizeLow < stConduiSizeLow )

{

return ERR;

}

}

break;

}

case COND_VALUE_EUAQL:

{

if ( stWinFilenFileSizeHigh != stConduiSizeHigh || stWinFilenFileSizeLow != stConduiSizeLow )

{

return ERR;

}

break;

}

default:

break;

}

return OK;

}

int CompareFileTime(WIN32_FIND_DATA stWinFile , FILE_COND_S stCond , char cCondValue)

{

return OK;

}

int CheckCondition(char szFilePath[],WIN32_FIND_DATA stWinFile)

{

int i;

int iCondType;

int iCondValue;

COND_INFO_S pstCondInfo;

for ( i = 0; i < g_iCondCnt; ++i )

{

pstCondInfo = (COND_INFO_S)(&( g_astCond[ i ]cSymbol));

switch (pstCondInfo->cCondType)

{

case COND_TYPE_SIZE:

{

if ( CompareFileSize(stWinFile , g_astCond[ i ],pstCondInfo->cCondValue) != OK )

{

return ERR;

}

break;

}

case COND_TYPE_CTIME:

{

if ( CompareFileTime(stWinFile , g_astCond[ i ] , pstCondInfo->cCondValue) != OK )

{

return ERR;

}

break;

}

//

default:

break;

}

}

return OK;

}

int ScanDir(char szDir[])

{

if ( szDir == NULL )

{

return ERR;

}

char szSubDir[ DIR_MAX_LEN ] = { 0 };

char szFind[ DIR_MAX_LEN ] = { 0 };

WIN32_FIND_DATA stWinFile;

HANDLE hd;

_snprintf_c(szFind , 

DIR_MAX_LEN , 

"%s\\" ,

szDir);//两个反斜杠表示一个反斜杠转义符

hd = FindFirstFile(szFind , &stWinFile);//hd标志文件位置,用于查找下一个文件

if ( hd == INVALID_HANDLE_VALUE )

{

return ERR;

}

while (1)

{

if (strcmp(stWinFilecFileName,"") == 0 || strcmp(stWinFilecFileName,"") == 0)

{

//NULL

}

//判断是否是文件夹

else if ( stWinFiledwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )

{

//清空szSubDir,因为在重新对szSubDir赋值时,是直接覆盖的,后者比当前保存的数据短,所以需要先清空再赋值

memset(szSubDir , 0 , DIR_MAX_LEN);

_snprintf_c(szSubDir , DIR_MAX_LEN , "%s\\%s" , szDir , stWinFilecFileName);

ScanDir(szSubDir);//递归处理

}

else

{

if ( CheckCondition(szDir , stWinFile) == OK )

{

DisposeFile(szDir , stWinFile);

}

}

//查找下一个文件失败就跳出循环

if ( !FindNextFile(hd , &stWinFile) )

{

break;

}

}

FindClose(hd);

return OK;

}

int _tmain(int argc, _TCHAR argv[])

{

COND_INFO_S stCond = { 0 };

COND_INFO_S pstCond;

char szDir[] = "C:";

stCondcCondValue = COND_TYPE_SIZE;

stCondcCondValue = COND_VALUE_MORE;

if (ConvertSizeStr2SizeLong(TEST_FILE_MAX_SIZE,&(g_astCond[0]uiSizeHigh),&(g_astCond[0]uiSizeLow)) == OK)

{

memcpy(&(g_astCond[ 0 ]cSymbol),&stCond,1);

pstCond = (COND_INFO_S)( &g_astCond[ 0 ]cSymbol );

g_iCondCnt = 1;

ScanDir(szDir);

}

system("pause");

return 0;

}

看main函数和ScanDir函数。

ScanDir是一个递归函数。

#include <stdioh>

#include <unistdh>

int main(void)

{

//符号链接的路径

char sln[] = "/aaa";

char buf[1024];

ssize_t len;

if ((len = readlink(sln, buf, 1024 - 1)) != -1) {

buf[len] = '\0';

}

printf("%s\n", buf);

return 0;

}

有个思路就是 你选中之后 把文件的路径复制到剪切板 然后

你自己的程序里 写一个监听的程序 用于监测剪切板 当剪切板内容符合你程序规则的时候 把这个路径从剪切板里拷贝出去 到你的程序里

#include <stdioh>

main()

{

char str[80]="d:\\files\\dataFiles\\data\\avatarbmp"; // 单斜杠处填双斜杠

int L,i;

L = strlen(str);

for (i=L-1;i>=0;i--) if (str[i] == '\\') { str[i] ='\0'; break;}; // 去掉文件名就是路径

printf("Path= %s",str);

return 0;

}

-----------

写成函数和调用:

#include <stdioh>

void fun(char str){

int L,i;

L = strlen(str);

for (i=L-1;i>=0;i--) if (str[i] == '\\') { str[i] ='\0'; break;};

}

main()

{

char str[80]="d:\\files\\dataFiles\\data\\avatarbmp";

fun(str);

printf("Path= %s",str);

return 0;

}

以上就是关于windows下使用C/C++怎么遍历目录并读取目录下的文件列表全部的内容,包括:windows下使用C/C++怎么遍历目录并读取目录下的文件列表、c语言 如何获取目录或文件的软连接、如何C编程获取选中文件位置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9513937.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存