/// <summary> /// AddProgramsInDirectory - Recursive function to search /// into directory tree. /// </summary> /// <param name="strDir">Starting directory</param> /// <returns></returns> private bool AddProgramsInDirectory(string strDir) { Trace.WriteLine("FindPrograms: " + "AddProgramsInDirectory (" + strDir + ")"); // Update status bar through delegate function. strBuffer = "Searching in " + strDir + "..."; itReason = INVOKE_FINDFILES.STATUS_MESSAGE; m_ctlInvokeTarget.Invoke(m_deleCallback); // As we add programs, store directory names. ArrayList alDirectories = new ArrayList(); Rapi.CE_FIND_DATA fd = new Rapi.CE_FIND_DATA(); // Start our search. string strSearch = strDir + "*.*"; IntPtr hff = Rapi.CeFindFirstFile(strSearch, ref fd); if ((int)hff == -1) { FetchAndDisplayError(); } else { do { string strFileName = fd.cFileName; int iFlag = (int) Rapi.FILE_ATTRIBUTE.FILE_ATTRIBUTE_DIRECTORY; if ((fd.dwFileAttributes & iFlag) == iFlag) { alDirectories.Add(strDir + fd.cFileName); } else { if (strFileName.EndsWith(".EXE") || strFileName.EndsWith(".exe")) { m_cFiles++; strBuffer = strDir + fd.cFileName; itReason = INVOKE_FINDFILES.FINDFILE_NEWFILE; m_ctlInvokeTarget.Invoke(m_deleCallback); } } } while (bThreadContinue && Rapi.CeFindNextFile(hff, ref fd) != 0); if (bThreadContinue && m_bIncludeSubDirs) { foreach (string str in alDirectories) { AddProgramsInDirectory(str + "\\"); } } } Rapi.CeFindClose(hff); return(true); }