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

DirectoryInfo and filtering multiple extensions using FileInfo

I have an app that populates a list box with files from a user specified directory.  I have an option to include or exclude hidden files which I filter after using the FileInfo array that is returned by the DirectoryInfo GetFiles method.  

I have read and I realize that the GetFiles method does not allow for filtering by extension, it is simply a search parameter.  Of course this is after I wrote the user updatable feature to add and remove extensions.

Does anyone have a way to take a delimited string get back a FileInfo array sorted alphabetically.

Thanks!!
0
tech1984
Asked:
tech1984
  • 7
  • 6
2 Solutions
 
anarki_jimbelCommented:
you may try filtering on the stage of retrieving fileinfos:

http://www.dreamincode.net/code/snippet2823.htm
0
 
tech1984Author Commented:
I saw this code while searching and it looked good.  I am still fairly new to .Net and pretty much only get to program for fun, so please bear with me.  I see that an ArrayList of the files is created and then converted and returned as a string array.  Can I somehow get this into a FileInfo array?  And how about keeping it sorted?

Thanks for the help and quick response!
0
 
anarki_jimbelCommented:
OK, let me some time to test the code on my computer
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
anarki_jimbelCommented:
Try the code. It should work. Not exactly sure about sorting - let me know how it goes
            string dir = @"C:\Documents and Settings\dmitry.gakhovich\My Documents";
            //determine our valid file extensions
            string validExtensions = "*.jpg,*.jpeg,*.gif,*.png";
 
            //create a string array of our filters by plitting the
            //string of valid filters on the delimiter
            string[] extFilter = validExtensions.Split(new char[] { ',' });
         
            //ArrayList to hold the files with the certain extensions
            List<FileInfo> files = new List<FileInfo>();
 
            //DirectoryInfo instance to be used to get the files
            DirectoryInfo dirInfo = new DirectoryInfo(dir);
 
             //loop through each extension in the filter
            foreach (string extension in extFilter)
            {
                //add all the files that match our valid extensions
                //by using AddRange of the ArrayList
                files.AddRange(dirInfo.GetFiles(extension));
            }
 
            files.Sort();
            
            foreach(FileInfo fi in files){
                // send to output window, open from View menu or Ctrl-Alt-O
                System.Diagnostics.Debug.WriteLine(fi.Name);
            }

Open in new window

0
 
tech1984Author Commented:
Ok, I have to comment out Sort or it error out at that point each time.   Also, I know is sounds stupid, but I can't seem to figure out how to change the scope of the FileInfo variable.

Really need the sorting working if you have any ideas.  I get the following error:
"Failed to compare two elements in the array"

Thanks again!
0
 
anarki_jimbelCommented:
Not sure I understand the question about changing the scope. Could you pls explain.

I have a problem on my computer now - it does not allow me to search directories - not enough privileges.
Need to fix but can't right now.

Sort is not a proble. There are some overloads for sort. What you need to do is to create a comparer object. Let me think and I'll give you a solution (but can't test myself).
0
 
anarki_jimbelCommented:
OK, let's try the following:

replace sort line with:

            MyFileInfoComparer comparer = new MyFileInfoComparer();
            files.Sort(comparer);

And you need to add a comparer class to your solution. See in the snippet. It sorts by a filename.
You may change the behaviour. To read more - see the link:
http://www.devx.com/dotnet/Article/21089/0/page/3
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
 
namespace TestProj
{
    public class MyFileInfoComparer : IComparer<FileInfo>
    {
        /// <summary>
        /// Be aware - it may throw an exception if fi1 or fi2 are null
        /// </summary>
        /// <param name="fi1"></param>
        /// <param name="fi2"></param>
        /// <returns></returns>
        public int Compare(FileInfo fi1, FileInfo fi2)
        {
            return fi1.Name.CompareTo(fi2.Name);
        }
 
    }
}

Open in new window

0
 
tech1984Author Commented:
I will try the compare in just a bit..

What I mean by scope is that after the for loop, the "fi" variable can't be accessed.  I have more code that needs to call it.  I tried to declare it before the for loop and just but

FileInfo fi;
for (fi in files)

but this didn't work.
0
 
tech1984Author Commented:
The compare worked great!!!!

Now I just need to fix the scope on the FileInfo variable.  Any thoughts?
0
 
tech1984Author Commented:
Instead of the foreach I think I need to do something like a " do while" but I can't figure out the syntax to get the files array into the FileInfo.
0
 
tech1984Author Commented:
I figured it out.

Thanks for all the help!!!!
     FileInfo [] fi =new FileInfo[files.Count];
     int iFiles = 0;
     do
     {
           fi[iFiles] = files[iFiles];
                
           iFiles++;
     } while (iFiles < files.Count);

Open in new window

0
 
tech1984Author Commented:
Thanks for quick responses and great help!!!
0
 
anarki_jimbelCommented:
Sorry  - missed your last few comments.

Good luck!
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: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

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.

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