【问题标题】:Get file's size from bytes array (without saving to disc)从字节数组中获取文件的大小(不保存到磁盘)
【发布时间】:2012-12-02 12:57:27
【问题描述】:

我有一个字节数组,如果我将这些字节写入文件,我想计算文件大小。是否可以不将文件写入光盘?

【问题讨论】:

  • Byte[] arr;int size = arr.Length;
  • 字节本身就是大小:) KB, MB 只计算有多少

标签: c# .net arrays


【解决方案1】:

array.Length 呢?看起来像字节大小。

【讨论】:

  • 不会返回数组中元素的总数吗?
  • 正如 Jon Skeet 在他的回答中提到的,一个字节的内存是磁盘上的一个字节。这意味着yes 这将为您提供字节数组中的元素数,但这也意味着字节数组长度是字节数
【解决方案2】:

嗯,是的:

int length = byteArray.Length;

内存中的一个字节将是磁盘上的一个字节......至少在更高级别的文件系统术语中。您还需要潜在地考虑将使用多少个单独的块/集群(以及目录条目的开销),以及操作系统可能提供的任何压缩,但从问题中不清楚这是否是您所追求的。

如果你真的确实想知道“磁盘上的大小”而不是文件大小(就像 Windows 可以显示这两个数字一样)我怀疑你真的必须将其写入磁盘 - 然后使用 Win32 API 找出磁盘上的实际大小。

【讨论】:

    【解决方案3】:

    Array.Length 会给出以字节表示的总大小。
    考虑到集群的大小,磁盘上的物理维度可能会多一些。

    【讨论】:

      【解决方案4】:

      前段时间我发现这个被剪断了,从那时起我就喜欢这样做

      public static string GetSizeInMemory(this long bytesize)
      {
      
      
          string[] sizes = { "B", "KB", "MB", "GB", "TB" };
          double len = Convert.ToDouble(bytesize);
          int order = 0;
          while(len >= 1024D && order < sizes.Length - 1)
          {
              order++;
              len /= 1024;
          }
      
          return string.Format(CultureInfo.CurrentCulture,"{0:0.##} {1}", len, sizes[order]);
      }
      

      您可以在访问任何提供文件或内存大小的东西(如 FileInfo 或 Process)时使用此扩展方法,以下是 2 个示例

      private void ValidateResources(object _)
      {
      
              Process p = Process.GetCurrentProcess();
              double now = p.TotalProcessorTime.TotalMilliseconds;
              double cpuUsage = (now - processorTime) / MONITOR_INTERVAL;
              processorTime = now;
      
              ThreadPool.GetMaxThreads(out int maxThreads, out int _);
              ThreadPool.GetAvailableThreads(out int availThreads, out int _);
      
              int cpuQueue = maxThreads - availThreads;
              var displayString= string.Concat(
                        p.WorkingSet64.GetSizeInMemory() + "/"
                      , p.PeakWorkingSet64.GetSizeInMemory(), " RAM, "
                      , p.Threads.Count, " threads, ", p.HandleCount.ToString("N0", CultureInfo.CurrentCulture)
                      , " handles,  ", Math.Min(cpuUsage, 1).ToString("P2", CultureInfo.CurrentCulture)
                      , " CPU usage, ", cpuQueue, " CPU queue depth"
      
                  ));
      
      }
      

      或带文件

          FileInfo file = new FileInfo(pathtoFile);
          string displaySize= file.Length.GetSizeInMemory();
      

      【讨论】:

      • 我觉得这有助于确定特定字节大小的度量单位,但并不能真正回答问题;也就是说,你如何确定发送到这个函数的值? (即,“bytesize”从哪里得到它的值?)
      • @TSmith,当然,好点,我使用一个文件和一个进程添加了两个样本,任何以字节为单位显示大小的东西都可以工作
      猜你喜欢
      • 2022-01-25
      • 2020-10-17
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多