首页 > 解决方案 > C# 根据在 ListView 上显示之前创建的日期对文件进行排序

问题描述

我创建了一个 Windows 应用程序,可以在任何 Windows 10 操作系统上运行,并带有一个按钮功能,当用户单击该按钮功能时,将从某个文件夹加载所有可用的.map文件名。加载可用文件后,它将在 ListView 表单中显示所有文件,并且这些文件将基于文件命名。但是,如何根据文件的创建/修改日期对其进行排序?

这是我的代码:

  private void btnLot_Click(object sender, EventArgs e)
    {            
        string _ext = string.Empty;
        DialogResult result = openLotDialog.ShowDialog();

        if (result == System.Windows.Forms.DialogResult.Cancel)
        {
            return;
        }

        lvMapFiles.Items.Clear();

        m_IUpperPCBMacData = null;
        m_ILowerPCBMacData = null;

        picDevTop.Invalidate();

        if (System.IO.Path.GetExtension(m_FolderDialog.SelectedPath).Trim() != "")
        {
            MessageBox.Show(this, "Please select a folder. Don't select a file.", "Open Folder Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
        }

        string[] files = Directory.GetFiles(openLotDialog.SelectedPath);
        // Add these files into list view

        pathDirectory = openLotDialog.SelectedPath;
        //pathDirectory = m_FolderDialog.SelectedPath;
        fileExtension = string.Empty;

        int i = 0;

        foreach (string s in files)
        {
            fileName = System.IO.Path.GetFileNameWithoutExtension(s);
            _ext = System.IO.Path.GetExtension(s);

            if (fileName.Trim().ToUpper().Contains("_TEMP"))
            {
                System.IO.File.Delete(s);
                continue;
            }

            if (fileName.Trim().ToUpper().Contains("_SUMMARY"))
            {
                continue;
            }

            if (_ext.Trim().ToUpper() != ".MAP")
            {
                continue;
            }

            if (fileExtension.Trim() == "")
            {
                fileExtension = System.IO.Path.GetExtension(s);
            }
            
            ListViewItem _lvi1 = new ListViewItem();
            _lvi1.SubItems.Add("");

            lvMapFiles.Items.Add(_lvi1);
            lvMapFiles.Items[i].Text = fileName;

            i++;
        }

        //m_CalcParticle = true;
        CUtil.Instance.ResetDefectCodeAndDescription();

        if (ReadMapFiles(pathDirectory + "\\" + lvMapFiles.Items[0].Text + fileExtension))
        {
            lvMapFiles.Items[0].Selected = true;

            LoadDefectCodeList();
            LoadDefectMenuList();
        }
        else
        {
            lvMapFiles.Items.Clear();
            MessageBox.Show(this, "Fail to Open Map File. Make sure to select the correct Map file.", "Read Map Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }            
    }

假设下面的代码将读取所有可用文件并将其添加到 ListView,有什么方法可以在添加到 ListView 之前添加一个函数来首先对文件进行排序?

    foreach (string s in files)
        {
            fileName = System.IO.Path.GetFileNameWithoutExtension(s);
            _ext = System.IO.Path.GetExtension(s);

            if (fileName.Trim().ToUpper().Contains("_TEMP"))
            {
                System.IO.File.Delete(s);
                continue;
            }

            if (fileName.Trim().ToUpper().Contains("_SUMMARY"))
            {
                continue;
            }

            if (_ext.Trim().ToUpper() != ".MAP")
            {
                continue;
            }

            if (fileExtension.Trim() == "")
            {
                fileExtension = System.IO.Path.GetExtension(s);
            }
            
            ListViewItem _lvi1 = new ListViewItem();
            _lvi1.SubItems.Add("");

            lvMapFiles.Items.Add(_lvi1);
            lvMapFiles.Items[i].Text = fileName;

            i++;
        }

感谢您的帮助!

标签: c#windows

解决方案


您可以利用System.IO.DirectoryInfo类型以及 LINQ 来应用排序。

首先包括适当的名称空间,如果它们不存在的话。

using System.Collections.Generic;
using System.IO;
using System.Linq;

然后更新 files 变量分配以加载目录,按创建日期(升序)排序。

IEnumerable<string> files = new DirectoryInfo(openLotDialog.SelectedPath)
  .GetFiles()
  .OrderBy(x => x.CreationTime)
  .Select(x => x.FullName);

请注意,可能有其他可用的属性或方法System.IO.FileInfo可能有益于使用,而不是恢复到完整路径。


推荐阅读