无法使用Foreach语句读取已排序的数组

时间:2015-02-05 07:30:25

标签: c#

过去几周我一直在学习C#,慢慢地我越来越好但是我遇到了一个我无法理解的问题。

首先,如果我不按LastWriteTime对它们进行排序,我可以读取我的文件数组。

      mDirectory = @"\\11.11.11.11\Excel"; 
      mFiles = System.IO.Directory.GetFiles(mDirectory, "*.xls");

     foreach (string file in mFiles)
      {
                 ................
       }

这没有问题。但我需要按修改日期对文件列表进行排序。所以我使用了以下

                  if (Directory.Exists(mDirectory))
                     {
                      DirectoryInfo di = new DirectoryInfo(mDirectory);
                      FileInfo[] logFiles = di.GetFiles("*.xls");


                      DateCompareFileInfo dateCompareFileInfo = new DateCompareFileInfo();

                      Array.Sort(logFiles, dateCompareFileInfo);

                      Array.Reverse(logFiles);

对此课程的哪些调用 -

   class DateCompareFileInfo : IComparer<FileInfo>
                        {
                            public int Compare(FileInfo fi1, FileInfo fi2)
                            {
                                int result;
                                if (fi1.LastWriteTime == fi2.LastWriteTime)
                                {
                                    result = 0;
                                }
                                else if (fi1.LastWriteTime < fi2.LastWriteTime)
                                {
                                    result = 1;
                                }
                                else
                                {
                                    result = -1;
                                }

                                return result;
                            }
                        }

我已经调试过来检查文件是否按照我想要的方式排序并完美。

所以现在我想读取像这样的文件 -

 foreach (string file in logFiles)
     {
      ...........
        }

当我运行它时出现以下错误错误2无法将类型'System.IO.FileInfo'转换为'string'

如果有人能说清楚我做错了什么,我会非常感激。

4 个答案:

答案 0 :(得分:1)

关于 &#34;当我运行它时,我收到以下错误错误2无法转换类型&#39; System.IO.FileInfo&#39;到&#39;字符串&#39;&#34;

foreach (var fileInfo in logFiles)
{
    var path = fileInfo.FullName;
    //do whatever you want
}

foreach (var filePath in logFiles.Select(fileInfos=>fileInfos.FullName))
{        
    //do whatever you want, filePath will be string which already contains FullName
}

答案 1 :(得分:1)

foreach (FileInfo file in logFiles)
{
      var name = fileInfo.Name;
      ...........
}

我建议你一直使用这种语法

foreach(var file in logFiles)

然后将鼠标放在var上并等待它将显示类型

答案 2 :(得分:1)

foreach (string file in logFiles)
     {
      ...........
     }

在您的代码中,logFiles是一个FileInfo类型的数组,您尝试将logFiles作为字符串进行迭代。 FileInfo也不是从字符串继承的,因此无法转换为字符串。 为此,您需要使用'var'或确切类型。

 foreach (var file in logFiles)
         {
          ...........
         }

 foreach (FileInfo file in logFiles)
         {
          ...........
         }

答案 3 :(得分:1)

第一个变体工作的主要问题,但第二个不是你使用两种不同的返回类型的方法(在我对这个问题的评论中可以看出我也偶然发现,所以它很容易发生方法本身具有相同的名称。)

使用.NET始终要记住的一件事是,您使用来自不同名称空间的同名方法来执行不同的操作。但现在是主题。

首先你使用了:

System.Io.Directory.GetFiles

此方法返回一个字符串数组。这就是为什么你可以使用foreach分别将它存储在字符串中。

然后在第二个示例中,您使用了DirectoryInfo中的GetFiles方法。这与其他方法具有相同的基本功能BUT返回FileInfo对象数组而不是字符串对象。

这就是为什么foreach(字符串.......)对DirectoryInfo Getfiles的结果失败的原因,因为foreach期望字符串作为数组的元素而不是FileInfo对象。

所以你可以做的是两件不同的事情

  1. 在foreach循环中使用字符串的FileInfo instread
  2. 转换返回的数组,以便获取字符串而不是FileInfos

    1. 只有你在评论中提到的你没有的linq才有建议。只有linq可用才有建议,因为否则你必须在整个数组上手动迭代,然后创建一个可以迭代的字符串对象数组。
  3. 因此选项2我们可以忘记。因此,让我们看一下选项1.在这里,您可以迭代返回的数组,只需要FileInfo对象。如果你需要&#34;文件&#34;你可以把它放在foreach循环中。因此把它们放在一起:

    foreach (FileInfo fileInfo in mFiles)
    {
        string file = fileInfo.FullName; 
        // that is if you want the FULL path included else only 
        // fileInfo.Name instead of fileInfo.FullName
    }