Esempio n. 1
0
        //metoda uruchamiana w osobnym wątku
        private void writeModelsFromFileToDB(MyEventArgs args)
        {
            int         streamPosition       = 0;
            int         dataPacketNumber     = 0;
            int         totalNumberOfPackets = 0;           //do paska postępu
            ModelBundle modelDataBundle      = new ModelBundle();

            try
            {
                do
                {
                    //deserialize
                    using (FileStream stream = new FileStream(args.fileName, FileMode.Open))
                    {
                        int    dataPacketLength = 0;
                        byte[] buffer;
                        using (BinaryReader bReader = new BinaryReader(stream))
                        {
                            stream.Position  = streamPosition;
                            dataPacketLength = bReader.ReadInt32();        //najpierw wpis 4 bajty określa długość paczki, która po nim następuje
                            buffer           = new byte[dataPacketLength];
                            bReader.Read(buffer, 0, dataPacketLength);
                        }
                        MemoryStream compressedStream   = new MemoryStream(buffer);
                        MemoryStream decompressedStream = new MemoryStream();

                        using (GZipStream gzipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
                        {
                            gzipStream.CopyTo(decompressedStream);
                            compressedStream.Close();
                        }
                        decompressedStream.Position = 0;
                        BinaryFormatter bformatter = new BinaryFormatter();
                        modelDataBundle = (ModelBundle)bformatter.Deserialize(decompressedStream);

                        if (dataPacketNumber == 0)
                        {
                            totalNumberOfPackets = modelDataBundle.models.Count;
                            if (modelDataBundle.checkedDirectories.Count == 0 && args.selectedDirectoryId == "")
                            {
                                MyMessageBox.display("Nie można odtworzyć modeli gdyż nie wybrano katalogu docelowego \r\na modele w pliku źródłowym wczytane zostały bez katalogu.\r\nSpróbuj wczytać ponownie wybierając katalog docelowy", MessageBoxType.Error);
                                break;
                            }
                            else
                            {
                                writeModelDeclarationsToDB(args, modelDataBundle);
                            }
                        }
                        else
                        {
                            showProgress(dataPacketNumber, totalNumberOfPackets, modelDataBundle.models[0].nazwaModel.ToString());       //pasek postępu
                            writePowierzchniaToDB(modelDataBundle);
                        }
                        decompressedStream.Close();
                        streamPosition += dataPacketLength + 4;     //tj. przesuwam o nagłówek (int czyli 4 bajty) i długość właśnie przeczytanego pakietu
                        modelDataBundle.clear();
                        dataPacketNumber++;
                    }
                }while (dataPacketNumber <= totalNumberOfPackets);

                if (dataPacketNumber >= totalNumberOfPackets)       //komunikat o sukcesie tylko wtedy, gdy cała pętla przeszła
                {
                    MyMessageBox.displayAndClose("Modele wczytane", 1);
                }

                hideProgressItems();         //delegat
                refreshDirectoryTree();      //delegat
            }
            catch (ArgumentException ex)
            {
                MyMessageBox.display(ex.Message, MessageBoxType.Error);
            }
            catch (OutOfMemoryException exc)
            {
                MyMessageBox.display(exc.Message + "\r\nwriteModelsFromFileToDB", MessageBoxType.Error);
            }
            catch (EndOfStreamException exce)
            {
                MyMessageBox.display(exce.Message + "\r\nwriteModelsFromFileToDB \r\nPlik jest uszkodzony");
            }
        }