Ошибка нулевого значения объекта ("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;
}
}