private static void CompressionFile(string sourcePath, string folderToZippedFile, bool compress = true)
        {
            const int bufferSize = 16834;

            byte[] buffer   = new byte[bufferSize];
            string destPath = Path.Combine(folderToZippedFile, Path.GetFileName(sourcePath) + ".gz");
            MyFile sourceFile;

            if (Factory.TryGetFile(sourcePath, out sourceFile))
            {
                MyFile outFile = Factory.CreateFile(destPath);
                using (Stream inFileStream = sourceFile.FileOpen(FileMode.Open, FileAccess.Read, FileShare.Read))
                    using (Stream outFileStream = outFile.FileOpen(FileMode.Create, FileAccess.Write, FileShare.Read))
                        using (GZipStream gZipStream = new GZipStream(compress ? outFileStream : inFileStream, compress ? CompressionMode.Compress : CompressionMode.Decompress))
                        {
                            Stream inStream  = compress ? inFileStream : gZipStream;
                            Stream outStream = compress ? gZipStream : outFileStream;
                            int    bytesRead = 0;
                            do
                            {
                                bytesRead = inStream.Read(buffer, 0, bufferSize);
                                outStream.Write(buffer, 0, bytesRead);
                            } while (bytesRead > 0);
                        }
            }
        }
 public override void Visit(MyFile file)
 {
     if (crypt)
     {
         using (FileStream fin = file.FileOpen(FileMode.Open, FileAccess.Read, FileShare.None))
         {
             MyFile cryptedFile = Factory.CreateFile(file.FullPath + "_crypted");
             using (FileStream fout = cryptedFile.FileOpen(FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
             {
                 fout.SetLength(0);
                 //Create variables to help with read and write.
                 byte[] bin    = new byte[100]; //This is intermediate storage for the encryption.
                 long   rdlen  = 0;             //This is the total number of bytes written.
                 long   totlen = fin.Length;    //This is the total length of the input file.
                 int    len;                    //This is the number of bytes to be written at a time.
                 DES    des = new DESCryptoServiceProvider();
                 using (CryptoStream encStream = new CryptoStream(fout, desProvider.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write))
                 {
                     //Read from the input file, then encrypt and write to the output file.
                     while (rdlen < totlen)
                     {
                         len = fin.Read(bin, 0, 100);
                         encStream.Write(bin, 0, len);
                         rdlen = rdlen + len;
                     }
                 }
             }
         }
         file.Delete();
     }
     else
     {
         bool success = true;
         using (FileStream fin = file.FileOpen(FileMode.Open, FileAccess.Read, FileShare.None))
         {
             MyFile decryptedFile;
             string pathToCryptedFile = file.FullPath;
             if (pathToCryptedFile.EndsWith("_crypted"))
             {
                 decryptedFile = Factory.CreateFile(file.FullPath.Remove(pathToCryptedFile.Length - "_crypted".Length));
             }
             else
             {
                 decryptedFile = Factory.CreateFile(pathToCryptedFile + "_decrypted");
             }
             using (FileStream fout = decryptedFile.FileOpen(FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
             {
                 fout.SetLength(0);
                 //Create variables to help with read and write.
                 byte[] bin    = new byte[100]; //This is intermediate storage for the encryption.
                 long   rdlen  = 0;             //This is the total number of bytes written.
                 long   totlen = fin.Length;    //This is the total length of the input file.
                 int    len;                    //This is the number of bytes to be written at a time.
                 DES    des = new DESCryptoServiceProvider();
                 try
                 {
                     using (CryptoStream encStream = new CryptoStream(fout, desProvider.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write))
                     {
                         //Read from the input file, then decrypt and write to the output file.
                         while (rdlen < totlen)
                         {
                             len = fin.Read(bin, 0, 100);
                             encStream.Write(bin, 0, len);
                             rdlen = rdlen + len;
                         }
                     }
                 }
                 catch (CryptographicException exc)
                 {
                     System.Windows.Forms.MessageBox.Show(exc.Message + "Неверный ключ.");
                     success = false;
                 }
                 catch (IOException ioexc)
                 {
                     System.Windows.Forms.MessageBox.Show(ioexc.Message + "Ошибка доступа.");
                 }
                 catch (Exception exc)
                 {
                     System.Windows.Forms.MessageBox.Show(exc.Message + "Неопознанная ошибка.");
                 }
             }
             if (!success)
             {
                 decryptedFile.Delete();
             }
         }
         if (success)
         {
             file.Delete();
         }
     }
 }