Ошибка нулевого значения объекта ("System.InvalidOperationException" в mscorlib.dll ) - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Вылетает ошибка при запаковке файла GZip'ом. При том нестабильно и нерегулярно. Проверьте плиз на своих машинах:
using System;
using System.IO;
using System.IO.Compression;
using System.Threading;
 
namespace Compress_Decompress
{
 
    class GZipTest
    {
        static int BufferSize = 2048*2048;   //!!!!!!
 
        const int multithread= 8;//количество потоков
        public static void WriteBlock(GZipStream inStream,int read, byte[] buffer) //запись в архив из входного блока
        {
            try
            {
                Console.Write('-');
                inStream.Write(buffer, 0, read);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
             //   error = true;
            }
 
        }
 
        public static void WriteBlockCompressed(FileStream inStream, int read, byte[] buffer)//запись архивного блока в выходной файл
        {
            Console.Write('-');
            inStream.Write(buffer, 0, read);
        }
       
        public static void Compress(string inFileName, string outFileName, bool error)//путь к входному файлу, путь к выходному файлу, флаг
        {
            try
            {
                using (FileStream inFile = new FileStream(inFileName, FileMode.Open))//инициализация входного файла
                {
                    using (FileStream comp = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
                    {
                        //
                        // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS 
                        // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!! 
                        //
                        using (GZipStream inStream = new GZipStream(comp, CompressionMode.Compress))//буферный поток сжатия
                        {
                            int read = 0;
                            byte[] buffer = new byte[BufferSize];
                            while ((inFile.Length > inFile.Position)||(read!=0))
                            {
                                Thread[] thread = new Thread[multithread];//множим потоки 
                                for (int i = 0; i < multithread; i++)
                                {
                                    read = inFile.Read(buffer, 0, BufferSize);
                                    Console.Write("|{0}", i);//смотрим на флаг смены потоков
                                    thread[i] = new Thread(() =>
                                    WriteBlock(inStream, read, buffer)
                                    );
                                    thread[i].Start();
                                 //   thread[i].Join();
                                }
                          //      thread[multithread].Join();
                               for(int i=0;i<multithread;i++)
                                {
                                    thread[multithread-i-1].Join();
                                }
                            }
                            inStream.Close();  //!!!!!!
 
                        }
                        comp.Close();
                    }                 
                    inFile.Close(); 
                }
                error = false;
                Console.WriteLine(" finished packing. ");
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
                error = true;
            }
        }
 
        public static void Decompress(string inFileName, string outFileName, bool error) //путь к входному файлу, путь к выходному файлу, флаг
        {
            try
            {
                FileStream inFile = new FileStream(inFileName, FileMode.Open, FileAccess.Read);//инициализация входного файла
                {
                    using (GZipStream decomp = new GZipStream(inFile, CompressionMode.Decompress))//инициализация буфера распаковки
                    {
                        //
                        // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS 
                        // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!! 
                        //
                        using (FileStream outStream = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
                        {
                            int read;
                            byte[] buffer = new byte[BufferSize];
                            while (inFile.Length > inFile.Position)
                            {
                                Thread[] thread = new Thread[multithread];
                                for (int i = 0; i < multithread; i++)
                                {
                                    read = decomp.Read(buffer, 0, BufferSize);
                                    Console.Write("|{0}", i);//смотрим на флаг смены потоков
                                    thread[i] = new Thread(() =>
                                    WriteBlockCompressed(outStream, read, buffer)
                                    );
                                    thread[i].Start();
                                }
                                foreach (Thread trd in thread)//закрываем все потоки
                                {
                                    trd.Join();
                                }
                            }
                            outStream.Close();
                        }
                        decomp.Close();
                    }
                inFile.Close();
                }
                Console.WriteLine(" finished unpacking. ");
                error = false;
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
                error = true;
            }
        }    
    }
 
    class Program
    {
        static string GZip, fIN, fOUT;
        static bool error = true, 
                     flag = true;
 
        public static void Main(string[] args)//параметры для командной строки должны быть закомментированы для отладки!!!!
        {
            DateTime dold = DateTime.Now;
         /*   try
            {
                GZip = args[0]; //во время работы с консолью  раскомментировать GZip, fIN, fOUT!!!!
                fIN = args[1];
                fOUT = args[2];
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message+"|| Неверно введены параметры.");
                error = true;
            }*/
 
            try
            { 
                Console.CancelKeyPress += delegate //ловим ctrl+c
                {
                    GC.Collect(); //чистим мусор
                    flag = false;
                };
                while ((true)&(flag))
                {
                    GZip = "compress";          //
                    fIN = "d:/test.avi";        //тестовые значения для отладки!!!!!
                    fOUT = "d:/test.avi.gz";    //
                    if (GZip == "compress")   
                    {
                        Console.WriteLine("packing: ");
                        GZipTest.Compress(fIN, fOUT, error);
                    }
                    else if (GZip == "decompress")
                    {
                        Console.Write("unpacking: ");
                        GZipTest.Decompress(fIN, fOUT, error);
                    }
                    flag = false;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
                error = true;
            }
            TimeSpan sp = DateTime.Now - dold;
            Console.WriteLine("press Enter to terminate! CODE {0}", error ? "1" : "0");
            Console.WriteLine("completed in {0} secs",sp);
            Console.ReadLine();
        }
    }
}

Решение задачи: «Ошибка нулевого значения объекта ("System.InvalidOperationException" в mscorlib.dll )»

textual
Листинг программы
public static void Compress(string inFileName, string outFileName)//путь к входному файлу, путь к выходному файлу
        {
            try
            {
                using (FileStream inFile = new FileStream(inFileName, FileMode.Open))//инициализация входного файла
                {
                    using (FileStream outFile = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
                    {
                        //
                        // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS 
                        // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!! 
                        //
                        using (GZipStream inGZip = new GZipStream(outFile, CompressionMode.Compress))//буферный поток сжатия
                        {
                            int i = 0, j = 0;
                            int[] read = new int[multithread];
                            byte[] buffer = new byte[BufferSize];
                            Thread[] thread = new Thread[multithread];
                            Thread[] thread_ = new Thread[multithread];
                            var mem = new MemoryStream();
                            while ((inFile.Length - inFile.Position) > BufferSize)
                            {
                                for (j = 0; (j < multithread) && ((inFile.Length - inFile.Position) > BufferSize); j++)
                                {
                                    thread[j] = new Thread(() =>
                                    {
                                        read[j] = inFile.Read(buffer, 0, BufferSize);
                                        Console.Write("- {0} -", j);
                                    });
                                    thread[j].Start();
                                    thread[j].Join();
 
                                    thread_[j] = new Thread(() =>
                                    {
                                        inGZip.Write(buffer,0, read[j]);
                                        Console.Write("|");
                                   //     Thread.Sleep(1100);
                                    });
                                    thread_[j].Start();
                                    thread_[j].Join();
 
                                }
                                for (i = 0; i < j; i++)
                                {
                                    thread[i].Join();
                                }
 
                            }
                            inGZip.Write(buffer, 0, inFile.Read(buffer, 0, BufferSize));
                            inGZip.Close();  //!!!!!!
                        }
                        outFile.Close();
 
                    }
                    inFile.Close();
                    error = false;
                    Console.WriteLine(" finished packing. ");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: " + ex.Message);
                error = true;
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы