2009-07-26 17 views
5

次のコードを使用して、WebResponseを通じてwmvファイルを取得しています。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メディアビューアは、正しくファイルを開くことができません:私は、この関数を呼び出すスレッドを使用しています。ファイルの種類をサポートできないという愚かなエラー。

驚くほど簡単なことは何ですか?

+0

Windows Media Viewerが通常アプリケーションの外部にファイルを開くことを確認しましたか? – thedz

+0

はい。それを明確にしておかなければならない。 – KevDog

答えて

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(); 
} 
4

一度にMemoryStreamをメートル 1つのバイトを埋めるが、その後ファイルにSRを書いている理由を私は理解していません。その時点で、srは空であり、MemoryStream mは決して使用されないと私は考えている。

以下は、同様の作業を行うために書いたコードです。 WebResponseを一度に32Kチャンクで取得し、ファイルに直接ダンプします。

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. 
} 
+0

ええ、コードは変わり続けていて、私は複数のことを試していました。私は掲示する前にそれを掃除するより良い仕事をしていたはずです。私の悪い。 – KevDog

2

あなたのストリームを転送するStreamReaderStreamWriterを使用しているが、これらのクラスは、テキストを処理するためのものです。あなたのファイルはバイナリであり、データを転送するときに、CR、LF、CR LFのシーケンスが壊れてしまう可能性があります。どのようにNUL文字が処理されるか分かりません。

関連する問題