2016-12-29 1 views
1

Я пытаюсь ftpupload в ZipFile с асинхронной/ОЖИДАНИЕМ схемы:/асинхронное жду ftpupload повреждения загруженного файла

private async void button2_Click(object sender, RoutedEventArgs e) 
    { 

     await processFtp(); 

    } 
    async Task processFtp() 
    { 
     string result = ""; 
     string ftpHost = "ftp://mysite/mysubdir"; 

     string ftpUser = "itsme"; 

     string ftpPassword = "mypw"; 

     string ftpfullpath = ftpHost + "/" + "OutdoorTest.zip"; 

     string fileToUpload = @"c:\temp\Outdoorbilder.zip"; 
     try 
     { 

      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpfullpath); 
      request.Method = WebRequestMethods.Ftp.UploadFile; 

      request.Credentials = new NetworkCredential(ftpUser,ftpPassword); 
      request.UseBinary = true; 
      request.KeepAlive = false; 
      request.ReadWriteTimeout = 1000000; 
      request.Timeout = 1000000; 

      using (Stream requestStream = request.GetRequestStream()) 
      { 

       using (FileStream fs = File.OpenRead(fileToUpload)) 
       { 
        byte[] b = new byte[10 * 1024]; 
        int readLength = 0; 
        int sentLength = 0; 
        while ((readLength = fs.Read(b, 0, b.Length)) > 0) 
        { 
         await requestStream.WriteAsync(b, 0, b.Length); 
         int percentComplete = (int)((float)(sentLength += readLength)/(float)fs.Length * 100); 
         ftpprogress.Value = percentComplete; 
        } 
        requestStream.Close(); 
        requestStream.Flush(); 
       } 
      } 

      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
      response.Close(); 


      result = response.StatusDescription; 
     } 
     catch (WebException e) 
     { 

      result = e.Message; 
      if (e.Status == WebExceptionStatus.ProtocolError) 
      { 
       result = result + "Status Code : " + 
        ((FtpWebResponse)e.Response).StatusCode; 
       result = result + "\nStatus Description : " + 
        ((FtpWebResponse)e.Response).StatusDescription; 
      } 
     } 
     catch (Exception e) 
     { 
      result = e.Message; 
     } 


     MessageBox.Show(result); 
    } 
} 

код, кажется, работает хорошо, и я получаю 226 ответа. Но zip-файл на ftp-сервере составляет примерно 1000байт больше, чем оригинал, и после загрузки на мобильное устройство Android невозможно открыть/извлечь.

Когда я загружаю без шаблона async/await, загруженный файл имеет одинаковый размер на ftp-сервере в качестве локального оригинала.

Как это осуществить?

ответ

3

Это не имеет никакого отношения к async/await.

Ваша проблема в том, что вы не указали правильный размер для загрузки. Посмотрите на эти две строки:

while ((readLength = fs.Read(b, 0, b.Length)) > 0) 
{ 
    await requestStream.WriteAsync(b, 0, b.Length); 

Вы должны указать, что WriteAsyc записывает количество чтения, а не сумма, выделенная для буфера байтов. По крайней мере, последнее чтение вернет меньше размера буфера.

Так правильный код:

while ((bytesRead = fs.Read(b, 0, b.Length)) > 0) 
{ 
    await requestStream.WriteAsync(b, 0, bytesRead); 
Смежные вопросы