5

我正在使用以下代码通过 WebResponse 获取 wmv 文件。我正在使用一个线程来调用这个函数:

static void GetPage(object data)
{
    // Cast the object to a ThreadInfo
    ThreadInfo ti = (ThreadInfo)data;

    // Request the URL
    WebResponse wr = WebRequest.Create(ti.url).GetResponse();

    // Display the value for the Content-Length header
    Console.WriteLine(ti.url + ": " + wr.Headers["Content-Length"]);
    string toBeSaved = @"C:\Users\Kevin\Downloads\TempFiles" + wr.ResponseUri.PathAndQuery;        
    StreamWriter streamWriter = new StreamWriter(toBeSaved);

    MemoryStream m = new MemoryStream();
    Stream receiveStream = wr.GetResponseStream();
    using (StreamReader sr = new StreamReader(receiveStream))
    {
        while (sr.Peek() >= 0)
        {
            m.WriteByte((byte)sr.Read());
        }
        streamWriter.Write(sr.ReadToEnd());
        sr.Close();
        wr.Close();
    }

    streamWriter.Flush();
    streamWriter.Close();

    // streamReader.Close();
    // Let the parent thread know the process is done
    ti.are.Set();

    wr.Close();
}

该文件似乎下载得很好,但 Windows Media Viewer 无法正确打开该文件。关于无法支持文件类型的一些愚蠢错误。

我错过了什么难以置信的简单事情?

4

3 回答 3

5

您只需要将其下载为二进制而不是文本。这是一种应该为您解决问题的方法。

public void DownloadFile(string url, string toLocalPath)
{
    byte[] result = null;
    byte[] buffer = new byte[4097];

    WebRequest wr = WebRequest.Create(url);

    WebResponse response = wr.GetResponse();
    Stream responseStream = response.GetResponseStream;
    MemoryStream memoryStream = new MemoryStream();

    int count = 0;

    do {
        count = responseStream.Read(buffer, 0, buffer.Length);
        memoryStream.Write(buffer, 0, count);

        if (count == 0) {
            break;
        }
    }
    while (true);

    result = memoryStream.ToArray;

    FileStream fs = new FileStream(toLocalPath, FileMode.OpenOrCreate, FileAccess.ReadWrite);

    fs.Write(result, 0, result.Length);

    fs.Close();
    memoryStream.Close();
    responseStream.Close();
}
于 2009-07-26T05:36:28.540 回答
4

我不明白你为什么一次填充 MemoryStream m一个字节,然后将sr写入文件。那时,我相信sr是空的,并且 MemoryStream m从未使用过。

下面是我为执行类似任务而编写的一些代码。它一次获取 32K 块的 WebResponse,并将其直接转储到文件中。

public void GetStream()
{
    // ASSUME: String URL is set to a valid URL.
    // ASSUME: String Storage is set to valid filename.

    Stream response = WebRequest.Create(URL).GetResponse().GetResponseStream();
    using (FileStream fs = File.Create(Storage)) 
    {
        Byte[] buffer = new Byte[32*1024];
        int read = response.Read(buffer,0,buffer.Length);
        while (read > 0)
        {
            fs.Write(buffer,0,read);
            read = response.Read(buffer,0,buffer.Length);
        }
    }
    // NOTE: Various Flush and Close of streams and storage not shown here.
}
于 2009-07-26T04:24:02.257 回答
2

您正在使用 aStreamReader和 aStreamWriter来传输流,但这些类用于处理文本。您的文件是二进制文件,当您传输数据时,CR、LF 和 CR LF 的序列可能会被破坏。我不知道如何处理 NUL 字符。

于 2009-07-26T04:26:56.167 回答