Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 用C语言下载小块的大文件#_Asp.net_C# 4.0_Httpwebrequest_Websocket - Fatal编程技术网

Asp.net 用C语言下载小块的大文件#

Asp.net 用C语言下载小块的大文件#,asp.net,c#-4.0,httpwebrequest,websocket,Asp.net,C# 4.0,Httpwebrequest,Websocket,我需要下载一些大于25MB的文件,但我的网络只允许请求25MB的文件 我正在使用以下代码 const long DefaultSize = 26214400; long Chunk = 26214400; long offset = 0; byte[] bytesInStream; public void Download(string url, string filename) { long size = Size(url);

我需要下载一些大于25MB的文件,但我的网络只允许请求25MB的文件

我正在使用以下代码

  const long DefaultSize = 26214400;
    long Chunk = 26214400;
    long offset = 0;
    byte[] bytesInStream;
    public void Download(string url, string filename)
    {
        long size = Size(url);
        int blocksize = Convert.ToInt32(size / DefaultSize);
        int remainder = Convert.ToInt32(size % DefaultSize);
        if (remainder > 0) { blocksize++; }

        FileStream fileStream = File.Create(@"D:\Download TEST\" + filename);
        for (int i = 0; i < blocksize; i++)
        {
            if (i == blocksize - 1)
            {
                Chunk = remainder;

            }

            HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create(url);
            req.Method = "GET";
            req.AddRange(Convert.ToInt32(offset), Convert.ToInt32(Chunk+offset));
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            // StreamReader sr = new StreamReader(resp.GetResponseStream());


            using (Stream responseStream = resp.GetResponseStream())
            {
                bytesInStream = new byte[Chunk];
                responseStream.Read(bytesInStream, 0, (int)bytesInStream.Length);
                // Use FileStream object to write to the specified file
                fileStream.Seek((int)offset, SeekOrigin.Begin);
                fileStream.Write(bytesInStream,0, bytesInStream.Length);
            }
            offset += Chunk;

        }
        fileStream.Close();

    }
    public long Size(string url)
    {
        System.Net.WebRequest req = System.Net.HttpWebRequest.Create(url);
        req.Method = "HEAD";
        System.Net.WebResponse resp = req.GetResponse();
        resp.Close();
        return resp.ContentLength;

    }
const long DefaultSize=26214400;
长块=26214400;
长偏移=0;
字节[]字节流内;
公共无效下载(字符串url、字符串文件名)
{
长尺寸=尺寸(url);
int blocksize=Convert.ToInt32(大小/默认大小);
整数余数=Convert.ToInt32(大小%DefaultSize);
如果(余数>0){blocksize++;}
FileStream FileStream=File.Create(@“D:\Download TEST\”+文件名);
对于(int i=0;i

它可以正确地将内容写入磁盘,但内容不起作用

您应该在写入之前检查读取了多少,类似这样的内容(您不需要记住查找的偏移量,写入时自动查找):


有一个类似的问题可能会帮助你

还有这篇代码项目文章
范围是从零开始的,你应该从上限中减去1

request.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(offset, chunkSize + offset - 1);
我在以下链接发布了正确的代码片段:
Akka streams可以使用多线程技术从System.IO.Stream中以小块形式下载文件

下载方法将把字节附加到以long fileStart开头的文件中。如果文件不存在,fileStart值必须为0

using Akka.Actor;
using Akka.IO;
using Akka.Streams;
using Akka.Streams.Dsl;
using Akka.Streams.IO;

private static Sink<ByteString, Task<IOResult>> FileSink(string filename)
{
    return Flow.Create<ByteString>()
        .ToMaterialized(FileIO.ToFile(new FileInfo(filename), FileMode.Append), Keep.Right);
}

private async Task Download(string path, Uri uri, long fileStart)
{
    using (var system = ActorSystem.Create("system"))
    using (var materializer = system.Materializer())
    {
       HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
       request.AddRange(fileStart);

       using (WebResponse response = request.GetResponse())
       {
           Stream stream = response.GetResponseStream();

           await StreamConverters.FromInputStream(() => stream, chunkSize: 1024)
               .RunWith(FileSink(path), materializer);
       }
    }
}
使用Akka.Actor;
使用Akka.IO;
使用Akka.Streams;
使用Akka.Streams.Dsl;
使用Akka.Streams.IO;
专用静态接收器文件链接(字符串文件名)
{
返回流。创建()
.ToMaterialized(FileIO.ToFile(新的FileInfo(filename)、FileMode.Append)、Keep.Right);
}
私有异步任务下载(字符串路径、Uri、长文件启动)
{
使用(var system=ActorSystem.Create(“系统”))
使用(var materializer=system.materializer())
{
HttpWebRequest-request=WebRequest.Create(uri)为HttpWebRequest;
AddRange(fileStart);
使用(WebResponse=request.GetResponse())
{
Stream=response.GetResponseStream();
等待StreamConverters.FromInputStream(()=>stream,chunkSize:1024)
.RunWith(文件链接(路径),物化器);
}
}
}

我真的无法提供答案,但您是否能够逐步完成代码?我建议缩小所有数字(例如,将最大块大小设置为10字节,下载文件大小设置为25字节),然后逐步执行。由于涉及到更小的块,可能更容易发现哪里出了问题。你有没有找到最终的解决方案,并开始工作?回答:
它仍然不工作
你说
using Akka.Actor;
using Akka.IO;
using Akka.Streams;
using Akka.Streams.Dsl;
using Akka.Streams.IO;

private static Sink<ByteString, Task<IOResult>> FileSink(string filename)
{
    return Flow.Create<ByteString>()
        .ToMaterialized(FileIO.ToFile(new FileInfo(filename), FileMode.Append), Keep.Right);
}

private async Task Download(string path, Uri uri, long fileStart)
{
    using (var system = ActorSystem.Create("system"))
    using (var materializer = system.Materializer())
    {
       HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
       request.AddRange(fileStart);

       using (WebResponse response = request.GetResponse())
       {
           Stream stream = response.GetResponseStream();

           await StreamConverters.FromInputStream(() => stream, chunkSize: 1024)
               .RunWith(FileSink(path), materializer);
       }
    }
}