按名称排序FileSystemInfo []

时间:2012-03-13 10:49:39

标签: c# .net sorting filesysteminfo

我可能花了大约500个小时谷歌搜索并阅读MSDN文档,它仍然拒绝以我想要的方式工作。

我可以按名称对这样的文件进行排序:

01.png
02.png
03.png
04.png

即。所有相同的文件长度。

第二个是文件长度较长的文件,一切都会下地狱。

例如,在序列中:

1.png
2.png
3.png
4.png
5.png
10.png
11.png

它的内容如下:

1.png, 2.png then 10.png, 11.png

我不想要这个。

我的代码:

DirectoryInfo di = new DirectoryInfo(directoryLoc);
FileSystemInfo[] files = di.GetFileSystemInfos("*." + fileExtension);
Array.Sort<FileSystemInfo>(files, new Comparison<FileSystemInfo>(compareFiles));

foreach (FileInfo fri in files)
{
    fri.MoveTo(directoryLoc + "\\" + prefix + "{" + operationNumber.ToString() + "}" + (i - 1).ToString("D10") +
        "." + fileExtension);

    i--;
    x++;
    progressPB.Value = (x / fileCount) * 100;
}

// compare by file name
int compareFiles(FileSystemInfo a, FileSystemInfo b)
{
    // return a.LastWriteTime.CompareTo(b.LastWriteTime);
    return a.Name.CompareTo(b.Name);
}

3 个答案:

答案 0 :(得分:0)

您的代码是正确的并且按预期工作,只是按字母顺序执行排序,而不是按数字顺序执行。

例如,字符串“1”,“10”,“2”按字母顺序排列。相反,如果你知道你的文件名总是只是一个加上“.png”的数字,你可以用数字排序。例如,像这样:

int compareFiles(FileSystemInfo a, FileSystemInfo b)         
{             
    // Given an input 10.png, parses the filename as integer to return 10
    int first = int.Parse(Path.GetFileNameWithoutExtension(a.Name));
    int second = int.Parse(Path.GetFileNameWithoutExtension(b.Name));

    // Performs the comparison on the integer part of the filename
    return first.CompareTo(second);
}

答案 1 :(得分:0)

我遇到了同样的问题,但我没有自己对列表进行排序,而是使用6位“0”填充键更改了文件名。

我的列表现在看起来像这样:

000001.jpg
000002.jpg
000003.jpg
...
000010.jpg

但是,如果您无法更改文件名,则必须实施自己的排序例程来处理alpha排序。

答案 2 :(得分:0)

如何修复linq和正则表达式来修复排序?

var orderedFileSysInfos = 
  new DirectoryInfo(directoryloc)
    .GetFileSystemInfos("*." + fileExtension)
    //regex below grabs the first bunch of consecutive digits in file name
    //you might want something different
    .Select(fsi => new{fsi, match = Regex.Match(fsi.Name, @"\d+")})
    //filter away names without digits
    .Where(x => x.match.Success)
    //parse the digits to int
    .Select(x => new {x.fsi, order = int.Parse(x.match.Value)})
    //use this value to perform ordering
    .OrderBy(x => x.order)
    //select original FileSystemInfo
    .Select(x => x.fsi)
    //.ToArray() //maybe?