【问题标题】:C# File list in reverse order. (Without Using Linq)C# 文件列表以相反的顺序排列。 (不使用 Linq)
【发布时间】:2015-01-13 11:23:30
【问题描述】:

我四处搜索,似乎我能得到的唯一答案是与 LINQ 相关,而我的 Visual stuido 2005 上没有。

我正在构建一个程序来读取文件并将它们导入数据库,它目前的设置方式是读取它找到的最新日期。

我想先读取最早的文件。

有没有办法解决这个问题?

这是我的代码

     private string mDirectory; // this will hold the directory path you are working on
                    private string[] mFiles; // this will hold all files in the selected directory

    private void ReadData()
                    {
                    this.toolStripStatusLabel1.Text = "Preparing To Read Data";
                    this.Refresh();
                    string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};;persist security info=false;Extended Properties=dBase IV", mDirectory);
                    this.richTextBox1.Text = connectionString;
                    try
                    {
                    foreach (string file in mFiles)
                    {

 mDirectory = @"C:\USERS\DESKTOP\Test Pressure\"; 
                mFiles = System.IO.Directory.GetFiles(mDirectory, "*(WIDE).DBF");

                        DateTime dt = File.GetLastWriteTime(file);
                        string newdate = dt.ToString("yyyy-MM-dd HH:mm:ss");
                        DateTime DBTIME = new DateTime(2014, 01, 01, 00, 00, 00);
                        string date = String.Format("{0:yyyy-MM-dd HH:mm:ss}", DBTIME);
                        //this.richTextBox1.Text = date;


                        if (dt > DBTIME)
                        {
                            StringBuilder sb = new StringBuilder(300);
                            int n = GetShortPathName(file, sb, 300);
                            if (n == 0) // check for errors
                                MessageBox.Show(Marshal.GetLastWin32Error().ToString());
                            else
                            { }
                            string filenameWithoutPath1 = System.IO.Path.GetFileName(sb.ToString());
                            string queryString = string.Format("SELECT * FROM [" + "{0}]", filenameWithoutPath1);
                            this.richTextBox1.Text = queryString;


                        string where = " WHERE BAR > 20.0";
                        string myquery = queryString + where;
                       // this.richTextBox1.Text = myquery;

                        using (OleDbConnection connection = new OleDbConnection(connectionString))
                        {
                            OleDbCommand command = new OleDbCommand(myquery, connection);
                            connection.Open();
                            OleDbDataReader reader = command.ExecuteReader();

                            while (reader.Read())
                            {
                                if (reader.IsDBNull(1))
                                {
                                    this.richTextBox1.Text = "Null";
                                }
                                else
                                {



                            string Query = "REPLACE INTO hp42mis.hydrodata (FILEMOD, DOEYMD,TIMEHMS,DATETIMEM,MARKER,CONTRACT_CODE,STS_00" +
                                           ",PIPE,PIPE_NO,STS_01,MAX_PRESB,STS_02,MIN_PRESSB,STS_03,TESTP_BAR,STS_04,five,STS_05,six,STS_06,seven,STS_07," +
                                           "eight,STS_08,nine,STS_09) values ('" + newdate.ToString() + "',";


                                    Query += "'" + Convert.ToDateTime(reader["Date"]).ToString("yyyy-MM-dd") + "'";
                                    Query += ",'" + reader.GetValue(1).ToString() + "'";
                                    Query += ",'" + Convert.ToDateTime(reader["Date"]).ToString("yyyy-MM-dd") + " " + reader.GetValue(1).ToString() + "'";
                                    Query += ",'" + reader.GetValue(2).ToString() + "'";
                                    Query += ",'" + reader.GetValue(3).ToString() + "'";
                                    Query += ",'" + reader.GetValue(4).ToString() + "'";
                                    Query += ",'" + reader.GetValue(5).ToString() + "'";
                                    Query += ",'" + reader.GetValue(3).ToString() + "" + reader.GetValue(5).ToString() + "'";
                                    Query += ",'" + reader.GetValue(6).ToString() + "'";
                                    Query += ",'" + reader.GetValue(7).ToString() + "'";                             
                                    Query += ",'" + reader.GetValue(8).ToString() + "'";
                                    Query += ",'" + reader.GetValue(9).ToString() + "'";
                                    Query += ",'" + reader.GetValue(10).ToString() + "'";
                                    Query += ",'" + reader.GetValue(11).ToString() + "'";
                                    Query += ",'" + reader.GetValue(12).ToString() + "'";
                                    Query += ",'" + reader.GetValue(13).ToString() + "'";
                                    Query += ",'" + reader.GetValue(14).ToString() + "'";
                                    Query += ",'" + reader.GetValue(15).ToString() + "'";
                                    Query += ",'" + reader.GetValue(16).ToString() + "'";
                                    Query += ",'" + reader.GetValue(17).ToString() + "'";
                                    Query += ",'" + reader.GetValue(18).ToString() + "'";
                                    Query += ",'" + reader.GetValue(19).ToString() + "'";
                                    Query += ",'" + reader.GetValue(20).ToString() + "'";
                                    Query += ",'" + reader.GetValue(21).ToString() + "'";
                                    Query += ",'" + reader.GetValue(22).ToString() + "'";
                                    Query += ")";



                                    MySqlCommand cmd = new MySqlCommand(Query, conne);
                                    this.richTextBox1.Text = Query;
                                    this.Refresh();
                                    int res = 0;
                                    try
                                    {
                                        res = cmd.ExecuteNonQuery();
                                    }
                                    catch (MySqlException Myex)
                                    {
                                        MessageBox.Show(Myex.Message);
                                    }
                                    rowcounter++;
                                    this.rowcount.Text = rowcounter.ToString();
                                    this.Refresh();
                                    conne.Dispose();
                                    conne.Close();

                                }                      
                            }                      
                            reader.Close();
                            connection.Close();
                        }
                    }
                    }



                    }

                    catch (Exception ex)
                    {
                    MessageBox.Show(ex.Message);
                    }
                    }

【问题讨论】:

  • 你的代码有什么相关性?你想排序什么?使用 Linq 的建议代码是什么样的,您如何尝试将其转换为“普通 C#”,为什么不升级您已有十年历史的开发环境?
  • 您可以将代码示例缩减为几行代码,以更好地显示您想要排序的内容以及如何排序。无论如何,为文件系统时间和 Array.Sort 使用自定义比较器可能是您想要做的。
  • 请正确格式化您的代码
  • 另外,使用参数化 SQL 来避免 SQL 注入攻击(并使代码更健全)。
  • 感谢我对 C# 的缺乏经验,我是一个绝对的初学者,我会考虑你的报价。

标签: c#


【解决方案1】:

我找到了一种更简单的方法来对文件数组进行排序...

mFiles = System.IO.Directory.GetFiles(mDirectory, "*(WIDE).DBF");

Array.Sort(mFiles);

【讨论】:

  • 是的,它不会按照您的原始代码对日期进行排序。
  • 它现在确实按日期排序,因为文件的文件名中有日期。
【解决方案2】:

如果您想根据每个文件的最后写入时间遍历您的 mFiles 数组,请参阅 Sort List using string without Linq

private IList<string> GetOrderedFiles(string[] files)
{
    var fileList = new List<string>(files);

    Comparison<string> compare = delegate(string file1, string file2)
    {
        DateTime file1Time = File.GetLastWriteTime(file1);
        DateTime file2Time = File.GetLastWriteTime(file2);

        return file1Time.CompareTo(file2Time);
    };

    fileList.Sort(compare);
    return fileList;
}

用法:

var sortedFiles = GetOrderedFiles(mFiles);

foreach (string file in sortedFiles)
{

}

【讨论】:

    【解决方案3】:

    正如其他人所说,该代码需要重新格式化,并且可能甚至不正确(例如,您正在通过 mFiles 迭代的循环中设置 mFiles)。

    但是,也许这会有所帮助?

    Sorting Directory.GetFiles()

    关键是使用 FileInfo 项,而不仅仅是 GetFiles()。

    【讨论】:

      【解决方案4】:

      你可以这样做:

      public class ReverseComparer : IComparer<FileSystemInfo>
              {
                  public int Compare(FileSystemInfo x, FileSystemInfo y)
                  {
                   return x.CreationTime.CompareTo(y); 
                  }
          }
      
      
      
      
       DirectoryInfo di = new DirectoryInfo("C:\\...");
       FileSystemInfo[] files = di.GetFileSystemInfos();
       Array.Sort(files, new ReverseComparer());
      

      【讨论】:

        猜你喜欢
        • 2022-06-11
        • 2018-10-13
        • 2011-04-06
        • 2011-11-09
        • 2012-10-30
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多