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++怎么遍历目录并读取目录下的文件列表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)