如何遍历读取某个目录下所有的TXT文件,求助

时间:2022-11-07 12:23:17
需要将一个目录下所有的TXT文本全部读取,有什么比较好的方法呢,求助

20 个解决方案

#1


CFileFind::FindFile/FileNextFile()

#2


给你一段代码参考一下:
// 删除15天之前的log日志文件
void DeleteLogFile( LPCTSTR strLogPath )
{
if ( !PathFileExists( strLogPath ) )
{
return;
}

time_t tCurTime = time( NULL ); // 获取当前时间

tstring strFindFileName = strLogPath;
strFindFileName += _T("\\*.*");
WIN32_FIND_DATA wfd;
HANDLE hFindFile = FindFirstFile( strFindFileName.c_str(), &wfd ); 
if ( hFindFile == INVALID_HANDLE_VALUE )

return;
}

while ( true )
{
if ( wfd.cFileName[0] != _T('.') )
{// 非本级或上级目录
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) // 目录
{
if ( !FindNextFile( hFindFile, &wfd ) )
{
break;
}
continue;
}
else if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM ) // 系统文件,不处理
{
if ( !FindNextFile( hFindFile, &wfd ) )
{
break;
}
continue;
}
else // 用户日志文件
{
tstring strLogFile = strLogPath;
strLogFile += _T("\\");
strLogFile += wfd.cFileName;

    time_t tModifyTime = GetFileModifyTime( strLogFile.c_str() );

// 如果是15天之前的文件,则将之删除掉(拿当前时间和文件的最后修改时间作比较)
if ( tCurTime - tModifyTime > DELETE_INTERVAL_SECOND )
{
DeleteFile( strLogFile.c_str() );
}
}
}

if ( !FindNextFile( hFindFile, &wfd ) )
{
break;
}
};

FindClose( hFindFile );
}

#3


  MFC中有一个类CFileFind,使用它进行文件的查找。
 
  CString strFile;
 
  CFileFind find;
 
  BOOL bWorking = find.FindFile("C:/windows/*.txt");//这是搜索C:/WIndows的txt
 
  while(bWorking)
 
  {
 
  bWorking=find.FindNextFile();
 
  strFile=find.GetFileName();
 
  }

#4


当然上面的代码只能搜索这一级文件夹的txt、

#5


先遍历一个目录下所有的文件和文件夹,然后获得文件夹和文件夹名之后,就是一个字符串处理的问题了,也就是判断名字的后4个位置的内容是不是.txt就可以了

#6


引用 4 楼 bojie5744 的回复:
当然上面的代码只能搜索这一级文件夹的txt、

我就是要写死在一个目录下的TXT文件读取,na

引用 3 楼 bojie5744 的回复:
  MFC中有一个类CFileFind,使用它进行文件的查找。
 
  CString strFile;
 
  CFileFind find;
 
  BOOL bWorking = find.FindFile("C:/windows/*.txt");//这是搜索C:/WIndows的txt
 
  while(bWorking)
 
  {
 
  bWorking=find.FindNextFile();
 
  strFile=find.GetFileName();
 
  }

这个FindNextName需要参数啊好像要

#7


引用 6 楼 hzddm12340 的回复:
Quote: 引用 4 楼 bojie5744 的回复:

当然上面的代码只能搜索这一级文件夹的txt、

我就是要写死在一个目录下的TXT文件读取,na

引用 3 楼 bojie5744 的回复:
  MFC中有一个类CFileFind,使用它进行文件的查找。
 
  CString strFile;
 
  CFileFind find;
 
  BOOL bWorking = find.FindFile("C:/windows/*.txt");//这是搜索C:/WIndows的txt
 
  while(bWorking)
 
  {
 
  bWorking=find.FindNextFile();
 
  strFile=find.GetFileName();
 
  }

这个FindNextName需要参数啊好像要

2楼已经给出代码了,可以参考

#8


当然2楼的代码是删除文件功能,你可以借鉴修改。

#9


CFileFind finder;
BOOL bFind = finder.FindFile(m_filepath);
if(bFind!=0)
{
CStdioFile LogFile;
char* old_locale=_strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE,"chs");
CString strRow;
LogFile.Open(m_filepath,CFile::modeRead);
while(LogFile.ReadString(strRow))
{

m_strModelContent=m_strModelContent+strRow+_T("\n");
}
setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置
free( old_locale );//还原区域设定
}

加头文件 #include <locale.h>访问中文字符

#10


不需要判断扩展名,直接搜索 *.txt 就行了。比如搜索 C:\Windows\*.exe。
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
#include <tchar.h>

int _tmain(int argc, TCHAR *argv[])
{
HANDLE hFind = INVALID_HANDLE_VALUE;
    TCHAR szPath[] = TEXT("C:\\Windows");
    TCHAR szFind[MAX_PATH] = { 0 };
    WIN32_FIND_DATA wfd = { 0 };
    
    PathCombine(szFind, szPath, TEXT("*.exe"));
    hFind = FindFirstFile(szFind, &wfd);
    if (hFind != INVALID_HANDLE_VALUE) {
        TCHAR szFile[MAX_PATH] = { 0 };
        do {
            PathCombine(szFile, szPath, wfd.cFileName);
            _tprintf(TEXT("%s\n"), szFile);
        } while (FindNextFile(hFind, &wfd));
        FindClose(hFind);
    }
    return 0;
}

#11


system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad  c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。

#12


引用 9 楼 GANSUYZHY 的回复:
CFileFind finder;
BOOL bFind = finder.FindFile(m_filepath);
if(bFind!=0)
{
CStdioFile LogFile;
char* old_locale=_strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE,"chs");
CString strRow;
LogFile.Open(m_filepath,CFile::modeRead);
while(LogFile.ReadString(strRow))
{

m_strModelContent=m_strModelContent+strRow+_T("\n");
}
setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置
free( old_locale );//还原区域设定
}

加头文件 #include <locale.h>访问中文字符

你看看我的代码,我想尝试遍历txt文件后,把文件里的文本保存下来,因为我后门要把这个文本插入数据库的,但是现在一点击按钮触发事件就终止运行
void CTestDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
CFileFind finder;
CString m_strModelContent="";

BOOL bFind = finder.FindFile("D:/abc/*.txt");
if(bFind!=0)
{
CStdioFile LogFile;
CString filepath=finder.GetFilePath();
char* old_locale=_strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE,"chs");
CString strRow;
LogFile.Open(filepath,CFile::modeRead);
while(LogFile.ReadString(strRow))
{

m_strModelContent=m_strModelContent+strRow+_T("\n");
}

setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置
free( old_locale );//还原区域设定
}
GetDlgItem(IDC_EDIT1)->SetWindowText(m_strModelContent);
}

#13


引用 8 楼 bojie5744 的回复:
当然2楼的代码是删除文件功能,你可以借鉴修改。

能帮我看看我的代码问题在哪吗,总是报内存不能为read那种错误
void CTestDlg::OnButton1() 
{

CString strFile;
CFileFind find;
CString sFileName;
CStdioFile out;  
HANDLE h;
WIN32_FIND_DATA p;
BOOL bWorking = find.FindFile("D:/abc/*.txt");
while (bWorking)
{   
bWorking=FindNextFile(h,&p);
       sFileName=find.GetFilePath();
out.Open(sFileName, CFile::modeRead); 
CString sSql="",s; //读取文件
do{  out.ReadString(s);  sSql=sSql+s+(char)10; }  
while (out.GetPosition()!=out.GetLength()); 
out.Close();  
GetDlgItem(IDC_EDIT1)->SetWindowText(sSql);
}

}

#14


引用 1 楼 VisualEleven 的回复:
CFileFind::FindFile/FileNextFile()

版主大人,我现在能读取单个txt文件里的文本,然后保存下来,但是一遍历某目录下所有的txt文件就不成功,可否帮看看代码哪里除了问题,谢谢
void CTestDlg::OnButton1() 
{

CString strFile;
CFileFind find;
CString sFileName;
CStdioFile out;  
HANDLE h;
WIN32_FIND_DATA p;
BOOL bWorking = find.FindFile("D:/abc/*.txt");
while (bWorking)
{   
bWorking=FindNextFile(h,&p);
       sFileName=find.GetFilePath();
out.Open(sFileName, CFile::modeRead); 
CString sSql="",s; //读取文件
do{  out.ReadString(s);  sSql=sSql+s+(char)10; }  
while (out.GetPosition()!=out.GetLength()); 
out.Close();  
GetDlgItem(IDC_EDIT1)->SetWindowText(sSql);
}

}

#15


本帖最后由 VisualEleven 于 2014-07-18 13:40:53 编辑
void RecurseFiles(LPCTSTR lpszDir, LPCTSTR lpszExtension, HWND hEdit)
{
  ASSERT(NULL != lpszDir);
       ASSERT(NULL != lpszDir);
      ASSERT(NULL != hEdit);
CFileFind finder;

// build a string with wildcards
CString strWildcard(lpszDir);
strWildcard += _T("\\*.*");

// start working for files
BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots())
{
continue;
}

CString strPath(finder.GetFilePath());
if(finder.IsDirectory())
{
RecurseFiles(strPath, lpszExtension, hEdit);
}
else
{
if(0 == strPath.Right(_tcslen(lpszExtension)).CompareNoCase(lpszExtension))
{
strPath += _T("\r\n");
SendMessage(hEdit, EM_SETSEL, -1, -1);
SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(LPCTSTR)strPath);
}
}
}

finder.Close();
}


// call
HWND hEdit = (HWND)(GetDlgItem(IDC_EDIT1)->GetSafeHwnd());
RecurseFiles(_T("G:"), _T("txt"), hEdit);

#16


引用 1 楼 VisualEleven 的回复:
CFileFind::FindFile/FileNextFile()

调用recurseFiles函数写在按钮响应里,但是编译无法通过,错误如下,是不是我的recersefiles函数定义有问题?求教
test1Dlg.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall CTest1Dlg::RecurseFiles(char const *,char const *,struct HWND__ *)" (?RecurseFiles@CTest1Dlg@@MAEXPBD0PAUHWND__@@@Z)

#17


引用 15 楼 VisualEleven 的回复:
void RecurseFiles(LPCTSTR lpszDir, LPCTSTR lpszExtension, HWND hEdit)
{
  ASSERT(NULL != lpszDir);
       ASSERT(NULL != lpszDir);
      ASSERT(NULL != hEdit);
CFileFind finder;

// build a string with wildcards
CString strWildcard(lpszDir);
strWildcard += _T("\\*.*");

// start working for files
BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots())
{
continue;
}

CString strPath(finder.GetFilePath());
if(finder.IsDirectory())
{
RecurseFiles(strPath, lpszExtension, hEdit);
}
else
{
if(0 == strPath.Right(_tcslen(lpszExtension)).CompareNoCase(lpszExtension))
{
strPath += _T("\r\n");
SendMessage(hEdit, EM_SETSEL, -1, -1);
SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(LPCTSTR)strPath);
}
}
}

finder.Close();
}


// call
HWND hEdit = (HWND)(GetDlgItem(IDC_EDIT1)->GetSafeHwnd());
RecurseFiles(_T("G:"), _T("txt"), hEdit);

编译问题处理好了,调用后在编辑框内我捕捉到得怎么是txt的文件名呀?

#18


引用 6 楼 hzddm12340 的回复:
Quote: 引用 4 楼 bojie5744 的回复:

当然上面的代码只能搜索这一级文件夹的txt、

我就是要写死在一个目录下的TXT文件读取,na

引用 3 楼 bojie5744 的回复:
  MFC中有一个类CFileFind,使用它进行文件的查找。
 
  CString strFile;
 
  CFileFind find;
 
  BOOL bWorking = find.FindFile("C:/windows/*.txt");//这是搜索C:/WIndows的txt
 
  while(bWorking)
 
  {
 
  bWorking=find.FindNextFile();
 
  strFile=find.GetFileName();
 
  }

这个FindNextName需要参数啊好像要

不需要、

#19


这里都是给出与你相关的知识,建议自己去找找方法,好比让我们给代码,一个字乱。

#20


引用 19 楼 bojie5744 的回复:
这里都是给出与你相关的知识,建议自己去找找方法,好比让我们给代码,一个字乱。

谢谢

#1


CFileFind::FindFile/FileNextFile()

#2


给你一段代码参考一下:
// 删除15天之前的log日志文件
void DeleteLogFile( LPCTSTR strLogPath )
{
if ( !PathFileExists( strLogPath ) )
{
return;
}

time_t tCurTime = time( NULL ); // 获取当前时间

tstring strFindFileName = strLogPath;
strFindFileName += _T("\\*.*");
WIN32_FIND_DATA wfd;
HANDLE hFindFile = FindFirstFile( strFindFileName.c_str(), &wfd ); 
if ( hFindFile == INVALID_HANDLE_VALUE )

return;
}

while ( true )
{
if ( wfd.cFileName[0] != _T('.') )
{// 非本级或上级目录
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) // 目录
{
if ( !FindNextFile( hFindFile, &wfd ) )
{
break;
}
continue;
}
else if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM ) // 系统文件,不处理
{
if ( !FindNextFile( hFindFile, &wfd ) )
{
break;
}
continue;
}
else // 用户日志文件
{
tstring strLogFile = strLogPath;
strLogFile += _T("\\");
strLogFile += wfd.cFileName;

    time_t tModifyTime = GetFileModifyTime( strLogFile.c_str() );

// 如果是15天之前的文件,则将之删除掉(拿当前时间和文件的最后修改时间作比较)
if ( tCurTime - tModifyTime > DELETE_INTERVAL_SECOND )
{
DeleteFile( strLogFile.c_str() );
}
}
}

if ( !FindNextFile( hFindFile, &wfd ) )
{
break;
}
};

FindClose( hFindFile );
}

#3


  MFC中有一个类CFileFind,使用它进行文件的查找。
 
  CString strFile;
 
  CFileFind find;
 
  BOOL bWorking = find.FindFile("C:/windows/*.txt");//这是搜索C:/WIndows的txt
 
  while(bWorking)
 
  {
 
  bWorking=find.FindNextFile();
 
  strFile=find.GetFileName();
 
  }

#4


当然上面的代码只能搜索这一级文件夹的txt、

#5


先遍历一个目录下所有的文件和文件夹,然后获得文件夹和文件夹名之后,就是一个字符串处理的问题了,也就是判断名字的后4个位置的内容是不是.txt就可以了

#6


引用 4 楼 bojie5744 的回复:
当然上面的代码只能搜索这一级文件夹的txt、

我就是要写死在一个目录下的TXT文件读取,na

引用 3 楼 bojie5744 的回复:
  MFC中有一个类CFileFind,使用它进行文件的查找。
 
  CString strFile;
 
  CFileFind find;
 
  BOOL bWorking = find.FindFile("C:/windows/*.txt");//这是搜索C:/WIndows的txt
 
  while(bWorking)
 
  {
 
  bWorking=find.FindNextFile();
 
  strFile=find.GetFileName();
 
  }

这个FindNextName需要参数啊好像要

#7


引用 6 楼 hzddm12340 的回复:
Quote: 引用 4 楼 bojie5744 的回复:

当然上面的代码只能搜索这一级文件夹的txt、

我就是要写死在一个目录下的TXT文件读取,na

引用 3 楼 bojie5744 的回复:
  MFC中有一个类CFileFind,使用它进行文件的查找。
 
  CString strFile;
 
  CFileFind find;
 
  BOOL bWorking = find.FindFile("C:/windows/*.txt");//这是搜索C:/WIndows的txt
 
  while(bWorking)
 
  {
 
  bWorking=find.FindNextFile();
 
  strFile=find.GetFileName();
 
  }

这个FindNextName需要参数啊好像要

2楼已经给出代码了,可以参考

#8


当然2楼的代码是删除文件功能,你可以借鉴修改。

#9


CFileFind finder;
BOOL bFind = finder.FindFile(m_filepath);
if(bFind!=0)
{
CStdioFile LogFile;
char* old_locale=_strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE,"chs");
CString strRow;
LogFile.Open(m_filepath,CFile::modeRead);
while(LogFile.ReadString(strRow))
{

m_strModelContent=m_strModelContent+strRow+_T("\n");
}
setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置
free( old_locale );//还原区域设定
}

加头文件 #include <locale.h>访问中文字符

#10


不需要判断扩展名,直接搜索 *.txt 就行了。比如搜索 C:\Windows\*.exe。
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
#include <tchar.h>

int _tmain(int argc, TCHAR *argv[])
{
HANDLE hFind = INVALID_HANDLE_VALUE;
    TCHAR szPath[] = TEXT("C:\\Windows");
    TCHAR szFind[MAX_PATH] = { 0 };
    WIN32_FIND_DATA wfd = { 0 };
    
    PathCombine(szFind, szPath, TEXT("*.exe"));
    hFind = FindFirstFile(szFind, &wfd);
    if (hFind != INVALID_HANDLE_VALUE) {
        TCHAR szFile[MAX_PATH] = { 0 };
        do {
            PathCombine(szFile, szPath, wfd.cFileName);
            _tprintf(TEXT("%s\n"), szFile);
        } while (FindNextFile(hFind, &wfd));
        FindClose(hFind);
    }
    return 0;
}

#11


system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad  c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。

#12


引用 9 楼 GANSUYZHY 的回复:
CFileFind finder;
BOOL bFind = finder.FindFile(m_filepath);
if(bFind!=0)
{
CStdioFile LogFile;
char* old_locale=_strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE,"chs");
CString strRow;
LogFile.Open(m_filepath,CFile::modeRead);
while(LogFile.ReadString(strRow))
{

m_strModelContent=m_strModelContent+strRow+_T("\n");
}
setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置
free( old_locale );//还原区域设定
}

加头文件 #include <locale.h>访问中文字符

你看看我的代码,我想尝试遍历txt文件后,把文件里的文本保存下来,因为我后门要把这个文本插入数据库的,但是现在一点击按钮触发事件就终止运行
void CTestDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
CFileFind finder;
CString m_strModelContent="";

BOOL bFind = finder.FindFile("D:/abc/*.txt");
if(bFind!=0)
{
CStdioFile LogFile;
CString filepath=finder.GetFilePath();
char* old_locale=_strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE,"chs");
CString strRow;
LogFile.Open(filepath,CFile::modeRead);
while(LogFile.ReadString(strRow))
{

m_strModelContent=m_strModelContent+strRow+_T("\n");
}

setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置
free( old_locale );//还原区域设定
}
GetDlgItem(IDC_EDIT1)->SetWindowText(m_strModelContent);
}

#13


引用 8 楼 bojie5744 的回复:
当然2楼的代码是删除文件功能,你可以借鉴修改。

能帮我看看我的代码问题在哪吗,总是报内存不能为read那种错误
void CTestDlg::OnButton1() 
{

CString strFile;
CFileFind find;
CString sFileName;
CStdioFile out;  
HANDLE h;
WIN32_FIND_DATA p;
BOOL bWorking = find.FindFile("D:/abc/*.txt");
while (bWorking)
{   
bWorking=FindNextFile(h,&p);
       sFileName=find.GetFilePath();
out.Open(sFileName, CFile::modeRead); 
CString sSql="",s; //读取文件
do{  out.ReadString(s);  sSql=sSql+s+(char)10; }  
while (out.GetPosition()!=out.GetLength()); 
out.Close();  
GetDlgItem(IDC_EDIT1)->SetWindowText(sSql);
}

}

#14


引用 1 楼 VisualEleven 的回复:
CFileFind::FindFile/FileNextFile()

版主大人,我现在能读取单个txt文件里的文本,然后保存下来,但是一遍历某目录下所有的txt文件就不成功,可否帮看看代码哪里除了问题,谢谢
void CTestDlg::OnButton1() 
{

CString strFile;
CFileFind find;
CString sFileName;
CStdioFile out;  
HANDLE h;
WIN32_FIND_DATA p;
BOOL bWorking = find.FindFile("D:/abc/*.txt");
while (bWorking)
{   
bWorking=FindNextFile(h,&p);
       sFileName=find.GetFilePath();
out.Open(sFileName, CFile::modeRead); 
CString sSql="",s; //读取文件
do{  out.ReadString(s);  sSql=sSql+s+(char)10; }  
while (out.GetPosition()!=out.GetLength()); 
out.Close();  
GetDlgItem(IDC_EDIT1)->SetWindowText(sSql);
}

}

#15


本帖最后由 VisualEleven 于 2014-07-18 13:40:53 编辑
void RecurseFiles(LPCTSTR lpszDir, LPCTSTR lpszExtension, HWND hEdit)
{
  ASSERT(NULL != lpszDir);
       ASSERT(NULL != lpszDir);
      ASSERT(NULL != hEdit);
CFileFind finder;

// build a string with wildcards
CString strWildcard(lpszDir);
strWildcard += _T("\\*.*");

// start working for files
BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots())
{
continue;
}

CString strPath(finder.GetFilePath());
if(finder.IsDirectory())
{
RecurseFiles(strPath, lpszExtension, hEdit);
}
else
{
if(0 == strPath.Right(_tcslen(lpszExtension)).CompareNoCase(lpszExtension))
{
strPath += _T("\r\n");
SendMessage(hEdit, EM_SETSEL, -1, -1);
SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(LPCTSTR)strPath);
}
}
}

finder.Close();
}


// call
HWND hEdit = (HWND)(GetDlgItem(IDC_EDIT1)->GetSafeHwnd());
RecurseFiles(_T("G:"), _T("txt"), hEdit);

#16


引用 1 楼 VisualEleven 的回复:
CFileFind::FindFile/FileNextFile()

调用recurseFiles函数写在按钮响应里,但是编译无法通过,错误如下,是不是我的recersefiles函数定义有问题?求教
test1Dlg.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall CTest1Dlg::RecurseFiles(char const *,char const *,struct HWND__ *)" (?RecurseFiles@CTest1Dlg@@MAEXPBD0PAUHWND__@@@Z)

#17


引用 15 楼 VisualEleven 的回复:
void RecurseFiles(LPCTSTR lpszDir, LPCTSTR lpszExtension, HWND hEdit)
{
  ASSERT(NULL != lpszDir);
       ASSERT(NULL != lpszDir);
      ASSERT(NULL != hEdit);
CFileFind finder;

// build a string with wildcards
CString strWildcard(lpszDir);
strWildcard += _T("\\*.*");

// start working for files
BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots())
{
continue;
}

CString strPath(finder.GetFilePath());
if(finder.IsDirectory())
{
RecurseFiles(strPath, lpszExtension, hEdit);
}
else
{
if(0 == strPath.Right(_tcslen(lpszExtension)).CompareNoCase(lpszExtension))
{
strPath += _T("\r\n");
SendMessage(hEdit, EM_SETSEL, -1, -1);
SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(LPCTSTR)strPath);
}
}
}

finder.Close();
}


// call
HWND hEdit = (HWND)(GetDlgItem(IDC_EDIT1)->GetSafeHwnd());
RecurseFiles(_T("G:"), _T("txt"), hEdit);

编译问题处理好了,调用后在编辑框内我捕捉到得怎么是txt的文件名呀?

#18


引用 6 楼 hzddm12340 的回复:
Quote: 引用 4 楼 bojie5744 的回复:

当然上面的代码只能搜索这一级文件夹的txt、

我就是要写死在一个目录下的TXT文件读取,na

引用 3 楼 bojie5744 的回复:
  MFC中有一个类CFileFind,使用它进行文件的查找。
 
  CString strFile;
 
  CFileFind find;
 
  BOOL bWorking = find.FindFile("C:/windows/*.txt");//这是搜索C:/WIndows的txt
 
  while(bWorking)
 
  {
 
  bWorking=find.FindNextFile();
 
  strFile=find.GetFileName();
 
  }

这个FindNextName需要参数啊好像要

不需要、

#19


这里都是给出与你相关的知识,建议自己去找找方法,好比让我们给代码,一个字乱。

#20


引用 19 楼 bojie5744 的回复:
这里都是给出与你相关的知识,建议自己去找找方法,好比让我们给代码,一个字乱。

谢谢

#21