• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2233
  • Last Modified:

Multiple File Extensions With FindFirstFile

I am using FindFirstFile() and FindNextFile() to search a directory for files.  I have now found that I need to search for more than one extension so is this possible from one FindFirstFile() or will I have to trawl through the directory twice ?  (I don't want to use *.* but will if I have to)
0
ssherlock
Asked:
ssherlock
1 Solution
 
MadshiCommented:
I'm using *.* is such cases. Though, try using "*.doc;*.txt". Perhaps it works...

Regards, Madshi.
0
 
MirkwoodCommented:
I can give you an answer but that is not the answer you want to  here. It is not possible to do it using FindFirstFile or FindFirstFileEx.

A function that might help you is PathMatchSpec. An exported function of the shell. Here is the documentation.

PathMatchSpec




BOOL PathMatchSpec(
    LPCTSTR pszFileParam,
    LPCTSTR pszSpec
    );



Searches a string using a DOS wild card match type. The string can be searched for a particular file extension, such as *.bmp, *.doc, and so on.

•Returns TRUE if the string matches, or FALSE otherwise.


pszFileParam

Address of the string to be searched.

pszSpec

Address of the file type for which to search.



Example:

#include <windows.h>
#include <iostream.h>
#include "Shlwapi.h"

void main( void )
{
      // String path name 1.
      char buffer_1[] = "C:\\Test\\File.txt";
      char *lpStr1;
      lpStr1 = buffer_1;

      // String path name 2.
      char buffer_2[] = "C:\\Test\\File.bmp";
      char *lpStr2;
      lpStr2 = buffer_2;

      // String path name 3.
      char buffer_3[] = "*.txt";
      char *lpStr3;
      lpStr3 = buffer_3;

      // String path name 4.
      char buffer_4[] = "C:\\Test\\File";
      char *lpStr4;
      lpStr4 = buffer_4;


      // Variable to get the return.
      // from "PathMatchSpec"      
    int      retval;      

      // Test path name 1.
    retval = PathMatchSpec(lpStr1,lpStr3);
    cout << "The contents of String 1: " << lpStr1
             << "\nThe return value from the function is " << retval << " = TRUE" << endl;

      // Test path name 2.
      retval = PathMatchSpec(lpStr2,"*.bmp");
    cout << "The contents of String 2: " << lpStr2
             << "\nThe return value from the function is " << retval << " = TRUE" << endl;

      // Test path name 4.
      retval = PathMatchSpec(lpStr4,lpStr2);
    cout << "The contents of String 4: " << lpStr4
             << "\nThe return value from the function is " << retval << " = FALSE"<< endl;
}
OUTPUT:
==========
The contents of String 1: C:\Test\File.txt
The return value from the function is 1 = TRUE
The contents of String 2: C:\Test\File.bmp
The return value from the function is 1 = TRUE
The contents of String 4: C:\Test\File
The return value from the function is 0 = FALSE

0
 
ssherlockAuthor Commented:
Thanks but that wasn't really acceptable for this project (I will keep it handy though).  I eneded up putting everything into a function and calling it twice, feeding in the extension to search for each time.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now