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

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

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

Всем привет. Вылетает ошибка при запаковке файла GZip'ом. При том нестабильно и нерегулярно. Проверьте плиз на своих машинах:
Листинг программы
  1. using System;
  2. using System.IO;
  3. using System.IO.Compression;
  4. using System.Threading;
  5. namespace Compress_Decompress
  6. {
  7. class GZipTest
  8. {
  9. static int BufferSize = 2048*2048; //!!!!!!
  10. const int multithread= 8;//количество потоков
  11. public static void WriteBlock(GZipStream inStream,int read, byte[] buffer) //запись в архив из входного блока
  12. {
  13. try
  14. {
  15. Console.Write('-');
  16. inStream.Write(buffer, 0, read);
  17. }
  18. catch (Exception ex)
  19. {
  20. Console.WriteLine("ERROR: " + ex.Message);
  21. // error = true;
  22. }
  23. }
  24. public static void WriteBlockCompressed(FileStream inStream, int read, byte[] buffer)//запись архивного блока в выходной файл
  25. {
  26. Console.Write('-');
  27. inStream.Write(buffer, 0, read);
  28. }
  29. public static void Compress(string inFileName, string outFileName, bool error)//путь к входному файлу, путь к выходному файлу, флаг
  30. {
  31. try
  32. {
  33. using (FileStream inFile = new FileStream(inFileName, FileMode.Open))//инициализация входного файла
  34. {
  35. using (FileStream comp = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
  36. {
  37. //
  38. // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS
  39. // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!!
  40. //
  41. using (GZipStream inStream = new GZipStream(comp, CompressionMode.Compress))//буферный поток сжатия
  42. {
  43. int read = 0;
  44. byte[] buffer = new byte[BufferSize];
  45. while ((inFile.Length > inFile.Position)||(read!=0))
  46. {
  47. Thread[] thread = new Thread[multithread];//множим потоки
  48. for (int i = 0; i < multithread; i++)
  49. {
  50. read = inFile.Read(buffer, 0, BufferSize);
  51. Console.Write("|{0}", i);//смотрим на флаг смены потоков
  52. thread[i] = new Thread(() =>
  53. WriteBlock(inStream, read, buffer)
  54. );
  55. thread[i].Start();
  56. // thread[i].Join();
  57. }
  58. // thread[multithread].Join();
  59. for(int i=0;i<multithread;i++)
  60. {
  61. thread[multithread-i-1].Join();
  62. }
  63. }
  64. inStream.Close(); //!!!!!!
  65. }
  66. comp.Close();
  67. }
  68. inFile.Close();
  69. }
  70. error = false;
  71. Console.WriteLine(" finished packing. ");
  72. }
  73. catch (Exception ex)
  74. {
  75. Console.WriteLine("ERROR: " + ex.Message);
  76. error = true;
  77. }
  78. }
  79. public static void Decompress(string inFileName, string outFileName, bool error) //путь к входному файлу, путь к выходному файлу, флаг
  80. {
  81. try
  82. {
  83. FileStream inFile = new FileStream(inFileName, FileMode.Open, FileAccess.Read);//инициализация входного файла
  84. {
  85. using (GZipStream decomp = new GZipStream(inFile, CompressionMode.Decompress))//инициализация буфера распаковки
  86. {
  87. //
  88. // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS
  89. // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!!
  90. //
  91. using (FileStream outStream = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
  92. {
  93. int read;
  94. byte[] buffer = new byte[BufferSize];
  95. while (inFile.Length > inFile.Position)
  96. {
  97. Thread[] thread = new Thread[multithread];
  98. for (int i = 0; i < multithread; i++)
  99. {
  100. read = decomp.Read(buffer, 0, BufferSize);
  101. Console.Write("|{0}", i);//смотрим на флаг смены потоков
  102. thread[i] = new Thread(() =>
  103. WriteBlockCompressed(outStream, read, buffer)
  104. );
  105. thread[i].Start();
  106. }
  107. foreach (Thread trd in thread)//закрываем все потоки
  108. {
  109. trd.Join();
  110. }
  111. }
  112. outStream.Close();
  113. }
  114. decomp.Close();
  115. }
  116. inFile.Close();
  117. }
  118. Console.WriteLine(" finished unpacking. ");
  119. error = false;
  120. }
  121. catch (Exception ex)
  122. {
  123. Console.WriteLine("ERROR: " + ex.Message);
  124. error = true;
  125. }
  126. }
  127. }
  128. class Program
  129. {
  130. static string GZip, fIN, fOUT;
  131. static bool error = true,
  132. flag = true;
  133. public static void Main(string[] args)//параметры для командной строки должны быть закомментированы для отладки!!!!
  134. {
  135. DateTime dold = DateTime.Now;
  136. /* try
  137. {
  138. GZip = args[0]; //во время работы с консолью раскомментировать GZip, fIN, fOUT!!!!
  139. fIN = args[1];
  140. fOUT = args[2];
  141. }
  142. catch (Exception ex)
  143. {
  144. Console.WriteLine("ERROR: " + ex.Message+"|| Неверно введены параметры.");
  145. error = true;
  146. }*/
  147. try
  148. {
  149. Console.CancelKeyPress += delegate //ловим ctrl+c
  150. {
  151. GC.Collect(); //чистим мусор
  152. flag = false;
  153. };
  154. while ((true)&(flag))
  155. {
  156. GZip = "compress"; //
  157. fIN = "d:/test.avi"; //тестовые значения для отладки!!!!!
  158. fOUT = "d:/test.avi.gz"; //
  159. if (GZip == "compress")
  160. {
  161. Console.WriteLine("packing: ");
  162. GZipTest.Compress(fIN, fOUT, error);
  163. }
  164. else if (GZip == "decompress")
  165. {
  166. Console.Write("unpacking: ");
  167. GZipTest.Decompress(fIN, fOUT, error);
  168. }
  169. flag = false;
  170. }
  171. }
  172. catch (Exception ex)
  173. {
  174. Console.WriteLine("ERROR: " + ex.Message);
  175. error = true;
  176. }
  177. TimeSpan sp = DateTime.Now - dold;
  178. Console.WriteLine("press Enter to terminate! CODE {0}", error ? "1" : "0");
  179. Console.WriteLine("completed in {0} secs",sp);
  180. Console.ReadLine();
  181. }
  182. }
  183. }

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

textual
Листинг программы
  1. public static void Compress(string inFileName, string outFileName)//путь к входному файлу, путь к выходному файлу
  2.         {
  3.             try
  4.             {
  5.                 using (FileStream inFile = new FileStream(inFileName, FileMode.Open))//инициализация входного файла
  6.                 {
  7.                     using (FileStream outFile = new FileStream(outFileName, FileMode.Create, FileAccess.Write))//инициализация выходного файла
  8.                     {
  9.                         //
  10.                         // ПРИ РАБОТЕ С КОНСОЛЬЮ WINDOWS
  11.                         // ОБЯЗАТЕЛЬНО УКАЗЫВАЕМ ПОЛНЫЙ ПУТЬ И РАСШИРЕНИЕ ДЛЯ ВХОДНЫХ И ВЫХОДНЫХ ФАЙЛОВ!!!!
  12.                         //
  13.                         using (GZipStream inGZip = new GZipStream(outFile, CompressionMode.Compress))//буферный поток сжатия
  14.                         {
  15.                             int i = 0, j = 0;
  16.                             int[] read = new int[multithread];
  17.                             byte[] buffer = new byte[BufferSize];
  18.                             Thread[] thread = new Thread[multithread];
  19.                             Thread[] thread_ = new Thread[multithread];
  20.                             var mem = new MemoryStream();
  21.                             while ((inFile.Length - inFile.Position) > BufferSize)
  22.                             {
  23.                                 for (j = 0; (j < multithread) && ((inFile.Length - inFile.Position) > BufferSize); j++)
  24.                                 {
  25.                                     thread[j] = new Thread(() =>
  26.                                     {
  27.                                         read[j] = inFile.Read(buffer, 0, BufferSize);
  28.                                         Console.Write("- {0} -", j);
  29.                                     });
  30.                                     thread[j].Start();
  31.                                     thread[j].Join();
  32.  
  33.                                     thread_[j] = new Thread(() =>
  34.                                     {
  35.                                         inGZip.Write(buffer,0, read[j]);
  36.                                         Console.Write("|");
  37.                                    //     Thread.Sleep(1100);
  38.                                     });
  39.                                     thread_[j].Start();
  40.                                     thread_[j].Join();
  41.  
  42.                                 }
  43.                                 for (i = 0; i < j; i++)
  44.                                 {
  45.                                     thread[i].Join();
  46.                                 }
  47.  
  48.                             }
  49.                             inGZip.Write(buffer, 0, inFile.Read(buffer, 0, BufferSize));
  50.                             inGZip.Close();  //!!!!!!
  51.                         }
  52.                         outFile.Close();
  53.  
  54.                     }
  55.                     inFile.Close();
  56.                     error = false;
  57.                     Console.WriteLine(" finished packing. ");
  58.                 }
  59.             }
  60.             catch (Exception ex)
  61.             {
  62.                 Console.WriteLine("ERROR: " + ex.Message);
  63.                 error = true;
  64.             }
  65.         }

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


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

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

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы