1. C# / Говнокод #2086

    +98

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    static void CompressFile(string inFilename, 
                                 string outFilename)
        {
    
          FileStream sourceFile = File.OpenRead(inFilename);
          FileStream destFile = File.Create(outFilename);
    
          // Create the Compressed stream
          GZipStream compStream =
            new GZipStream(destFile, CompressionMode.Compress);
    
          // Write the data
          int theByte = sourceFile.ReadByte();
          while (theByte != -1)
          {
            compStream.WriteByte((byte)theByte);
            theByte = sourceFile.ReadByte();
          }
    
          // Clean it up
          sourceFile.Close();
          compStream.Close();
          destFile.Close();
        }

    Пример из книги "Microsoft .NET Framework 2.0 Application Development Foundation", официального пособия для подготовки к экзамену 70-536.
    Угадайте, почему "сжатые" файлы получаются больше несжатых.

    Запостил: gecko, 02 Ноября 2009

    Комментарии (12) RSS

    • Почему?
      Ответить
    • int > byte ?
      Ответить
      • нет, потому что "сжимать" по одному байту слегка нерационально
        Ответить
        • А разве в подобных потоках нет буферизации?
          Ответить
          • в том то и дело что нет, к примеру такой вариант уже будет реально сжимать (вариант кода чтобы явно убедиться что проблема именно в том, что пишется по одному байту) :
            static void CompressFile(string inFilename,
                                         string outFilename)
                    {
            
                        FileStream sourceFile = File.OpenRead(inFilename);
                        FileStream destFile = File.Create(outFilename);
            
            
            
                        // Create the Compressed stream
                        GZipStream gzStream =
                          new GZipStream(destFile, CompressionMode.Compress);
                        BufferedStream compStream = new BufferedStream(gzStream); 
            
                        // Write the data
                        int theByte = sourceFile.ReadByte();
                        while (theByte != -1)
                        {
                            compStream.WriteByte((byte)theByte);
                            theByte = sourceFile.ReadByte();
                        }
                        compStream.Flush();
                        // Clean it up
                        sourceFile.Close();
                        gzStream.Close();
                        destFile.Close();
                        compStream.Close();
                    }
            Ответить
            • Результат тот же: сжатый файл занимает больше места, чем оригинал
              Ответить
            • А что изменилось то? Вроде тоже по байту пишут...
              Ответить
    • Ещё тут нет using (ну или try/finally) для закрытия файлов в случае какого-либо исключения.
      Ответить
    • Нет проверки, что аргументы метода не null.
      Ответить
    • поддерживаю, намучался я с этими примерами тоже (этот - не единственный просто)
      Ответить
    • Всякие проверки специально убирают из примеров, чтобы они были читаемыми. Автор книжки хочет донести суть, а не привести полностью рабочий код.
      Ответить

    Добавить комментарий