【问题标题】:C# Get file size of array with pathsC#获取带有路径的数组的文件大小
【发布时间】:2018-08-08 06:32:24
【问题描述】:

我是数组的新手,我想将多个文件的大小(以 MB 为单位)显示到一个文本框中。文件的路径在一个数组中。

var Files = Directory.GetFiles(Path, "*" + filetype, SearchOption.AllDirectories);

我在另一篇文章中看到了这段代码来获取文件的大小:

long length = new System.IO.FileInfo(file).Length;

如何将所有文件大小添加到 int/string 并将它们写入 textBox?

【问题讨论】:

  • MB 只是 FileInfoLength / (1024*1024)
  • @loyd,以下答案是否解决了您的问题?

标签: c# arrays file filesize


【解决方案1】:

如果我理解正确,请使用 Linq Selectstring.Join

var results = Directory.GetFiles(Path, "*" + filetype, SearchOption.AllDirectories)
                        .Select(file => new FileInfo(file).Length);

 TextBox1.Text = string.Join(", ", results);

如果你想对它们求和,只需使用Enumerable.Sum

 TextBox1.Text = $"{results.Sum():N3}";

更新

public static class MyExtension
{
    public enum SizeUnits
    {
        Byte, KB, MB, GB, TB, PB, EB, ZB, YB
    }

    public static string ToSize(this Int64 value, SizeUnits unit)
    {
        return (value / (double)Math.Pow(1024, (Int64)unit)).ToString("0.00");
    }
}

 TextBox1.Text = results.Sum().ToSize();

【讨论】:

  • 还有一个问题,有没有办法得到十进制值?在我的情况下,文件的大小为 14.9 MB,但我最终得到 14 MB。
  • @loyd 你可以在这里阅读更多关于他们的信息docs.microsoft.com/en-us/dotnet/standard/base-types/…
  • 我使用了 $"{results.Sum() / (1024*1024):N3}";以 MB 为单位获取文件大小,但十进制值仅填充零。我的错误是什么?
  • @loyd 你可以使用 $"{results.Sum() / (double)(1024*1024):N3}",或者如果你想看的话我更新了我的答案
【解决方案2】:

如果您不想使用 LINQ 增加复杂性并想练习使用数组:

var Files = Directory.GetFiles(Path, "*" + filetype, SearchOption.AllDirectories);

long length = 0;

for (int i = 0; i < Files.Length; i++)
{
    length += new FileInfo(Files[i]).Length;
}

【讨论】:

    【解决方案3】:

    下面的代码可能对你有用。

    var FilesAndSizes = Directory.GetFiles(Path, "*" + filetype, SearchOption.AllDirectories).Select(item => new KeyValuePair<string,int>(item, new System.IO.FileInfo(item).Length));
    

    【讨论】:

      【解决方案4】:

      使用Directory.EnumerateFiles,您可以计算总大小,同时只遍历数组一次。

      要获取扩展名的所有文件的总大小:

      long totalSizeInBytes = 0;
      foreach(var file in Directory.EnumerateFiles(Path, "*" + filetype, SearchOption.AllDirectories))
      {                
          totalSizeInBytes += new FileInfo(file).Length;
      }
      

      获取所有文件大小的列表:

      var results = Directory.EnumerateFiles(Path, "*" + filetype, SearchOption.AllDirectories)
                          .Select(file => new FileInfo(file).Length);
      
      TextBox1.Text = string.Join(", ", results);
      

      【讨论】:

        【解决方案5】:

        我认为 DirectoryInfo 对象比 Directory 对象更适合您的情况。

        看那个例子:

        public static void Main()
        {
            string filetype = ".jpg";
        
            // Make a reference to a directory.
            DirectoryInfo di = new DirectoryInfo("c:\\");
            // Get a reference to each file in that directory.
            FileInfo[] fiArr = di.GetFiles("*" + filetype, SearchOption.AllDirectories);
            // Display the names and sizes of the files.
            Console.WriteLine("The directory {0} contains the following files:", di.Name);
            foreach (FileInfo f in fiArr)
                Console.WriteLine("The size of {0} is {1} bytes.", f.Name, f.Length);
        }
        

        GetFiles 方法返回一个 FileInfo 对象数组,您可以在其中找到文件大小。

        参数:

        在这个示例中,我正在写入控制台输出,但您可以以同样的方式将文本添加到文本框。

           mytexbox.Text += String.Format("The size of {0} is {1} bytes.\r\n", f.Name, f.Length);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-25
          • 2010-10-23
          • 1970-01-01
          • 2016-06-06
          • 2014-10-15
          • 2020-07-24
          • 2014-08-04
          相关资源
          最近更新 更多