2015-05-04 3 views
2

В настоящее время я работаю над приложением Windows Store, в котором я должен сделать снимок, сохранить его локально, а затем, когда вызывается синхронизация, отправьте его на службу, которая сохранит изображение на сервере.Stream.CopyTo() не копирует данные под определенную длину

У меня возникла проблема при копировании этих изображений. Что я делаю следующее:

  1. Получить список всех изображений в указанной папке и извлечь их buffer.toarray в bitearray

    Dim fileList As IReadOnlyList(Of StorageFile) = Await folder.GetFilesAsync() 
    For Each file As StorageFile In fileList 
    
        Dim Buffer As IBuffer = Await Windows.Storage.FileIO.ReadBufferAsync(file) 
        fileBytes = Buffer.ToArray() 
        lstfileBytes.Add(fileBytes) 
    
    Next file 
    
  2. тогда я посылаю его к моей службе VB.Net который сохраняет изображение в файл он создан с использованием stream.copyto()

    For i = 0 To lstMemoryPicturesReservoir.Count - 1 
        Dim fs As FileStream = New FileStream("\\SERVER\Data\name.jpg", FileMode.Create) 
        Dim memory As Stream = New MemoryStream(lstMemoryPicturesReservoir(i)) 
        memory.position = 0 
        memory.CopyTo(fs) 
    Next 
    

Этот код работает для меня, за исключением случаев, когда размер изображения становится маленьким до определенной точки. Я заметил, что когда lenght моего ByteArray составляет около 4000 или ниже, изображение не копируется должным образом. Когда я открываю его в моем средстве просмотра фотографий Windows Я получаю следующее сообщение об ошибке:

для Windows Photo Viewer не может отобразить эту картину, потому что файл пуст

Любая идея, что может быть вызывая эту проблему или как ее исправить?

ответ

1

Попробуйте поместить оба потока в Using блоков:

For i = 0 To lstMemoryPicturesReservoir.Count - 1 
    Using fs As FileStream = New FileStream("\\SERVER\Data\name.jpg", FileMode.Create) 
     Using memory As Stream = New MemoryStream(lstMemoryPicturesReservoir(i)) 
      memory.position = 0 
      memory.CopyTo(fs) 
     End Using 
    End Using 
Next 

Using блоки должны использоваться везде, где вы:

  1. Создать объект класса, который реализует интерфейс IDisposable и
  2. You начать и закончить использование этого объекта в том же объеме

Using гарантирует, что метод Dispose интерфейса IDisposable вызывается, даже если выбрано исключение.

В этом случае метод Dispose гарантирует, что все буферы будут очищены до закрытия потоков. Я подозреваю, что последние 4000 байтов не были сброшены. На самом деле, я подозреваю, что вы в конце концов заметили бы странные проблемы с изображениями размером более 4000 байт - некоторым из них не хватало бы окончательного буфера, заполненного данными. Недостаточно данных, чтобы они не отображались, но они выглядели бы странно, мягко говоря.

+0

Итак, это сработало для вас? –

+0

Да, это работает. Я не совсем понимаю, в чем отличие 'using' делает, хотя – micbobo

+0

Nvm Я прочитал https://msdn.microsoft.com/en-us/library/htd05whh.aspx, который сделал его более ясным – micbobo

Смежные вопросы