?
Solved

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

Posted on 2010-08-25
8
Medium Priority
?
516 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
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 2000 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
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 86

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

 [eBook] Windows Nano Server

Download this FREE eBook and learn all you need to get started with Windows Nano Server, including deployment options, remote management
and troubleshooting tips and tricks

Question has a verified solution.

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

A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Are you ready to place your question in front of subject-matter experts for more timely responses? With the release of Priority Question, Premium Members, Team Accounts and Qualified Experts can now identify the emergent level of their issue, signal…
Loops Section Overview
Suggested Courses

864 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