一个目录中有如下所示的文件

在读取该目录的文件后,文件名将按照 0、1、11、12、13、14、..........的顺序来进行排列,而不是上图中的顺序进行排列,此时可以通过调用Windows的 Shlwapi.dll 来对读取后的文件进行排序。
1、先创建一个继承自 IComparer 的类,可以将该类的访问属性设置为 public (若设置为私有,则只能在该工程中被使用)
using System;
using System.Collections;
using System.Runtime.InteropServices; // 必须含有该引用
using System.Text;
namespace SortByFileName
{
public class FileNameSort:IComparer
{
//调用windos 的 DLL
[System.Runtime.InteropServices.DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string param1, string param2);
//前后文件名进行比较。
public int Compare(object name1, object name2)
{
if (null == name1 && null == name2)
{
return 0;
}
if (null == name1)
{
return -1;
}
if (null == name2)
{
return 1;
}
return StrCmpLogicalW(name1.ToString(), name2.ToString());
}
}
}
2、在其它的类中调用该类,对文件名进行排序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace SortByFileName
{
class Program
{
static void Main(string[] args)
{
string path = @"E:\Data\Test";
DirectoryInfo directoryInfo = new DirectoryInfo(path);
FileInfo[] files = directoryInfo.GetFiles("*.txt");
Array.Sort(files, new FileNameSort()); // 对获取的文件名进行排序
foreach (var theFile in files)
{
Console.WriteLine(theFile);
}
Console.ReadKey();
}
}
}
3、排序结果如下图所示

本文介绍了一种利用Windows的Shlwapi.dll库中的StrCmpLogicalW函数,实现对文件名进行智能排序的方法。通过创建一个继承自IComparer的类,并在其中调用StrCmpLogicalW函数,可以实现对文件名的自然排序,避免了数字在字符串中的错误排序问题。
3012

被折叠的 条评论
为什么被折叠?



