




http://msdn.microsoft.com/en-us/library/scx99850(VS.80).aspx
Обновлено:
#include <afxwin.h>
#include <iostream>
using namespace std;
CFileFind finder;
fileName += _T("c:\\aDirName");
if (finder.FindFile(fileName))
{
if (finder.FindNextFIle())
{
if (finder.IsDirectory())
{
// Do directory stuff...
}
}
}
Если вы измените имя файла на подстановочные знаки, вы можете сделать
while(finder.findNextFile()) {...
чтобы получить все совпадающие файлы.
Скажите, пожалуйста, почему вы отправляете файл .txt в качестве аргумента, а затем проверяете наличие других файлов? Поправьте меня, если я ошибаюсь, но если я не отправлю объекту подстановочный знак, почему он будет продолжать поиск файлов?
FindFileName () фактически не находит первый файл. Он просто возвращает ошибку, если глобус файла не найден. FindNextFile () захватит файл / каталог. Посмотрите на код MS, убедитесь, что findNextFile () вызывается перед работой с самим файлом. Это очень распространенный шаблон в MFC.
Я удалил лишнюю проверку для текущего / родительского каталога (isDots), возможно, это сбивало с толку?
Извините за возможную "непоследовательность" ответа на вопрос, но, возможно, вы увидите это полезным, потому что в любое время, когда мне нужно что-то подобное в Windows, я НЕ использую MFC, а использую обычный Windows API:
//not completely tested but after some debug I'm sure it'll work
bool IsDirectory(LPCTSTR sDirName)
{
//First define special structure defined in windows
WIN32_FIND_DATA findFileData; ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA));
//after that call WinAPI function finding file\directory
//(don't forget to close handle after all!)
HANDLE hf = ::FindFirstFile(sDirName, &findFileData);
if (hf == INVALID_HANDLE_VALUE) //also predefined value - 0xFFFFFFFF
return false;
//closing handle!
::FindClose(hf);
// true if directory flag in on
return (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
}
Решение MFC по запросу: a_FSItem путь к проверяемому элементу (проверьте CFile :: GetStatus () на предмет необходимых требований).
CFileStatus t_aFSItemStat;
CFile::GetStatus( a_FSItem, t_aFSItemStat );
if ( ( t_aFSItemStat.m_attribute & CFile::directory )
return true;
return false;
если вы хотите включить корень тома в качестве действительного каталога, просто добавьте его в тест
t_aFSItemStat.m_attribute & CFile::volume
Это не MFC, но я использую это:
bool IsValidFolder(LPCTSTR pszPath)
{
const DWORD dwAttr = ::GetFileAttributes(pszPath);
if (dwAttr != 0xFFFFFFFF)
{
if ((FILE_ATTRIBUTE_DIRECTORY & dwAttr) &&
0 != _tcscmp(_T("."), pszPath) &&
0 != _tcscmp(_T(".."), pszPath))
{
return true;
}
}
return false;
}
Не могли бы вы опубликовать фрагмент с его использованием? Код, опубликованный Microsoft, не помогает мне в том, чего я пытаюсь достичь.