سؤال

ما هي أنظف طريقة للبحث بشكل متكرر عن الملفات باستخدام C ++ و MFC؟

تحرير: هل تقدم أي من هذه الحلول القدرة على استخدام مرشحات متعددة من خلال تمرير واحد؟ أعتقد مع cfilefind يمكنني تصفية على *. * ثم اكتب رمز مخصص لمزيد من التصفية في أنواع ملفات مختلفة. هل يقدم أي شيء مرشحات مدمجة متعددة (أي. * .exe، *. DLL)؟

Edit2: أدركت فقط افتراضا واضحا بأنني أقوم بجعل ذلك يجعل حسابي السابق غير صالح. إذا كنت أحاول أن أفعل بحثا متناكر مع CFilefind، فعليك استخدام *. * كمسافة البليصة الخاصة بي لأن الأديدات الدقيقة الأخرى لن تتم مطابقتها ولن تحدث أي قواعد. لذلك يجب معالجة التصفية على ملفات مختلفة على الملفات بشكل منفصل بغض النظر.

هل كانت مفيدة؟

المحلول

استخدام CFileFind.

تفقد هذا مثال من MSDN:

void Recurse(LPCTSTR pstr)
{
   CFileFind finder;

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

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

   while (bWorking)
   {
      bWorking = finder.FindNextFile();

      // skip . and .. files; otherwise, we'd
      // recur infinitely!

      if (finder.IsDots())
         continue;

      // if it's a directory, recursively search it

      if (finder.IsDirectory())
      {
         CString str = finder.GetFilePath();
         cout << (LPCTSTR) str << endl;
         Recurse(str);
      }
   }

   finder.Close();
}

نصائح أخرى

يستخدم نظام الملفات Boost تطبيق!

المثال التراكف حتى على الصفحة الرئيسية لملف الملفات:

bool find_file( const path & dir_path,         // in this directory,
                const std::string & file_name, // search for this name,
                path & path_found )            // placing path here if found
{
  if ( !exists( dir_path ) ) return false;
  directory_iterator end_itr; // default construction yields past-the-end
  for ( directory_iterator itr( dir_path );
        itr != end_itr;
        ++itr )
  {
    if ( is_directory(itr->status()) )
    {
      if ( find_file( itr->path(), file_name, path_found ) ) return true;
    }
    else if ( itr->leaf() == file_name ) // see below
    {
      path_found = itr->path();
      return true;
    }
  }
  return false;
}

أعلم أنه ليس سؤالك، ولكن من السهل أيضا عن دون إكمال باستخدام CStringArray

void FindFiles(CString srcFolder)
{   
  CStringArray dirs;
  dirs.Add(srcFolder + "\\*.*");

  while(dirs.GetSize() > 0) {
     CString dir = dirs.GetAt(0);
     dirs.RemoveAt(0);

     CFileFind ff;
     BOOL good = ff.FindFile(dir);

     while(good) {
        good = ff.FindNextFile();
        if(!ff.IsDots()) {
          if(!ff.IsDirectory()) {
             //process file
          } else {
             //new directory (and not . or ..)
             dirs.InsertAt(0,nd + "\\*.*");
          }
        }
     }
     ff.Close();
  }
}

تفحص ال recls. مكتبة - تقف ل راجعursive ls. - وهي مكتبة بحث متكررة تعمل على UNIX والنوافذ. إنها مكتبة ج مع التكيف مع لغة مختلفة، بما في ذلك C ++. من الذاكرة، يمكنك استخدامها شيء مثل ما يلي:

using recls::search_sequence;


CString dir = "C:\\mydir";
CString patterns = "*.doc;abc*.xls";
CStringArray paths;
search_sequence files(dir, patterns, recls::RECURSIVE);

for(search_sequence::const_iterator b = files.begin(); b != files.end(); b++) {
    paths.Add((*b).c_str());
}

ستجد كل ملفات .doc، وجميع ملفات .xls التي تبدأ ب ABC في C: Mydir أو أي من الدلائل الفرعية.

أنا لم جمعت هذا، ولكن يجب أن تكون قريبة جدا من العلامة.

CString strNextFileName , strSaveLog= "C:\\mydir";
Find.FindFile(strSaveLog);
BOOL l = Find.FindNextFile();
if(!l)
    MessageBox("");
strNextFileName = Find.GetFileName();

انها لا تعمل. Find.FindNextFile () إرجاع False حتى الملفات موجودة في نفس الدليل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top