2017-02-06 33 views
0

Я пытаюсь преобразовать все png в папку в 8bpp png с помощью nQuant. Я попытался использовать следующий код:Чтение и запись на том же FileStream

foreach (string file in Directory.GetFiles(tempFolderPath, "*.png", SearchOption.TopDirectoryOnly)) 
     { 
      using (MemoryStream memory = new MemoryStream()) 
      { 
       using (FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
       { 
        using (Bitmap image = new Bitmap(fs)) 
        { 
         using (Image quantized = quantizer.QuantizeImage(image)) 
         { 
          quantized.Save(memory, ImageFormat.Png); 
          byte[] bytes = memory.ToArray(); 
          fs.Write(bytes, 0, bytes.Length); 
         } 
        } 
       } 
      } 
     } 

Это, однако, не работает. Без исключений. Просто не записывается в файл. Я заменил его на этот рабочий код.

Bitmap image; 
foreach (string file in Directory.GetFiles(tempFolderPath, "*.png", SearchOption.TopDirectoryOnly)) 
     { 
      using (FileStream fso = new FileStream(file, FileMode.Open, FileAccess.ReadWrite)) 
      { 
       image = new Bitmap(fso); 
      } 

      using (MemoryStream memory = new MemoryStream()) 
      { 
       using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.ReadWrite)) 
       { 
        using (Image quantized = quantizer.QuantizeImage(image)) 
        { 
         quantized.Save(memory, ImageFormat.Png); 
         byte[] bytes = memory.ToArray(); 
         fs.Write(bytes, 0, bytes.Length); 
        } 
       } 
      } 
     } 

Похоже FileMode.OpenOrCreate может сделать один или другой, но не оба.

Есть ли все равно, чтобы читать и писать на одном FileStream?

+0

выполните быстрый поиск по следующему 'C# Stackoverflow чтению и записи в тот же FileStream' – MethodMan

+0

@MethodMan Да, я нашел [это] (http://stackoverflow.com/questions/605685/how-to-bothread -and-write-a-file-in-c-sharp), и я использовал верхний ответ. Я также нашел [this] (http://stackoverflow.com/questions/33633344/read-and-write-to-a-file-in-the-same-stream) и попытался добавить fs.Flush(), но это также не работает. – I23BigC

ответ

1

Ваш код просто объединяет содержимое этих изображений в один файл, так как вы не сбрасываете позицию в потоке файлов.

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

Вместо этого используйте временные файлы.