C# 按升序对文件排序

C# 按升序对文件排序,c#,winforms,list,fileinfo,C#,Winforms,List,Fileinfo,我有一个将pdf转换为tif图像文件的项目。输出文件在表格中编号。文件1、文件2、文件3……文件20。 当我执行下面的代码来获取文件时,它们被安排在如下所示的列表中,这是不正确的。有没有办法解决这个问题 FileInfo[] finfos = di.GetFiles("*.*"); finfos[0]=file1 finfos[1]=file10 finfos[2]=file11 finfos[3]=file12 .... ................... finfos[4]=

我有一个将pdf转换为tif图像文件的项目。输出文件在表格中编号。文件1、文件2、文件3……文件20。 当我执行下面的代码来获取文件时,它们被安排在如下所示的列表中,这是不正确的。有没有办法解决这个问题

FileInfo[] finfos = di.GetFiles("*.*");

finfos[0]=file1

finfos[1]=file10

finfos[2]=file11

finfos[3]=file12

....
...................

finfos[4]=file19

finfos[5]=file2

finfos[6]=file20

finfos[7]=file3

finfos[7]=file4

如果它们是按顺序创建的,则按创建日期进行排序

下面是使用列表解决您的问题的方法

class Program
{
    private static int CompareWithNumbers(FileInfo x, FileInfo y)
    {
        if (x == null)
        {
            if (y == null)
            {
                // If x is null and y is null, they're 
                // equal.  
                return 0;
            }
            else
            {
                // If x is null and y is not null, y 
                // is greater.  
                return -1;
            }
        }
        else
        {
            // If x is not null... 
            // 
            if (y == null)
            // ...and y is null, x is greater.
            {
                return 1;
            }
            else
            {

                int retval = x.CreationTime<y.CreationTime?-1:1;
                return retval;          

            }
        }
    }
    static void Main(string[] args)
    {
        DirectoryInfo di = new DirectoryInfo("d:\\temp");
        List<FileInfo> finfos = new List<FileInfo>();
        finfos.AddRange(di.GetFiles("*"));
        finfos.Sort(CompareWithNumbers);

        //you can do what ever you want
    }
}
类程序
{
私有静态整数比较数字(FileInfo x,FileInfo y)
{
如果(x==null)
{
如果(y==null)
{
//如果x为null,y为null,则
//平等。
返回0;
}
其他的
{
//如果x为null且y不为null,则y
//更大。
返回-1;
}
}
其他的
{
//如果x不是空的。。。
// 
如果(y==null)
//…y为空,x更大。
{
返回1;
}
其他的
{

int retval=x.CreationTime如果所有文件都命名为
mypic.tif
并且目录中没有具有不同名称格式的文件,请尝试以下操作:

        FileInfo[] orderedFI = finfos
            .OrderBy(fi => 
                // This will convert string representation of a number into actual integer
                int.Parse(
                    // this will extract the number from the filename
                    Regex.Match(Path.GetFileNameWithoutExtension(fi.Name), @"(\d+)").Groups[1].Value
                    ))
            .ToArray();

前导零可能是您的解决方案。您的描述中不清楚您是否控制生成文件的代码。 如果没有,您可以使用方法匹配file1、…file9(即regex或filename长度)并重命名它们。 如果控制代码,则使用格式化程序将数字转换为带前导零的字符串(即2位数字{0:00})

编辑:

要使用以下草稿样本获得方向播放:

假设您在执行目录中有文件:file1.txt、file2.txt、file10.txt和file20.txt

foreach (string fn in System.IO.Directory.GetFiles(".", "file*.*"))
  if (System.Text.RegularExpressions.Regex.IsMatch(fn, @"file\d.txt"))
    System.IO.File.Move(fn, fn.Replace("file", "file0"));

上面的代码将file1.txt重命名为file01.txt,file2.txt重命名为file02.txt。

它们是否总是被称为
文件{number}
?或者这只是一个例子,实际上它们可能是
我的图片{number}
生日{number}-Jim
?搜索-关于如何为此类排序生成比较器,存在几个类似的问题。如果您仅将它们命名为“file0001”这会容易得多。这一个非常接近您想要的。是否有可能某些文件的文件名中没有数字?从shlwapi.dll下载DllImport STRCOMPLLOGICOW,并使用它对finfos数组进行排序。请提供一个链接来证明该语句。(显然不是“返回文件名的顺序不保证”)@AlexeiLevenkov能否请您将一些文件从1重命名为12?获取文件1后,下一个将是文件10而不是文件2我添加了一个带有列表的解决方案我怀疑这是问题的解决方案-它按CreationTime排序(实际上根本不需要comarer-
.OrderBy(fi=>fi.CreationTime)
)当OP要求对文件名中嵌入的编号进行排序时,我的第一条评论可能是错误的,因为我将“do sort”读为“他们的已排序”,而它可能应该读为“than you can sort”。希望在某些时候删除此注释和第一条注释。我无法控制生成图像文件的文件,除此之外,我还想阅读具有相同编号的漫画图像文件。我认为您的第二个选项可能会有所帮助。但我是初学者,您能提供一些示例吗?我也尝试过,但我得到了一个答案n例外。但这毕竟对我来说可能不好,因为我正在制作一个漫画阅读器,让它也能按其自然顺序读取图像文件。我想我只是遗漏了一些非常重要的东西。例如,现有的用C#编写的漫画阅读器如何能够简单地做到这一点?我认为只有在目录中没有其他文件时,它才能工作由于我希望我的程序在一个列表中收集所有可读的图像文件,而不考虑文件名,有没有办法从最后3个扩展文件开始分割文件作为参考并应用您的方法?如果必须对不同格式的文件名进行混合排序,例如
11ab.tif
1ab.tif
2ab。tif
abc.tif
ab1.tif
ab11.tif
ab2.tif
,您想如何对它们进行排序?+1.@electricalbah,您真的可以筛选出想要显示的文件。排序前进行某种过滤(如
。其中(fn=>fn.Contains(“someprefix”)
)可以轻松做到这一点。