无法从String [] Array中的文件夹中对文件进行排序

时间:2014-03-05 11:27:12

标签: c# timer

我的项目是关于将屏幕记录为图像序列,然后将其设为视频我计划将所有图像目录加载到列表并使用计时器按图像逐个查看它们,但我得到的文件顺序错误如下: / p>

enter image description here

此代码用于从目录加载文件:

string[] array1 = Directory.GetFiles("C:\\Secret\\" + label1.Text, "*.Jpeg");
Array.Sort(array1);

foreach (string name in array1)
{
    listBox1.Items.Add(name);
}
timer2.Start();

此代码可以查看它们

        int x = 0;
    private void timer2_Tick(object sender, EventArgs e)
    {
        if (x >= listBox1.Items.Count)
        {
            timer2.Stop();
        }
        else
        {
            ssWithMouseViewer.Image = Image.FromFile(listBox1.Items[x].ToString());

            x++;
        }
    }

我需要像0.jpeg,1.jpeg,2.jpeg ..... 10.jpeg,11..jpeg ......一样查看它们。

4 个答案:

答案 0 :(得分:0)

当您按数字顺序输入label1.text时,可能已经对您的数组进行了排序?如果不是,您可能更容易在调用方法之前将label1.text值排序为数字顺序。

答案 1 :(得分:0)

在排序字符串数组时,您需要使用“自然排序顺序”比较器。

最简单的方法是使用P / Invoke来调用Windows内置的StrCmpLogicalW(),就像这样(这是一个可编辑的控制台应用程序):

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Security;

namespace ConsoleApp1
{
    [SuppressUnmanagedCodeSecurity]
    internal static class NativeMethods
    {
        [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
        public static extern int StrCmpLogicalW(string psz1, string psz2);
    }

    public sealed class NaturalStringComparer: IComparer<string>
    {
        public int Compare(string a, string b)
        {
            return NativeMethods.StrCmpLogicalW(a, b);
        }
    }

    sealed class Program
    {
        void run()
        {
            string[] filenames =
            {
                "0.jpeg",
                "1.jpeg",
                "10.jpeg",
                "11.jpeg",
                "2.jpeg",
                "20.jpeg",
                "21.jpeg"
            };

            Array.Sort(filenames); // Sorts in the wrong order.

            foreach (var filename in filenames)
                Console.WriteLine(filename);

            Console.WriteLine("\n");

            Array.Sort(filenames, new NaturalStringComparer()); // Sorts correctly.

            foreach (var filename in filenames)
                Console.WriteLine(filename);
        }

        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}

注意:此示例基于this original answer的代码。

答案 2 :(得分:0)

最简单的方法是将LINQ中的OrderBy函数与Path.GetFileNameWithoutExtension结合使用,如下所示:

string[] array1 = Directory.GetFiles("C:\\Secret\\" + label1.Text, "*.Jpeg");
array1 = array1.OrderBy(x => int.Parse(System.IO.Path.GetFileNameWithoutExtension(x))).ToArray();

要使用OrderBy函数,您需要为命名空间System.Linq添加using语句;

答案 3 :(得分:0)

字符串按字典顺序排序......

你有两个选择:重命名文件,使它们按照字典顺序排序(例如:001,002,003 ......),或者使用linq和文件名操作:

IEnumerable<string> sorted = from filename in array1
                             orderby int.Parse(Path.GetFileNameWithoutExtension(filename))
                             select filename;