遍历给定文件夹下指定类型的文件

jerrying0203 2011-03-15 04:06:28
输入文件夹路径,将其中所有以.cpp和.h为后缀的文件内容写入一个新的文件中,请高手帮忙,现等。
...全文
202 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerrying0203 2011-03-15
  • 打赏
  • 举报
回复
谢谢各位,搞定了
delphiwcdj 2011-03-15
  • 打赏
  • 举报
回复
strcat(szFind,"\\*.cpp");主要是这句受限
一种方法在void findFile(char filePath[])函数中再添加一个参数,用于指定后缀。然后在调用此函数的地方就可以灵活指定后缀了
jerrying0203 2011-03-15
  • 打赏
  • 举报
回复
#include <windows.h>
#include <stdio.h>
#include<iostream.h>
#include<fstream>
FILE *fp;
FILE *pFile;
void findFile(char filePath[])
{
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char szFile[MAX_PATH];

strcpy(szFind,filePath);
strcat(szFind,"\\*.cpp");

hFind=FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
return;

while(TRUE)
{

if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,filePath);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);
findFile(szFile);
}
}
else
{
cout<<filePath<<"\\\\"<<FindFileData.cFileName<<endl;
fprintf(fp,"\#\#\#\#\#%s\#\#\#\#\#\n",FindFileData.cFileName);

strcpy(szFile,filePath);
strcat(szFile,"\\\\");
strcat(szFile,FindFileData.cFileName);
pFile=fopen(szFile,"r");
if(pFile==NULL)
{
printf("wrong!");
exit(1);
}
char ch;
while((ch=getc(pFile))!=EOF)
{
fprintf(fp,"%c",ch);
}

}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}

int main()
{
fp = fopen("D:\\path.txt","a");
findFile("D:\\text1");
fclose(fp);
return 0;
}


我改成这样可以实现.cpp文件,怎么弄findnextfile语句再实现.h文件?????
delphiwcdj 2011-03-15
  • 打赏
  • 举报
回复
先FindFile然后FindNextFile
delphiwcdj 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jerrying0203 的回复:]

#include <windows.h>
#include <stdio.h>
FILE *fp;
void findFile(char filePath[])//这个是你要的函数
{
char szFind[MAX_PATH];//这是要找的
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char szFile[MAX_P……
[/Quote]
没有少啊
jerrying0203 2011-03-15
  • 打赏
  • 举报
回复
#include <windows.h>
#include <stdio.h>
FILE *fp;
void findFile(char filePath[])//这个是你要的函数
{
char szFind[MAX_PATH];//这是要找的
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char szFile[MAX_PATH];

strcpy(szFind,filePath);
strcat(szFind,"\\*.*");//利用通配符找这个目录下的所以文件,包括目录

hFind=FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;

while(TRUE)
{

if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//这是目录
{
if(FindFileData.cFileName[0]!='.')//.表示当前目录,因为每个目录下面都有两个默认目录就是..和.分别表示上一级目录和当前目录
{
strcpy(szFile,filePath);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);
findFile(szFile);//寻找这个目录下面的文件
}
}
else
{
fprintf(stdout,"%s\\%s\n",filePath,FindFileData.cFileName);//打印出目录下的文件的路径和名称
fprintf(fp,"%s\\%s\n",filePath,FindFileData.cFileName);//这将结果存档到c:\\path.txt中。
}
if(!FindNextFile(hFind,&FindFileData))//寻找下一个文件
break;
}
FindClose(hFind);//关闭句柄
}

int main()
{
fp = fopen("C:\\path.txt","w");
findFile("D:\\e-book");//这里是你要遍历的目录,你自己可以改变,它会显示这个目录下的所有文件,包括这个目录下子目录下的文件。
fclose(fp);
return 0;
}



我修改的是网上的这个代码 ,但是发现输出结果中filePath为D:\e-book 少了一/,所以文件流没法打开,怎么办?
delphiwcdj 2011-03-15
  • 打赏
  • 举报
回复
参考

void CMockAppDlg::MyFindFile(CString strPath)
{
CString strTemp;
if (strPath.Right(1)!="\\")
{
strTemp.Format("%s\\*.*",strPath);
}
else
{
strTemp.Format("%s*.*",strPath);
}

CFileFind findfile;
BOOL bFind=findfile.FindFile(strTemp);
while (bFind)
{
bFind=findfile.FindNextFile();

if (findfile.IsDirectory())
{
if (!findfile.IsDots())
{
MyFindFile(findfile.GetFilePath());
}
}
else
{
// 用一个CStatic控件显示查找的每一个文件
m_ctlShowFileName.SetWindowText(findfile.GetFileName());

if (strFileName==findfile.GetFileName())
{
m_ctlFileList.AddString(findfile.GetFilePath());
}
}
if (bStop)
{
return;
}
}
}

zhanshen2891 2011-03-15
  • 打赏
  • 举报
回复
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>

void ErrorHandler(LPTSTR lpszFunction);

int _tmain(int argc, TCHAR *argv[])
{
WIN32_FIND_DATA ffd;
LARGE_INTEGER filesize;
TCHAR szDir[MAX_PATH];
size_t length_of_arg;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError=0;

// If the directory is not specified as a command-line argument,
// print usage.

if(argc != 2)
{
_tprintf(TEXT("\nUsage: %s <directory name>\n"), argv[0]);
return (-1);
}

// Check that the input path plus 2 is not longer than MAX_PATH.

StringCchLength(argv[1], MAX_PATH, &length_of_arg);

if (length_of_arg > (MAX_PATH - 2))
{
_tprintf(TEXT("\nDirectory path is too long.\n"));
return (-1);
}

_tprintf(TEXT("\nTarget directory is %s\n\n"), argv[1]);

// Prepare string for use with FindFile functions. First, copy the
// string to a buffer, then append '\*' to the directory name.

StringCchCopy(szDir, MAX_PATH, argv[1]);
StringCchCat(szDir, MAX_PATH, TEXT("\\*"));

// Find the first file in the directory.

hFind = FindFirstFile(szDir, &ffd);

if (INVALID_HANDLE_VALUE == hFind)
{
ErrorHandler(TEXT("FindFirstFile"));
return dwError;
}

// List all the files in the directory with some info about them.

do
{
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
_tprintf(TEXT(" %s <DIR>\n"), ffd.cFileName);
}
else
{
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
_tprintf(TEXT(" %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);
}
}
while (FindNextFile(hFind, &ffd) != 0);

dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES)
{
ErrorHandler(TEXT("FindFirstFile"));
}

FindClose(hFind);
return dwError;
}


void ErrorHandler(LPTSTR lpszFunction)
{
// Retrieve the system error message for the last-error code

LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dw = GetLastError();

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );

// Display the error message and exit the process

lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
(lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR));
StringCchPrintf((LPTSTR)lpDisplayBuf,
LocalSize(lpDisplayBuf) / sizeof(TCHAR),
TEXT("%s failed with error %d: %s"),
lpszFunction, dw, lpMsgBuf);
MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);

LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
}



摘自MSDN
wei801516 2011-03-15
  • 打赏
  • 举报
回复
文件流+判断的啦!~。。。。。。。
bdmh 2011-03-15
  • 打赏
  • 举报
回复
先遍历,api的findfirst,findnext,然后就是打开文件,FILE,或文件流都可以,打开读取,然后写入,如果用FILE,就是fread,fwrite
Defonds 2011-03-15
  • 打赏
  • 举报
回复
没有代码。这个不难实现吧?

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧