【问题标题】:How can i get length (file size) of a task stream如何获取任务流的长度(文件大小)
【发布时间】:2015-10-21 15:46:54
【问题描述】:

我的主要要求是获取任务流的长度(文件大小) System.Threading.Tasks.Task<System.IO.Stream>。在内存流中,我曾经使用“stream.Result.Length”获取文件大小,但是当我尝试在任务流中使用相同的文件大小时,它会抛出异常说System.NotSupportedException,似乎流不支持该属性。我觉得内存流和其他流是有区别的。

发生异常处理通知:System.NotSupportedException: 此流不支持查找操作。

您能否给我任何指示,我该如何做到这一点 我找到了这个link,它给了我指示。我正在使用 .Net 3.5,因此我不能使用 .Net 4 中的 ConvertTo() 函数

【问题讨论】:

标签: c# stream .net-3.5 filesize memorystream


【解决方案1】:

流的意义在于,在开始处理它的第一部分之前,您不需要拥有所有可用数据。 MemoryStream 是一个例外,因为它确实将流的全部内容同时保存在内存中,因此它可以“支持查找操作”来告诉您流有多大。

如果您需要无法查找的流的完整大小,则必须消耗整个流才能找到它。如果流总是相对较小,您可以copy its contents into a MemoryStream。如果要更大,您可以将其内容复制到磁盘上的文件中。

您可能想检查为什么您需要知道长度。例如,如果这样您可以取消太大的上传,那么也许您应该开始分块处理上传,但是在每条数据进入后检查您到目前为止收到了多少数据,并取消如果它变得太大,则处理。

【讨论】:

  • 非常感谢您的解释。我正在使用 pdf 文件创建此流。所以正如你所说,我需要将任务流转换或复制到另一个流中,比如内存流,有这些内置方法“CopyStreamToStreamAsync()”或“file.Stream.CopyTo()”方法可以用于.net4.0+,但我使用的是 .net 3.5。无论如何,对于 .net 3.5 的建议也很少,但仍然不适合我。您所说的任何方式都是读取整个流并获取它的长度??
  • @Dark99:为什么需要流的长度? PDF 文件来自哪里?
  • 我保留了一个变量“attachmentMetadata”来存储 pdf 的详细信息,例如文件名……等等,我还需要存储文件的大小。正如我在问题中所说的那样,例如,我以前使用它来获取流“stream.Result.Length”的大小,但现在我遇到了获取任务流的问题。
  • @Dark99: PDF 文件在磁​​盘上吗?如果是这样,您可以检查文件大小。在处理流的其余部分之前,附件元数据是否需要具有长度?如果没有,您可以处理 PDF 文件并随时跟踪通过的字节数,然后在最后设置元数据长度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多