gpt4 book ai didi

.net - 分段FileStream写

转载 作者:行者123 更新时间:2023-12-03 12:52:35 26 4
gpt4 key购买 nike

我使用分段HTTP下载,使用范围(HttpWebRequest.AddRanges())将文件拆分为多个部分,然后将所有部分合并。如果文件为100字节,则将其分为4部分(0-24、25-49、50-74、75-99),并调用四次DownloadPart函数。
每个部分都使用异步编程模型(BeginRead/EndRead)下载。当所有部分完成后,我加入他们,part1 + part2 + ...

 public void DowloadPart(HttpWebResponse httpResp)
{
Stream httpStm = httpResp.GetResponseStream();
Stream fileStm = new FileStream("myFile.part1", FileMode.Append, FileAccess.Write);
byte[] buff = new byte[1024 * 16];

AsyncCallback callback = null;
callback = ar =>
{
int bytesRead = httpStm.EndRead(ar);
fileStm.Write(buff, 0, bytesRead);
if(bytesRead == 0)
return;

httpStm.BeginRead(buff, 0, buff.Length, callback, null);
};
httpStm.BeginRead(buff, 0, buff.Length, callback, null);
}

我想用直接写入文件来替换连接的零件。由于所有“DownloadPart”都在不同的线程中运行,从不同线程在不同位置并发写入FileStream的最佳方法是什么?

最佳答案

理想情况下,您将文件首先增长到所需的大小,这并非微不足道。要使用的API仅作为 native API存在,即 SetFileValidData ,并且需要特殊的SE_MANAGE_VOLUME_PRIVILEGE进行处理。 (巨大的)优点是文件会增长到所需的大小,而无需先填充0。对于熟悉数据库的人来说,这就是Instant File Initialization

如果您不想麻烦,可以按照传统方式扩展文件,但是您要付出两次写入内容的代价,一次写入0一次是有效内容。

文件大小正确后,写入内容的最佳API是 WriteFileGather 。 Scatter/Gather IO允许您以任意偏移量写入任意文件段。但是,同样,它只是 native 的,没有托管的对等...

不分散/收集IO另一个不错的选择是内存映射访问。幸运的是,它具有用于.Net 4.0的托管API MemoryMappedFile ...。

没有存储器映射的IO,您必须使用单个流进行所有写入。这意味着您必须使用生产者-消费者模式,在该模式中,Web流产生要写入的缓冲区(注释为文件偏移量,以写入位置!),并且一个使用者使用这些缓冲区并将它们写入输出流中的适当位置。

关于.net - 分段FileStream写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19424104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com