2017-07-19 18 views
2

私はnファイルのリモートフォルダを持ち、別のリモートファイルにコンテンツをコピーする必要があります。私はそれがストリームを介して行うことができます推測し、そしてこれは、私が試したものです:複数のリモートファイルをHttpWebRequest経由で別のリモートファイルにコピーするC#

1)私は私のPUTリクエストでな長さを指定する必要があります。私のコードで複数の問題があります

  WebRequest destRequest = WebRequest.Create(destFile); 
      destRequest.Method = "PUT"; 
      destRequest.Headers.Add("x-ms-blob-type", "BlockBlob"); //just an example with Azure blob, doesn't matter 


      using (Stream destStream = destRequest.GetRequestStream()) 
      { 
       string sourceName = "mysourcefolder"; 

       int blockSize = 8388608; //all the files have the same lenght, except one (sometimes) 
       for (int i = 0; i < n; i++) 
       { 
        string source = sourceName + i; 
        WebRequest sourceRequest = WebRequest.Create(source); 
        destRequest.Method = "GET"; 
        HttpWebResponse destResp = (HttpWebResponse)destRequest.GetResponse(); 
        using (Stream sourceStream = destResp.GetResponseStream()) 
        { 
         sourceStream.CopyTo(destStream, blockSize); 
        } 
       } 

       Console.Write("ok"); 
      } 

     } 
     catch (Exception e) 
     { 
      Console.Write("nope !"); 
     } 

。おそらくそれはblockSize*nなので、私はこれについての例外はない。

2)その場合、私はまだ例外Cannot close stream until all bytes are writtenを持っています。どういう意味ですか?

+0

私はあなたの要求が 'destRequest.Timeoutを設定してみてくださいアウトの時間を取得しているGESS;' ' destRequest.ReadWriteTimeoutは;'; ' –

答えて

1

リソースリクエストとdestリクエストに混乱があります。 私は変更行にコメントを追加しました。

 WebRequest destRequest = WebRequest.Create(destFile); 
     destRequest.Method = "PUT"; 
     destRequest.Headers.Add("x-ms-blob-type", "BlockBlob"); //just an example with Azure blob, doesn't matter 
     using (Stream destStream = destRequest.GetRequestStream()) 
     { 
      string sourceName = "mysourcefolder"; 
      //int blockSize = 8388608; //all the files have the same lenght, except one (sometimes) //all the files have the same lenght, except one (sometimes) 
      for (int i = 0; i < n; i++) 
      { 
       string source = sourceName + i; 
       WebRequest sourceRequest = WebRequest.Create(source); 
       destRequest.Method = "GET"; 

       //HttpWebResponse destResp = (HttpWebResponse)destRequest.GetResponse(); 
       //using (Stream sourceStream = destResp.GetResponseStream()) 

       // you need source response 
       HttpWebResponse sourceResp = (HttpWebResponse)sourceRequest.GetResponse(); 
       using (Stream sourceStream = sourceResp.GetResponseStream()) 
       { 
        sourceStream.CopyTo(destStream); 
       } 
      } 
      // The request is made here 
      var destinationResponse = (HttpWebResponse) destRequest.GetResponse(); 
      //Console.Write("ok"); 
      Console.Write(destinationResponse.StatusCode.ToString()); 
     } 
+0

私はのblockSize =(int型)sourceStream.Length int型'上の非サポート例外を取得します。例外は 'このストリームはシーク操作をサポートしていません ' –

+1

' sourceStream.CopyTo(destStream) 'を' blockSize'なしで呼び出すことができます。それは正しいのですか、それとも問題がありますか? –

+0

はい、その正しい。 – levent

関連する問題