2017-07-19 5 views
2

J'ai un dossier distant avec n fichiers et j'ai besoin de copier le contenu dans un autre fichier distant. Je suppose que cela peut être fait par des flux, ce qui est ce que j'ai essayé:copier plusieurs fichiers distants vers un autre fichier distant via HttpWebRequest C#

  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 !"); 
     } 

Il y a plusieurs problèmes dans mon code:

1) Je dois préciser la longueur dans ma demande de PUT. Probablement c'est blockSize*n puisque je n'ai aucune exception à ce sujet;

2) Si tel est le cas, j'ai toujours l'exception Cannot close stream until all bytes are written. Qu'est-ce que ça veut dire?

+0

Je Gess votre demande devient le temps essayez de régler 'destRequest.Timeout,' ' destRequest.ReadWriteTimeout,' –

Répondre

1

Il y a eu confusion dans les demandes de ressources et de destination. J'ai ajouté des commentaires aux lignes changeantes.

 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

je reçois un NotSupportedException sur 'int blockSize = (int) sourceStream.Length;'. L'exception est 'Ce flux ne supporte pas les opérations de recherche ' –

+1

cela marche appel' sourceStream.CopyTo (destStream) 'sans' blockSize'. Est-ce correct ou pourrais-je avoir des problèmes? –

+0

oui, c'est correct. – levent