Solved

Filter GetFiles() by file name and select one random file.

Posted on 2010-08-25
8
508 Views
Last Modified: 2012-05-10
I am reading the contents of a Directory using VB.net and the FileInfo() and GetFiles commmands.

Dim DirectoryLocation As New IO.DirectoryInfo("c:\somedir")
Dim FileArray As IO.FileInfo() = DirectoryLocation.GetFiles("*.jpg")
Dim FilesInFolder As IO.FileInfo

This code will return several results:
thumb_somefile.jpg
somefile.jpg
thumb_anotherfile.jpg
anotherfile.jpg

I want to eliminate the files starting with "thumb_" from the list  and then select one random file from those results.

I am trying to select a random background image for a webpage from a folder on the server.

I have spent all day on this so far. this code will select a random item from the GetFiles() Array
FileArray(RandString.[Next](0, FileArray.Length)) but before i do that i need to remove the files that contain "thumb" in the file name.

I have tried the FILTER command on the GetFiles() array but i throws an error due to the array type.

any help you can throw my way would be greatly appreciated!

thanks!
0
Comment
Question by:ronayers
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
8 Comments
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 33525502
If you're using .NET 3.x or above, you could throw in some Linq:
Dim DirectoryLocation As New IO.DirectoryInfo("c:\somedir")
Dim FileArray As IO.FileInfo() = DirectoryLocation.GetFiles("*.jpg")
Dim FilesInFolder As IO.FileInfo

FileArray = (From item As IO.FileInfo In FileArray _
            Where Not item.Name.StartsWith("thumb_") _
            Select item).ToArray()

Open in new window

0
 
LVL 11

Accepted Solution

by:
ladarling earned 500 total points
ID: 33525516
Try something like...
 

For Each f As IO.FileInfo In FileArray
            If f.Name.StartsWith("thumb") Then
                f.Delete()
            End If
 Next

Open in new window

0
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 33525530
@ladarling

I think he mean "eliminate" the files from the list, not delete the image file entirely.
0
How our DevOps Teams Maximize Uptime

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us. Read the use case whitepaper.

 
LVL 2

Expert Comment

by:larkvale
ID: 33525549

Try something like this ...

Dim RandomFileName as String = ""

Do

     RandomFileName = FileArray(RandString.[Next](0, FileArray.Length))

Loop While(RandomFileName.ToLower().StartsWith("thumb_"))

If RandomFileName <> "" Then
     ' use the random file name here
End If


0
 
LVL 17

Expert Comment

by:Zhaolai
ID: 33525570
Try this:

        Dim DirectoryLocation As New IO.DirectoryInfo("c:\somedir")
        Dim FileArray As IO.FileInfo() = DirectoryLocation.GetFiles("*.jpg")
        Dim newFileArray As IO.FileInfo() = Nothing
        Dim count As Integer
        For Each oInfo As FileInfo In FileArray
            If oInfo.Name.StartsWith("thumb_", System.StringComparison.CurrentCultureIgnoreCase) = False Then
                count += 1
                Array.Resize(newFileArray, count)
                newFileArray(count - 1) = oInfo
            End If
        Next

Now newFileArray will hold the files without "thumb_".

0
 
LVL 11

Expert Comment

by:ladarling
ID: 33525580
@kaufmed..... Oh, ok... gotcha...
Then, a non-Linq way would be:
 

    Dim FileArray As IO.FileInfo()
        Dim GoodFiles As New List(Of IO.FileInfo)
        For Each f As IO.FileInfo In FileArray
            If Not f.Name.StartsWith("thumb") Then
                GoodFiles.Add(f)
            End If
        Next
 FileArray = GoodFiles.ToArray

Open in new window

0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 33525821
Love all the ways to do it...here's another one:
        Dim Files As New List(Of IO.FileInfo)
        Files.AddRange(New IO.DirectoryInfo("c:\somedir").GetFiles("*.jpg"))
        Files.RemoveAll(Function(fi As IO.FileInfo) fi.Name.ToLower.StartsWith("thumb_"))
        Dim RandomFile As String = Files(New Random().Next(0, Files.Count)).FullName

Open in new window

0
 

Author Closing Comment

by:ronayers
ID: 33537198
THANK YOU!
0

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.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Technology Resume 7 67
How to force output to ascii 2 32
Set the FileVersion of a website dll 1 20
Validation for Passport expiry in asp.net 2 7
Just a quick little trick I learned recently.  Now that I'm using jQuery with abandon in my asp.net applications, I have grown tired of the following syntax:      (CODE) I suppose it just offends my sense of decency to put inline VBScript on a…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…
In an interesting question (https://www.experts-exchange.com/questions/29008360/) here at Experts Exchange, a member asked how to split a single image into multiple images. The primary usage for this is to place many photographs on a flatbed scanner…

740 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question