C# 如何读取一个文件夹下的多个文件内容

C# 如何读取一个文件夹下的多个文件内容,第1张

SystemIODirectoryInfo di = new SystemIODirectoryInfo(“文件夹路径”);

FileInfo[] ff = diGetFiles("txt");//只取文本文档

string ss = "";//存放内容

foreach (FileInfo temp in ff)

{

using (StreamReader sr = tempOpenText())

{

ss += srReadToEnd();//内容追加到ss中

}

}

FileAppendAllText("要保存的文件路径", ss);//保存到一个文件里

我也有同样的问题。

到网上查,感觉实现较复杂。

最后用的是c语言调用cmd

生成文件列表文件,再用c语言去读取那个文件。进行字符串处理。

c语言调用cmd 为 system(“cmd命令”);

比如:

#include <stdioh>

#include <dosh>

int main()

{

system("dir /s /b > filelisttxt");/这是全部文件,包括子目录/

system("dir txt /b > filelist2txt"); /当前目录下的所有txt文件,不包括子目录/

/然后/

sleep(100);

FILE ptrin = fopen("filelist","r");/读取并进行处理/

/处理/

/关闭文件flose(ptrin);/

return 0;

}

希望有谁有更好的办法。

// 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是一个递归函数。

1、在linux平台,可采用目录 *** 作函数,读取当前目录下的文件\x0d\#include \x0d\#include //windows开发工具没有这个头文件\x0d\#include \x0d\#include \x0d\main()\x0d\{\x0d\ DIR dir;\x0d\ struct dirent ptr;\x0d\ char file_list[100][40];\x0d\ int i=0;\x0d\ dir = opendir("/etc/rcd"); //打开一个目录\x0d\ while((ptr = readdir(dir)) != NULL) //循环读取目录数据\x0d\ {\x0d\ printf("d_name : %s\n", ptr->d_name); //输出文件名\x0d\ strcpy(file_list[i],ptr->d_name ); //存储到数组\x0d\ if ( ++i>=100 ) break;\x0d\ }\x0d\ closedir(dir);//关闭目录指针\x0d\}\x0d\2、在windows平台下,如VC也有类似的 *** 作函数,如:\x0d\#include \x0d\#include \x0d\using namespace std;\x0d\\x0d\#include \x0d\\x0d\void main() \x0d\{ \x0d\ string szPath="d:/";\x0d\WIN32_FIND_DATA wfd; \x0d\ HANDLE hFind; \x0d\char file_list[100][40];\x0d\ int i=0;\x0d\\x0d\hFind = FindFirstFile(szPathc_str(), &wfd) ;\x0d\ do \x0d\ { \x0d\cout strcpy(file_list[i],wfdcFileName ); //存储到数组\x0d\if ( ++i>=100 ) break;\x0d\ }while (FindNextFile(hFind, &wfd)); \x0d\\x0d\ FindClose(hFind); \x0d\}

输入某文件夹路径,遍历该文件夹及其子文件夹(包括子文件夹的子文件夹等),获取其中所有文件的函数:

/// <summary>

/// 查找指定文件夹下指定后缀名的文件

/// </summary>

/// <param name="directory">文件夹</param>

/// <param name="pattern">后缀名</param>

/// <returns>文件路径</returns>

public void GetFiles(DirectoryInfo directory, string pattern, ref List<string> fileList)

{

if (directoryExists || patternTrim() != stringEmpty)

{

try

{

foreach (FileInfo info in directoryGetFiles(pattern))

{

fileListAdd(infoFullNameToString());

}

}

catch (SystemException ex)

{

ConsoleWriteLine(exToString());

}

foreach (DirectoryInfo info in directoryGetDirectories())//获取文件夹下的子文件夹

{

GetFiles(info, pattern, ref fileList);//递归调用该函数,获取子文件夹下的文件

}

}

}

使用实例:

List<string> FindResult = new List<string>();

GetFiles(new DirectoryInfo(@"C:\","", ref FindResult); //获取C盘下的所有文件路径

GetFiles(new DirectoryInfo(@"\\1921681107\Save"), "", ref FindResult);//获取局域网上共享文件夹下的所有文件

//获取指定目录下的所有文件列表 author:wangchangshaui jlu

char getFileNameArray(const char path, int fileCount)

{

int count = 0;

char fileNameList = NULL;

struct dirent ent = NULL;

DIR pDir;

char dir[512];

struct stat statbuf;

//打开目录

if ((pDir = opendir(path)) == NULL)

{

myLog("Cannot open directory:%s\n", path);

return NULL;

}

//读取目录

while ((ent = readdir(pDir)) != NULL)

{ //统计当前文件夹下有多少文件(不包括文件夹)

//得到读取文件的绝对路径名

snprintf(dir, 512, "%s/%s", path, ent->d_name);

//得到文件信息

lstat(dir, &statbuf);

//判断是目录还是文件

if (!S_ISDIR(statbufst_mode))

{

count++;

}

} //while

//关闭目录

closedir(pDir);

// myLog("共%d个文件\n", count);

//开辟字符指针数组,用于下一步的开辟容纳文件名字符串的空间

if ((fileNameList = (char) myMalloc(sizeof(char) count)) == NULL)

{

myLog("Malloc heap failed!\n");

return NULL;

}

//打开目录

if ((pDir = opendir(path)) == NULL)

{

myLog("Cannot open directory:%s\n", path);

return NULL;

}

//读取目录

int i;

for (i = 0; (ent = readdir(pDir)) != NULL && i < count;)

{

if (strlen(ent->d_name) <= 0)

{

continue;

}

//得到读取文件的绝对路径名

snprintf(dir, 512, "%s/%s", path, ent->d_name);

//得到文件信息

lstat(dir, &statbuf);

//判断是目录还是文件

if (!S_ISDIR(statbufst_mode))

{

if ((fileNameList[i] = (char) myMalloc(strlen(ent->d_name) + 1))

== NULL)

{

myLog("Malloc heap failed!\n");

return NULL;

}

memset(fileNameList[i], 0, strlen(ent->d_name) + 1);

strcpy(fileNameList[i], ent->d_name);

myLog("第%d个文件:%s\n", i, ent->d_name);

i++;

}

} //for

//关闭目录

closedir(pDir);

fileCount = count;

return fileNameList;

}

DirectoryInfo dir = new DirectoryInfo("c:\\test");

FileInfo[] fileInfo = dirGetFiles();

List<string> fileNames = new List<string>();

foreach (FileInfo item in fileInfo)

{

    fileNamesAdd(itemName);

}

这是我的TFTP程序中的一个函数,是搜索当前盘符下的所有文件,包括文件的大小,并发送到客户端,其中就有查找当前路径下的文件,你自己挑一下,应该能完成你的需求。

void FileList(sockaddr_in sour_addr,char strStartDir[])

{

char sendbuffer[1024];

sockaddr_in destaddr;

int sourlen = 0;

int ret = 0;

int len = 0;

int flen = 0;

fd_set fdr;

unsigned short blocknum = 0;

FILE file;

char filename[128];

strcpy(filename,strStartDir+2); /获取文件名/

strcat(filename,"\\");

destaddrsin_family = AF_INET;

destaddrsin_port = sour_addrsin_port;

destaddrsin_addrs_addr = inet_addr(desthost);//

WIN32_FIND_DATA FindFileData;

HANDLE hFind;

hFind = FindFirstFile(filename, &FindFileData);

if (hFind == INVALID_HANDLE_VALUE)

{

printf ("Invalid File Handle");

}

else

{

while(FindNextFile(hFind,&FindFileData))

{

printf(FindFileDatacFileName);

printf("\r\n");

memset(sendbuffer,'\0',1024);

len = filldata(blocknum++,FindFileDatacFileName,strlen(FindFileDatacFileName),sendbuffer,sizeof(sendbuffer));

ret = sendto(serverSock,sendbuffer,len,0,(sockaddr )&destaddr,sizeof(destaddr));

}

len = fillover(blocknum,"Over",4,sendbuffer,sizeof(sendbuffer));

ret = sendto(serverSock,sendbuffer,len,0,(sockaddr )&destaddr,sizeof(destaddr));

FindClose(hFind);

return;

}

}

以上就是关于C# 如何读取一个文件夹下的多个文件内容全部的内容,包括:C# 如何读取一个文件夹下的多个文件内容、如何获得某一文件夹下文件列表(C语言)、windows下使用C/C++怎么遍历目录并读取目录下的文件列表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/10057377.html

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

发表评论

登录后才能评论

评论列表(0条)

保存