sujith karivelil
sujith karivelil

Reputation: 29036

Select files from directory order of there names

I have 'N' number of files in a folder, the file names follows some common procedure(file0....fileN). the file names looks like:

file1.pdf
..
file7.pdf
..
file10.pdf
..
file15.pdf
..
fileN.pdf

Am collecting these files into a list of string using the following code:

  Dim Files As String() = Directory.GetFiles(folderBase + "\files", "*.pdf")

here what is the problem am facing is that am getting in the list in the following order:

file1.pdf
file10.pdf
..
file2.pdf
..
file15.pdf
..
fileN.pdf

Getting file10.pdf after file1.pdf. i want to get file names in the sequential order(file1.pdf,file2.pdf...etc)

i have tried this also but it will not solve my problem:

Dim Files As List(Of String) = Directory.GetFiles(folderBase + "\files", "*.pdf").OrderBy(Function(f) New FileInfo(f).Name).ToList()

Upvotes: 0

Views: 3422

Answers (2)

dbasnett
dbasnett

Reputation: 11773

Here is an approach that uses sorted dictionary. It assumes that the file names are letters followed by number(s). This works by making the file names the same length and using that as the key for the sorted dictionary.

    'get the file name only
    Dim fnames As IEnumerable(Of String) = From f In Files
                                           Select IO.Path.GetFileNameWithoutExtension(f)

    'get the longest file name
    Dim max As Integer = fnames.Max(Function(fs) fs.Length)
    'a palce for the results
    Dim sd As New SortedDictionary(Of String, String)
    Dim nums() As Char = "0123456789".ToCharArray
    'create dictionary entries.  
    For ix As Integer = 0 To fnames.Count - 1
        Dim fn As String = fnames(ix)
        Dim idx As Integer = fn.IndexOfAny(nums)
        If idx >= 0 Then fn = fn.Insert(idx, New String(" "c, max - fn.Length))
        sd.Add(fn, Files(ix))
    Next

    Dim l As List(Of String) = sd.Values.Select(Function(f) IO.Path.GetFileName(f)).ToList

When working with paths use the methods in IO.Path, e.g.

    Dim Files As String() = IO.Directory.GetFiles(IO.Path.Combine(folderBase, "files"), "*.pdf")

One other thing, use & for concatenation of strings not +.

Upvotes: 0

Vivek S.
Vivek S.

Reputation: 21945

If you need to use an array then sort function can be used

 Dim Files As String() = Directory.GetFiles(folderBase + "\files", "*.pdf")
 System.Array.Sort(Of String)(Files)

Upvotes: 1

Related Questions