2015-05-12 2 views
0

Я пытаюсь прочитать локальный файл и загрузить его на ftp-сервере. когда я читаю файл изображения, все в порядке, но когда я читаю файл doc или docx, FileStream возвращает length = 0. Вот мой код: Я проверил с некоторыми другими файлами, кажется, что он отлично работает только с изображениями и он возвращает 0 для любого другого файлаFileStream возвращает Length = 0

if (!ftpClient.FileExists(fileName)) 
{ 
    try 
    { 
     ftpClient.ValidateCertificate += (control, e) => { e.Accept = true; }; 

     const int BUFFER_SIZE = 64 * 1024; // 64KB buffer 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     using (Stream readStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read)) 
     using (Stream writeStream = ftpClient.OpenWrite(fileName)) 
     { 
      while (readStream.Position < readStream.Length) 
      { 
       buffer.Initialize(); 
       int bytesRead = readStream.Read(buffer, 0, BUFFER_SIZE); 
       writeStream.Write(buffer, 0, bytesRead); 
      } 
      readStream.Flush(); 
      readStream.Close(); 
      writeStream.Flush(); 
      writeStream.Close(); 
      DeleteTempFile(tempFilePath); 
      return true; 
     } 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 

Я не мог найти в этом ничего плохого. не могли бы вы мне помочь?

+0

Случается ли это только с файлами doc/docx? Является ли доступ отличным от файлов изображений? – davidgiga1993

+0

Вы говорите, что 'readStream.Length' равен нулю? Вы тестировали это с помощью отладчика или предполагали его на основе получения файла нулевого размера на ftp-сервере? Если последнее, я предлагаю вам журналы исключений, поскольку что-то, вероятно, не так и как просто возвращает false, когда это происходит. –

+0

Я проверил с некоторыми другими файлами, кажется, что он отлично работает только с изображениями и возвращает 0 для любого другого файла –

ответ

1

Хотя это не отвечает на ваш конкретный вопрос, вам фактически не нужно знать длину вашего потока. Просто продолжайте читать, пока не нажмете нулевую длину. A zero byte read is guaranteed to indicate the the end of any stream.

Возвращаемое значение

Тип: System.Int32

Общее количество байтов, считанных в буфер. Это может быть меньше количества запрошенных байтов, если количество байтов в настоящий момент недоступно, или нуль (0), если конец потока достигнут.

while (true) 
{ 
    int bytesRead = readStream.Read(buffer, 0, BUFFER_SIZE); 
    if(bytesRead==0) 
    { 
     break; 
    } 
    writeStream.Write(buffer, 0, bytesRead); 
} 

альтернативно:

readStream.CopyTo(writeStream); 

является, вероятно, самым кратким способом с указанием своей цели ...

+0

Я попробовал readStream.CopyTo (writeStream); но он все еще создает пустой файл –

0

это была просто глупая ошибка, у меня есть два FileUpload и я сохранил другую файловую загрузку, поэтому он создает файл с нулевой длиной. как кажется, код работает нормально. спасибо всем.

+0

Я знал это. :). – spender