1

我下面的代码有效,但我担心它的做法不好或可能导致内存问题。但是以我有限的知识,这是我找到的最好的方法。可以做得更好吗?

谢谢

static void Main()
{
    // Directory of files.
    const string dir = @"C:\Test";

    // File names.
    string[] fns = Directory.GetFiles(dir);

    // Order by size.
    var sort = from fn in fns
               orderby new FileInfo(fn).Length descending
               select fn;

    // List files.
    foreach (string n in sort)
    {
        Console.Write(n);
        Console.Write(" ");
        FileInfo f = new FileInfo(n);
        long file = f.Length;
        Console.WriteLine(file);
    }

    Console.ReadLine();
}
4

4 回答 4

6

我认为FileInfo您的实例化没有问题。它看起来像一个托管对象。让垃圾收集器担心它。

现在FileStream,您可能使用或不使用的对象FileInfo应该是closed。一份using声明将在这方面为您完成繁重的工作

于 2013-05-16T20:55:30.503 回答
6

实例化FileInfo实例不是问题。它是一个未实现的托管对象,IDisposable这意味着垃圾收集器应该能够很好地清理所有内容。

我看到的问题是您正在为每个文件创建两个实例(一个在您的 LINQ 查询中,另一个在您的循环中)。为什么不只是修改您的查询,以便您只需要一次实例化:

var sortedFiles = fns.Select(fn => new FileInfo(fn))
                     .OrderBy(f => f.Length);

foreach(var file in sortedFiles)
{
    Console.Write(file.Name);
    Console.Write(" ");
    Console.WriteLine(file.Length);
}
于 2013-05-16T20:56:23.210 回答
2

我没有看到您的代码有问题,但我会使用DirectoryInfo("path"). 它有一个GetFiles()返回FileInfo数组的方法。所以你不需要创建它两次..

var sort = new DirectoryInfo(path).GetFiles().OrderBy(f => f.Length);
于 2013-05-16T20:58:29.463 回答
1
  1. DirectoryInfo从您的目录路径创建一个。
  2. 使用 it's GetFilesorEnumerateFiles方法直接获取FileInfo对象。

这是你要找的吗?

static void Main()
{
    // Directory of files.
    const string dir = @"C:\Test";

    // File names.
    var files = new DirectoryInfo(dir).EnumerateFiles();

    // Order by size.
    var sort = from file in files
               orderby file.Length descending
               select file;

    // List files.
    foreach (var file in sort)
    {
        Console.Write(file.FullName);
        Console.Write(" ");
        Console.WriteLine(file.Length);
    }

    Console.ReadLine();
}
于 2013-05-16T20:59:22.107 回答