// main function to archivate private bool Archivate(Session session, int id, bool isPositional, bool isBlock) { var watch = new Stopwatch(); watch.Start(); var dictionary = new List <string>(); // var encodedText = new List<string>(); var encodedBuilder = new StringBuilder(); //READ file var sourceText = FileManipulator.ReadFile(openFD.FileName); if (sourceText.Contains(FieldDelimeterChar) || sourceText.Contains(ValueDelimeterChar)) { if (MessageBox.Show( text: "Файл содержит спец.символы, которые приведут к потере данных при дешифровке.\nПродолжить?", caption: "Внимание!", buttons: MessageBoxButtons.YesNo, icon: MessageBoxIcon.Error ) == DialogResult.No) { return(false); } } if (string.IsNullOrEmpty(sourceText)) { SetStatusMessage("Empty source"); return(false); } int step = isBlock ? session.ElementLength : 1; SetStatusMessage("Text spliting"); var splittedText = StringManipulator.SplitText(sourceText, step, session.ElementLength, dictionary); SetStatusMessage("Dictionary building"); List <string> encodedDictionary = isPositional ? CodeSimplifier.BuildCode(dictionary, session) : HaffmanCode.BuildCode(splittedText, dictionary, session); SetStatusMessage("Arc info building"); encodedBuilder.Append("TYPE=arc17" + FieldDelimeterChar); encodedBuilder.Append(session.IsBlock ? "1" + FieldDelimeterChar : "0" + FieldDelimeterChar); encodedBuilder.Append(session.ElementLength.ToString() + FieldDelimeterChar); for (int i = 0; i < encodedDictionary.Count; i++) { encodedBuilder.Append(dictionary[i] + ValueDelimeterChar + encodedDictionary[i] + FieldDelimeterChar); } session.InfoLength = encodedBuilder.Length; SetStatusMessage("Text encoding"); for (int m = 0; m < splittedText.Count; m++) { int index = dictionary.IndexOf(splittedText[m]); string stringCode = encodedDictionary[index]; encodedBuilder.Append(stringCode); } SetStatusMessage("Encoded file writing"); FileManipulator.WriteFile( encodedBuilder.ToString(), FileManipulator.DoFileName(openFD.FileName, id, ".arc17"), rewriteFilesToolStripMenuItem.Checked); session.SourceLength = sourceText.Length; session.DestinationLength = encodedBuilder.ToString().Length; /* * SetStatusMessage("Decoding"); * * // if (elementType is Blocks) * if (radioBlocks.Checked) * { * for (int k = 0; k < encodedText.Count; k++) * { * int index = encodedDictionary.IndexOf(encodedText[k]); * decodedText += dictionary[index]; * SetProgressValue((int)(100 * k / session.SourceLength)); * } * // fileout = Path.GetDirectoryName(openFD.FileName) + @"\decodedBlock" + openFD.SafeFileName; * * //fileout = id > 0 ? fileout.Replace(Path.GetFileNameWithoutExtension(fileout), Path.GetFileNameWithoutExtension(fileout) + id) : fileout; * FileManipulator.WriteFile(decodedText, * FileManipulator.DoFileName(openFD.FileName, id), * rewriteFilesToolStripMenuItem.Checked); * } * else //elementType is L-grams * { * decodedText += dictionary[encodedDictionary.IndexOf(encodedText[0])]; * for (int i = 1; i < encodedText.Count; i++) * { * int index = encodedDictionary.IndexOf(encodedText[i]); * string t = dictionary[index]; * t = t.Substring(session.ElementLength - 1, 1); * decodedText += t; * } * * FileManipulator.WriteFile( decodedText, * FileManipulator.DoFileName(openFD.FileName, id), * rewriteFilesToolStripMenuItem.Checked); * } */ SetStatusMessage("Finished"); SetProgressValue(0); watch.Stop(); session.TimeSpent = watch.Elapsed; return(true); }
//old sample arc + dearc private bool OldArchivate(Session session, int id) { var watch = new Stopwatch(); watch.Start(); var dictionary = new List <string>(); var encodedText = new List <string>(); var encodedBuilder = new StringBuilder(); var decodedText = string.Empty; //READ file var sourceText = FileManipulator.ReadFile(openFD.FileName); if (string.IsNullOrEmpty(sourceText)) { SetStatusMessage("Empty source"); return(false); } int step = radioBlocks.Checked ? session.ElementLength : 1; SetStatusMessage("Text spliting"); var splittedText = StringManipulator.SplitText(sourceText, step, session.ElementLength, dictionary); SetStatusMessage("Dictionary building"); List <string> encodedDictionary = radioPositional.Checked ? CodeSimplifier.BuildCode(dictionary, session) : HaffmanCode.BuildCode(splittedText, dictionary, session); SetStatusMessage("Arc info building"); encodedBuilder.Append("TYPE=arc17" + FieldDelimeterChar); encodedBuilder.Append(session.IsPositional ? "1" + FieldDelimeterChar : "0" + FieldDelimeterChar); encodedBuilder.Append(session.IsBlock ? '1' : '0'); for (int i = 0; i < encodedDictionary.Count; i++) { encodedBuilder.Append('|' + dictionary[i] + '=' + encodedDictionary[i]); } session.InfoLength = encodedBuilder.Length; SetStatusMessage("Text encoding"); for (int m = 0; m < splittedText.Count; m++) { int index = dictionary.IndexOf(splittedText[m]); string stringCode = encodedDictionary[index]; encodedText.Add(stringCode); encodedBuilder.Append(stringCode); } SetStatusMessage("Encoded file writing"); FileManipulator.WriteFile( encodedBuilder.ToString(), FileManipulator.DoFileName(openFD.FileName, id, ".arc17"), rewriteFilesToolStripMenuItem.Checked); session.SourceLength = sourceText.Length; session.DestinationLength = encodedBuilder.ToString().Length; SetStatusMessage("Decoding"); // if (elementType is Blocks) if (radioBlocks.Checked) { for (int k = 0; k < encodedText.Count; k++) { int index = encodedDictionary.IndexOf(encodedText[k]); decodedText += dictionary[index]; SetProgressValue((int)(100 * k / session.SourceLength)); } // fileout = Path.GetDirectoryName(openFD.FileName) + @"\decodedBlock" + openFD.SafeFileName; //fileout = id > 0 ? fileout.Replace(Path.GetFileNameWithoutExtension(fileout), Path.GetFileNameWithoutExtension(fileout) + id) : fileout; FileManipulator.WriteFile(decodedText, FileManipulator.DoFileName(openFD.FileName, id), rewriteFilesToolStripMenuItem.Checked); } else //elementType is L-grams { decodedText += dictionary[encodedDictionary.IndexOf(encodedText[0])]; for (int i = 1; i < encodedText.Count; i++) { int index = encodedDictionary.IndexOf(encodedText[i]); string t = dictionary[index]; t = t.Substring(session.ElementLength - 1, 1); decodedText += t; } FileManipulator.WriteFile(decodedText, FileManipulator.DoFileName(openFD.FileName, id), rewriteFilesToolStripMenuItem.Checked); } SetStatusMessage("Finished"); SetProgressValue(0); watch.Stop(); session.TimeSpent = watch.Elapsed; return(true); }