Advertisement
kot025

INDEX Wed

Mar 19th, 2015
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 49.47 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. using System.Runtime.Serialization.Formatters.Binary;
  8.  
  9.  
  10. namespace ConsoleApplication2
  11. {
  12.     [Serializable]
  13.     public struct Person
  14.     {
  15.         public bool active;
  16.         public string name;
  17.         public int year;
  18.         public int rank;
  19.         public Person(bool _active, string _name, int _year, int _rank)
  20.         {
  21.             active = _active;
  22.             name = _name;
  23.             year = _year;
  24.             rank = _rank;
  25.         }
  26.         public void Show()
  27.         {
  28.             //if (active)
  29.             //{
  30.             Console.WriteLine("{0,-40} {1,5} {2,3}", name, year, rank);
  31.             //}
  32.         }
  33.     }
  34.     [Serializable]
  35.     public struct IndexEntry
  36.     {
  37.         public string key;
  38.         public int length;
  39.         public int offset;
  40.         public IndexEntry(string _key, int _length, int _offset)
  41.         {
  42.             key = _key;
  43.             length = _length;
  44.             offset = _offset;
  45.         }
  46.         public void Show()
  47.         {
  48.             Console.WriteLine("{0,-40} {1} {2}", key, length, offset);
  49.         }
  50.     }
  51.     class Program
  52.     {
  53.         static string dbPath;
  54.         static string indexPath;
  55.         static IndexEntry[] AddIndexEntryToArray(IndexEntry[] array, IndexEntry entryToAdd)
  56.         {
  57.             var newArray = new IndexEntry[array.Length + 1];
  58.             int i = 0;
  59.             for (i = 0; i < array.Length; i++)
  60.             {
  61.                 newArray[i] = array[i];
  62.             }
  63.             newArray[i] = entryToAdd;
  64.             return newArray;
  65.         }
  66.         static Person[] AddPersonToArray(Person[] array, Person personToAdd)
  67.         {
  68.             var newArray = new Person[array.Length + 1];
  69.             int i = 0;
  70.             for (i = 0; i < array.Length; i++)
  71.             {
  72.                 newArray[i] = array[i];
  73.             }
  74.             newArray[i] = personToAdd;
  75.             return newArray;
  76.         }
  77.         static void AddToEndOfFile(Person person)                               // добавить переданную запись в конец БД
  78.         {
  79.             var formatter = new BinaryFormatter();
  80.             var memoryStream = new MemoryStream();
  81.             var fs = new FileStream(dbPath, FileMode.OpenOrCreate, FileAccess.Write); // добавление записи в файл
  82.             fs.Seek(0, SeekOrigin.End);
  83.             BinaryWriter bw = new BinaryWriter(fs);
  84.             byte[] data = new byte[255];                // массив байтов под сериализованную запись (решение проблемы с размером)
  85.             formatter.Serialize(memoryStream, person);
  86.             memoryStream.Position = 0;
  87.             data[0] = (byte)memoryStream.Length;        // в нулевую ячейку массива - количество байтов в сериализованной записи
  88.             memoryStream.Read(data, 1, (int)memoryStream.Length); // в массив с первой ячейки все из сериализованной записи из памяти
  89.             bw.Write(data);                             // запись массива байтов в конец файла
  90.             fs.Close();
  91.         }
  92.         static void AddToEndOfFile(IndexEntry entry)                            // добавить переданную запись в конец индексов
  93.         {
  94.             var formatter = new BinaryFormatter();
  95.             var memoryStream = new MemoryStream();
  96.             var fs = new FileStream(indexPath, FileMode.OpenOrCreate, FileAccess.Write); // добавление записи в файл
  97.             fs.Seek(0, SeekOrigin.End);
  98.             BinaryWriter bw = new BinaryWriter(fs);
  99.             byte[] data = new byte[255];                // массив байтов под сериализованную запись (решение проблемы с размером)
  100.             formatter.Serialize(memoryStream, entry);
  101.             memoryStream.Position = 0;
  102.             data[0] = (byte)memoryStream.Length;        // в нулевую ячейку массива - количество байтов в сериализованной записи
  103.             memoryStream.Read(data, 1, (int)memoryStream.Length); // в массив с первой ячейки все из сериализованной записи из памяти
  104.             bw.Write(data);                             // запись массива байтов в конец файла
  105.             fs.Close();
  106.         }
  107.         static void AddToIndexes(IndexEntry entry)
  108.         {
  109.             var fs = new FileStream(dbPath, FileMode.Open, FileAccess.Read);
  110.             fs.Position = 0;
  111.             if ((int)fs.Length == 255)                                              // если в базе 1 запись -
  112.             {
  113.                 AddToEndOfFile(entry);                                              // пишем в конец индексов;
  114.             }
  115.             else                                                                    // если больше одной  -
  116.             {
  117.                 bool done = false;
  118.                 var entryArray = new IndexEntry[(int)fs.Length / 255];
  119.                 int counter = 0;
  120.                 int i = 0;
  121.                 while (i < fs.Length / 255 - 1)
  122.                 {
  123.                     IndexEntry ejected = EjectEntry(i);
  124.                     int comp = ejected.key.CompareTo(entry.key);                // ej<en= -1 ej=en =0 ej>en=1
  125.                     if (comp == -1 || comp == 0)                                             // ФИО извлеченной записи < ФИО введенной                            
  126.                     {
  127.                         entryArray[counter++] = ejected;
  128.                     }
  129.                     else
  130.                     {
  131.                         if (!done)
  132.                         {
  133.                             entryArray[counter++] = entry;
  134.                             done = true;
  135.                         }
  136.                         entryArray[counter++] = ejected;
  137.                     }
  138.                     i++;
  139.                 }
  140.                 if (!done)
  141.                 {
  142.                     entryArray[counter] = entry;
  143.                 }
  144.  
  145.                 UpdateIndex(entryArray);
  146.             }
  147.             fs.Close();
  148.         }
  149.         static int[] AddToIntArray(int[] array, int toAdd)
  150.         {
  151.             int i = 0;
  152.             int[] newArray = new int[array.Length + 1];
  153.             for (i = 0; i < array.Length; i++)
  154.             {
  155.                 newArray[i] = array[i];
  156.             }
  157.             newArray[i] = toAdd;
  158.             return newArray;
  159.         }
  160.         static byte[] ArrayOfSerialized(Person person)                          // этот массив нужно будет писать в файл БД
  161.         {
  162.             var formatter = new BinaryFormatter();
  163.             var memoryStream = new MemoryStream();
  164.             byte[] data = new byte[255];                            // массив байтов под сериализованную запись (решение проблемы с размером)
  165.             formatter.Serialize(memoryStream, person);
  166.             memoryStream.Position = 0;
  167.             data[0] = (byte)memoryStream.Length;                    // в нулевую ячейку массива - количество байтов в сериализованной записи
  168.             memoryStream.Read(data, 1, (int)memoryStream.Length);   // в массив с первой ячейки все из сериализованной записи из памяти
  169.             return data;                                                    // этот массив нужно будет писать в файл
  170.         }
  171.         static IndexEntry[] ArrayOfEntries()
  172.         {
  173.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  174.             var array = new IndexEntry[fs.Length / 255];
  175.             for (int i = 0; i < fs.Length / 255; i++)
  176.             {
  177.                 array[i] = EjectEntry(i);
  178.             }
  179.             fs.Close();
  180.             return (array);
  181.         }
  182.         static int AskForAction(int qtyOfActions)                               // запросить команду меню с проверкой вводимых значений
  183.         {
  184.             int act;
  185.             bool ok;
  186.             Console.WriteLine();
  187.             do
  188.             {
  189.                 Console.Write("Команда: ");
  190.                 string buf = Console.ReadLine();
  191.                 ok = int.TryParse(buf, out act) && act > 0 && act <= qtyOfActions;
  192.                 if (!ok)
  193.                     RedLn("Доступны команды 1 - " + qtyOfActions + ".");
  194.             } while (!ok);
  195.             Console.WriteLine();
  196.             return act;
  197.         }
  198.         static Person AskForNewPerson()                                         // запросить нового участника, создать и вернуть запись
  199.         {
  200.             Console.Clear();
  201.             string name;
  202.             int year, rank;
  203.             bool ok;
  204.             Console.Write("ФИО: ");                         // ввод ФИО
  205.             name = Console.ReadLine();
  206.             int tempParse;
  207.             do                                              // ввод года
  208.             {
  209.                 Console.Write("Год рождения: ");
  210.                 string buf = Console.ReadLine();
  211.                 ok = int.TryParse(buf, out tempParse) && tempParse > 1900 && tempParse < 2015;
  212.                 if (!ok)
  213.                 {
  214.                     RedLn("Ошибка.");
  215.                     Console.WriteLine("Убедитесь в правильности введенного года рождения и повторите ввод.\n");
  216.                 }
  217.             } while (!ok);
  218.             year = tempParse;
  219.             do                                              // ввод разряда
  220.             {
  221.                 Console.Write("Текущий разряд: ");
  222.                 string buf = Console.ReadLine();
  223.                 ok = int.TryParse(buf, out tempParse) && tempParse >= 0 && tempParse < 10;
  224.                 if (!ok)
  225.                 {
  226.                     RedLn("Ошибка.");
  227.                     Console.WriteLine("Убедитесь в правильности введенного разряда и повторите ввод.\n");
  228.                 }
  229.             } while (!ok);
  230.             rank = tempParse;
  231.             return new Person(true, name, year, rank);      // конец ввода данных и возврат записи
  232.         }
  233.         static void ChangePerson(int number, Person person)
  234.         {
  235.             var formatter = new BinaryFormatter();
  236.             var memoryStream = new MemoryStream();
  237.             var fs = new FileStream(dbPath, FileMode.Open, FileAccess.Write); // добавление записи в файл
  238.             fs.Position = number * 255;
  239.             BinaryWriter bw = new BinaryWriter(fs);
  240.             byte[] data = new byte[255];                // массив байтов под сериализованную запись (решение проблемы с размером)
  241.             formatter.Serialize(memoryStream, person);
  242.             memoryStream.Position = 0;
  243.             data[0] = (byte)memoryStream.Length;        // в нулевую ячейку массива - количество байтов в сериализованной записи
  244.             memoryStream.Read(data, 1, (int)memoryStream.Length); // в массив с первой ячейки все из сериализованной записи из памяти
  245.             bw.Write(data);                             // запись массива байтов в конец файла
  246.             fs.Close();
  247.         }
  248.         static void ChangeIndex(int number, IndexEntry entry)
  249.         {
  250.             var formatter = new BinaryFormatter();
  251.             var memoryStream = new MemoryStream();
  252.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Write); // добавление записи в файл
  253.             fs.Position = number * 255;
  254.             BinaryWriter bw = new BinaryWriter(fs);
  255.             byte[] data = new byte[255];                // массив байтов под сериализованную запись (решение проблемы с размером)
  256.             formatter.Serialize(memoryStream, entry);
  257.             memoryStream.Position = 0;
  258.             data[0] = (byte)memoryStream.Length;        // в нулевую ячейку массива - количество байтов в сериализованной записи
  259.             memoryStream.Read(data, 1, (int)memoryStream.Length); // в массив с первой ячейки все из сериализованной записи из памяти
  260.             bw.Write(data);                             // запись массива байтов в конец файла
  261.             fs.Close();
  262.         }
  263.         static bool CheckSize(string path1, string path2)
  264.         {
  265.             var fs = new FileStream(path1, FileMode.Open, FileAccess.Read);
  266.             int size1 = (int)fs.Length;
  267.             fs.Close();
  268.             fs = new FileStream(path2, FileMode.Open, FileAccess.Read);
  269.             bool ok = (int)fs.Length == size1;
  270.             fs.Close();
  271.             return ok;
  272.         }
  273.         static Person EjectPerson(int i)                                        // извлечь указанную запись
  274.         {
  275.             var formatter = new BinaryFormatter();
  276.             var fs = new FileStream(dbPath, FileMode.Open, FileAccess.Read);
  277.             var memoryStream = new MemoryStream();
  278.             fs.Position = i * 255;
  279.             var data = new byte[255];                                       // объявить массив под сериализованную запись
  280.             fs.Read(data, 0, 255);                                          // считать в массив всю запись
  281.             memoryStream.Write(data, 1, data[0]);                           // значимые байты записи - в ОЗУ
  282.             memoryStream.Position = 0;
  283.             Person person = (Person)formatter.Deserialize(memoryStream);    // десериализовать запись из байтов записи
  284.             fs.Close();
  285.             return person;                                                  // вернуть запись
  286.         }
  287.         static IndexEntry EjectEntry(int i)                                     // извлечь указанную запись  
  288.         {
  289.             var formatter = new BinaryFormatter();
  290.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  291.             var memoryStream = new MemoryStream();
  292.             fs.Position = i * 255;
  293.             var data = new byte[255];                                       // объявить массив под сериализованную запись
  294.             fs.Read(data, 0, 255);                                          // считать в массив всю запись
  295.             memoryStream.Write(data, 1, data[0]);                           // значимые байты записи - в ОЗУ
  296.             memoryStream.Position = 0;
  297.             IndexEntry entry = (IndexEntry)formatter.Deserialize(memoryStream);    // десериализовать запись из байтов записи
  298.             fs.Close();
  299.             return entry;                                                  // вернуть запись
  300.         }
  301.         static IndexEntry[] FindEntriesWithRequestedKeys(string request)        // создает массив найденных по ключу-ФИО записей индексов либо возврящает нулевую ссылку
  302.         {
  303.             IndexEntry[] array = new IndexEntry[0];
  304.             int position = PositionOfFirstAskedEntry(ArrayOfEntries(), request);
  305.             IndexEntry entry;
  306.             Person person = new Person();
  307.             if (position != -1)
  308.             {
  309.                 entry = EjectEntry(position);
  310.                 person = EjectPerson(entry.offset / 255);
  311.             }
  312.  
  313.             if (position != -1 && person.active)
  314.             {
  315.                 int currentEjectNumber = position;
  316.                 while (NextEntryOK(currentEjectNumber - 1, request))
  317.                 {
  318.                     array = AddIndexEntryToArray(array, EjectEntry(currentEjectNumber++));
  319.                 }
  320.                 return array;
  321.             }
  322.             else
  323.             {
  324.                 return null;
  325.             }
  326.         }
  327.         static IndexEntry[] FindEntriesWithRequestedKeys(string request, ref int[] positionsArray)                // создает массив найденных по ключу-ФИО записей индексов либо возврящает нулевую ссылку
  328.         {
  329.             positionsArray = new int[0];
  330.             IndexEntry[] array = new IndexEntry[0];
  331.             int position = PositionOfFirstAskedEntry(ArrayOfEntries(), request);
  332.             IndexEntry entry;
  333.             Person person = new Person();
  334.             if (position != -1)
  335.             {
  336.                 entry = EjectEntry(position);
  337.  
  338.                 person = EjectPerson(entry.offset / 255);
  339.             }
  340.  
  341.             if (position != -1 && person.active)
  342.             {
  343.                 int currentEjectNumber = position;
  344.                 while (NextEntryOK(currentEjectNumber - 1, request))
  345.                 {
  346.                     array = AddIndexEntryToArray(array, EjectEntry(currentEjectNumber));
  347.                     positionsArray = AddToIntArray(positionsArray, currentEjectNumber++);
  348.                 }
  349.                 return array;
  350.             }
  351.             else
  352.             {
  353.                 return null;
  354.             }
  355.         }
  356.         static void KillDeleted(int[] arrayOfPositions)
  357.         {
  358.  
  359.         }
  360.         static bool NextEntryOK(int entryNumber, string request)
  361.         {
  362.             bool flag = false;
  363.             var formatter = new BinaryFormatter();
  364.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  365.             flag = (entryNumber + 1 != fs.Length / 255) && (EjectEntry(entryNumber + 1).key == request) && (EjectPerson(EjectEntry(entryNumber + 1).offset / 255).active == true);
  366.             fs.Close();
  367.             return flag;
  368.         }
  369.         static IndexEntry[] MarkedDeleted(ref int[] positionsArray)                                     // создает массив индексов удаленных записей
  370.         {
  371.             positionsArray = new int[0];
  372.             IndexEntry[] array = new IndexEntry[0];
  373.             var entry = new IndexEntry();
  374.             var person = new Person();
  375.             var fs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  376.             int size = (int)fs.Length / 255;
  377.             fs.Close();
  378.             for (int i = 0; i < size; i++)
  379.             {
  380.                 entry = EjectEntry(i);
  381.                 int number = entry.offset / 255;
  382.                 person = EjectPerson(number);
  383.                 if (!person.active)
  384.                 {
  385.                     array = AddIndexEntryToArray(array, entry);
  386.                     positionsArray = AddToIntArray(positionsArray, i);
  387.                 }
  388.             }
  389.             if (array.Length != 0)
  390.             {
  391.                 return array;
  392.             }
  393.             else
  394.             {
  395.                 return null;
  396.             }
  397.         }
  398.         static void ListAllRecords() // вывести все записи БД
  399.         {
  400.             Console.Clear();
  401.             var formatter = new BinaryFormatter();
  402.             var fs = new FileStream(dbPath, FileMode.Open, FileAccess.Read);
  403.             bool unmarkedPersonExists = false;
  404.             for (int i = 0; i < fs.Length / 255; i++)
  405.             {
  406.                 unmarkedPersonExists = unmarkedPersonExists | EjectPerson(i).active;
  407.             }
  408.             if (unmarkedPersonExists)
  409.             {
  410.                 Console.WriteLine("{0,-42} {1,5} {2,9}", "№  ФИО", "Год", "Разряд");
  411.                 var ifs = new FileStream(indexPath, FileMode.Open, FileAccess.Read);
  412.                 int counter = 0;
  413.                 for (int i = 0; i < ifs.Length / 255; i++)
  414.                 {
  415.                     var memoryStream = new MemoryStream();
  416.                     var data = new byte[255];                                               // объявить массив под сериализованную запись
  417.                     ifs.Read(data, 0, 255);                                                 // считать в массив всю запись
  418.                     memoryStream.Write(data, 1, data[0]);                                   // значимые байты записи - в ОЗУ
  419.                     memoryStream.Position = 0;
  420.                     IndexEntry entry = (IndexEntry)formatter.Deserialize(memoryStream);
  421.                     memoryStream = new MemoryStream();
  422.                     data = new byte[255];                                                   // объявить массив под сериализованную запись
  423.                     fs.Position = entry.offset;
  424.                     fs.Read(data, 0, 255);                                                  // считать в массив всю запись
  425.                     memoryStream.Write(data, 1, data[0]);                                   // значимые байты записи - в ОЗУ
  426.                     memoryStream.Position = 0;
  427.                     Person person = (Person)formatter.Deserialize(memoryStream);
  428.                     if (person.active)
  429.                     {
  430.                         Console.Write(++counter + ". ");
  431.                         person.Show();
  432.                     }
  433.                 }
  434.                 ifs.Close();
  435.             }
  436.             else
  437.             {
  438.                 Console.WriteLine("База данных пуста.\n");
  439.             }
  440.             fs.Close();
  441.  
  442.             Console.WriteLine("\nНажмите любую клавишу.");
  443.             Console.ReadKey();
  444.             Console.Clear();
  445.         }
  446.         static int ListAllDeletedRecords(ref int[] positionsArray)
  447.         {
  448.             positionsArray = new int[0];
  449.             int quantity = 0;
  450.             Console.Clear();
  451.             IndexEntry[] array = MarkedDeleted(ref positionsArray);
  452.             if (array != null)
  453.             {
  454.                 Console.WriteLine("Были удалены следующие записи:\n");
  455.                 Console.WriteLine("{0,-42} {1,5} {2,8}", "№  ФИО", "Год", "Разряд");
  456.                 for (int i = 0; i < array.Length; i++)
  457.                 {
  458.                     Console.Write(i + 1 + ". ");
  459.                     EjectPerson(array[i].offset / 255).Show();
  460.                     quantity++;
  461.                 }
  462.  
  463.             }
  464.             else
  465.             {
  466.                 Console.WriteLine("Ни одной записи не было удалено либо записи были удалены безвозвратно.\n");
  467.             }
  468.             return quantity;
  469.         }
  470.         static int PositionOfFirstAskedEntry(IndexEntry[] array, string key)    // бинарный поиск первого вхождения записи с запрошенным полем в БД
  471.         {
  472.             int left = 0, right = array.Length - 1;
  473.             int middle;
  474.             do
  475.             {
  476.                 middle = (left + right) / 2;
  477.                 if (array[middle].key.CompareTo(key) == -1)
  478.                 {
  479.                     left = middle + 1;
  480.                 }
  481.                 else
  482.                 {
  483.                     right = middle;
  484.                 }
  485.             } while (left != right);
  486.             if (array[left].key == key)
  487.             {
  488.                 return left;
  489.             }
  490.             return (-1);
  491.         }
  492.         static void RearrangeIndexWith(int positionOfOld, IndexEntry newEntry)
  493.         {
  494.  
  495.             IndexEntry[] oldArray;
  496.             oldArray = ArrayOfEntries();
  497.             IndexEntry[] newArray = new IndexEntry[oldArray.Length - 1];
  498.             int counter = 0;
  499.             for (int i = 0; i < oldArray.Length; i++)
  500.             {
  501.                 if (i != positionOfOld)
  502.                 {
  503.                     newArray[counter] = oldArray[i];
  504.                     counter++;
  505.                 }
  506.             }
  507.             UpdateIndex(newArray);
  508.             AddToIndexes(newEntry);
  509.         }
  510.         public static void RedLn(string str)                                    // вывести переданную строку красным цветом
  511.         {
  512.             Console.ForegroundColor = ConsoleColor.Red;
  513.             Console.WriteLine(str);
  514.             Console.ResetColor();
  515.         }
  516.         static void UpdateIndex(IndexEntry[] entryArray)                        // обновить файл индексов
  517.         {
  518.             var fs = new FileStream(indexPath, FileMode.Truncate, FileAccess.Write);
  519.             fs.Close();
  520.             for (int i = 0; i < entryArray.Length; i++)
  521.             {
  522.                 //entryArray[i].Show();
  523.                 AddToEndOfFile(entryArray[i]); // тут можно перезаписать не весь, а только обновленную часть
  524.             }
  525.         }
  526.  
  527.         static void Main()
  528.         {
  529.             int act;
  530.             int exit = 2;
  531.             bool ok = false;
  532.             int chosenPerson;
  533.             int chosenEntry;
  534.             bool openFlag = true;
  535.             bool rewriteError = false;
  536.             string name = "";
  537.             string path = "";
  538.             string fileNotFoundName = "";
  539.             do
  540.             {
  541.                 if (!openFlag && !rewriteError)
  542.                 {
  543.                     Console.Clear();
  544.                     Console.WriteLine("\nОшибка. Файл \"{0}\" не найден.\nНажмите любую клавишу", fileNotFoundName);
  545.                     Console.ReadKey();
  546.                     Console.Clear();
  547.                 }
  548.                 openFlag = true;
  549.                 rewriteError = false;
  550.                 Console.WriteLine("1. Открыть файл");
  551.                 Console.WriteLine("2. Создать файл");
  552.                 Console.WriteLine("3. Выход");
  553.                 act = AskForAction(3);
  554.                 switch (act)
  555.                 {
  556.                     case 1:
  557.                         Console.WriteLine("Убедитесь, что файлы находился в папке ConsoleApplication3/bin/Debug\n");
  558.                         Console.Write("Введите имя файла БД: ");
  559.                         name = Console.ReadLine();
  560.                         path = Path.Combine(Environment.CurrentDirectory, name);
  561.                         if (!File.Exists(path))
  562.                         {
  563.                             fileNotFoundName = name;
  564.                             openFlag = false;
  565.                         }
  566.                         if (openFlag)
  567.                         {
  568.                             dbPath = path;
  569.                             Console.Write("Введите имя файла индексов: ");
  570.                             name = Console.ReadLine();
  571.                             path = Path.Combine(Environment.CurrentDirectory, name);
  572.                             if (!File.Exists(path))
  573.                             {
  574.                                 fileNotFoundName = name;
  575.                                 openFlag = false;
  576.                             }
  577.                             if (openFlag)
  578.                             {
  579.                                 indexPath = path;
  580.                             }
  581.                         }
  582.                         if (openFlag)
  583.                         {
  584.                             ok = CheckSize(dbPath, indexPath);
  585.                             if (!ok)
  586.                             {
  587.                                 RedLn("Ошибка. Убедитесь, что вы открываете два связанных файла");
  588.                                 Console.ReadKey();
  589.                                 Console.Clear();
  590.                             }
  591.                         }
  592.                         break;
  593.                     case 2:
  594.                         do
  595.                         {
  596.                             Console.Write("Введите имя файла БД без расширения: ");
  597.                             name = Console.ReadLine();
  598.                             ok = !name.Contains('.') && !name.Contains(',') && !name.Contains('*') && !name.Contains(':') && !name.Contains('?') && !name.Contains('!') && !name.Contains('@');
  599.                             if (!ok)
  600.                             {
  601.                                 RedLn("Имя файла не должно содержать символов .,;:?!@");
  602.                             }
  603.                         } while (!ok);
  604.                         name += ".dat";
  605.                         dbPath = Path.Combine(Environment.CurrentDirectory, name);
  606.  
  607.                         do
  608.                         {
  609.                             Console.Write("Введите имя файла индексов без расширения: ");
  610.                             name = Console.ReadLine();
  611.                             ok = !name.Contains('.') && !name.Contains(',') && !name.Contains('*') && !name.Contains(':') && !name.Contains('?') && !name.Contains('!') && !name.Contains('@');
  612.                             if (!ok)
  613.                             {
  614.                                 RedLn("Имя файла не должно содержать символов .,;:?!@");
  615.                             }
  616.                         } while (!ok);
  617.                         name += ".dat";
  618.                         indexPath = Path.Combine(Environment.CurrentDirectory, name);
  619.                         if (indexPath == dbPath)
  620.                         {
  621.                             Console.Clear();
  622.                             Console.WriteLine("\nОшибка. Вы только что перезаписали один файл другим. Так не пойдет. \n\nНажмите любую клавишу", fileNotFoundName);
  623.                             Console.ReadKey();
  624.                             Console.Clear();
  625.                             openFlag = false;
  626.                             rewriteError = true;
  627.                         }
  628.                         else
  629.                         {
  630.                             openFlag = true;
  631.                         }
  632.                         break;
  633.                 }
  634.             } while (act != 3 && !openFlag);
  635.  
  636.             if (act != 3)
  637.             {
  638.                 do
  639.                 {
  640.                     ok = false;
  641.                     IndexEntry entry;
  642.                     Person person;
  643.                     Console.Clear();
  644.                     Console.WriteLine("1. Добавить участника");
  645.                     if (File.Exists(dbPath))
  646.                     {
  647.                         Console.WriteLine("2. Вывести список всех участников");
  648.                         Console.WriteLine("3. Найти участника по ФИО");
  649.                         Console.WriteLine("4. Редактировать запись участника");
  650.                         Console.WriteLine("5. Удалить запись участника");
  651.                         Console.WriteLine("6. Показать недавно удаленных участников");
  652.                         exit = 7;
  653.                     }
  654.                     Console.WriteLine(exit + ". Выход");
  655.                     act = AskForAction(exit);
  656.                    
  657.                     switch (act)
  658.                     {
  659.                         case 1:
  660.                             person = AskForNewPerson();                                         // запрос новой записи
  661.                             //person = new Person(false, "Анна", 1995, 5);
  662.                             Console.Clear();
  663.                             var fs = new FileStream(dbPath, FileMode.OpenOrCreate, FileAccess.Read);
  664.                             int offset = (int)fs.Length;                                        // offset - номер байта, начиная с которого в файле хранится запись
  665.                             fs.Close();
  666.                             byte[] ar1 = ArrayOfSerialized(person);                             // ar1 - массив с сер. person [255]
  667.                             int length = ar1[0];                                                // length - длина сер. person
  668.                             entry = new IndexEntry(person.name, length, offset);                // entry - запись индексов
  669.                             AddToEndOfFile(person);
  670.                             AddToIndexes(entry);
  671.                             break;
  672.                         case 2:
  673.                             ListAllRecords();
  674.                             break;
  675.                         case 3:
  676.                             Console.Clear();
  677.                             Console.Write("Введите ФИО для поиска: ");
  678.                             string request = Console.ReadLine();
  679.                             var arrayOfFoundEntries = FindEntriesWithRequestedKeys(request);
  680.                             if (arrayOfFoundEntries == null)
  681.                             {
  682.                                 Console.Clear();
  683.                                 Console.WriteLine("По запросу \"{0}\" ни одной записи не найдено.", request);
  684.                                 Console.WriteLine("\nНажмите любую клавишу.");
  685.                                 Console.ReadKey();
  686.                                 Console.Clear();
  687.                             }
  688.                             else
  689.                             {
  690.                                 Console.Clear();
  691.                                 Console.WriteLine("По запросу \"{0}\" найдены записи:\n", request);
  692.                                 Console.WriteLine("{0,-42} {1,5} {2,9}", "№  ФИО", "Год", "Разряд");
  693.                                 for (int i = 0; i < arrayOfFoundEntries.Length; i++)
  694.                                 {
  695.                                     Console.Write(i + 1 + ". ");
  696.                                     EjectPerson(arrayOfFoundEntries[i].offset / 255).Show();
  697.                                 }
  698.                                 Console.WriteLine("\nНажмите любую клавишу.");
  699.                                 Console.ReadKey();
  700.                                 Console.Clear();
  701.                             }
  702.                             break;
  703.                         case 4:
  704.                             Console.Clear();
  705.                             Console.Write("Редактировать участника с ФИО: ");
  706.                             string key1 = Console.ReadLine();
  707.                             int[] arrayOfPositions = new int[0];
  708.                             IndexEntry[] array1 = FindEntriesWithRequestedKeys(key1, ref arrayOfPositions);
  709.                             if (array1 == null)
  710.                             {
  711.                                 Console.Clear();
  712.                                 Console.WriteLine("По запросу \"{0}\" ни одной записи не найдено.", key1);
  713.                                 Console.WriteLine("\nНажмите любую клавишу.");
  714.                                 Console.ReadKey();
  715.                                 Console.Clear();
  716.                             }
  717.                             else
  718.                             {
  719.                                 Console.Clear();
  720.                                 Console.WriteLine("По запросу \"{0}\" найдены записи:\n", key1);
  721.                                 Console.WriteLine("{0,-42} {1,5} {2,9}", "№  ФИО", "Год", "Разряд");
  722.                                 for (int i = 0; i < array1.Length; i++)
  723.                                 {
  724.                                     Console.Write(i + 1 + ". ");
  725.                                     EjectPerson(array1[i].offset / 255).Show();
  726.                                 }
  727.                                 do
  728.                                 {
  729.                                     Console.Write("\nРедактировать запись № ");
  730.                                     string buf = Console.ReadLine();
  731.                                     ok = int.TryParse(buf, out chosenPerson) && chosenPerson > 0 && chosenPerson <= array1.Length;
  732.                                     if (!ok)
  733.                                     {
  734.                                         RedLn("Ошибка.");
  735.                                         Console.WriteLine("Ожидалось число {0}-{1}.", 1, array1.Length);
  736.                                     }
  737.                                 } while (!ok);
  738.                                 chosenEntry = arrayOfPositions[chosenPerson - 1];                   // получаем положение удаляемой записи в индексах(порядковый номер в файле)
  739.                                 chosenPerson = array1[chosenPerson - 1].offset / 255;               // получаем номер удаляемой записи в БД (порядковый номер в файле)
  740.                                 //Console.WriteLine("Alert 616 - " + chosenEntry + chosenPerson);
  741.                                 int action = 0;
  742.                                 Person personToEdit;
  743.                                 IndexEntry entryToEdit;
  744.                                 do
  745.                                 {
  746.                                     Console.Clear();
  747.                                     string newData;
  748.                                     personToEdit = EjectPerson(chosenPerson);
  749.                                     entryToEdit = EjectEntry(chosenEntry);
  750.                                     Console.WriteLine("1. Изменить ФИО ({0})\n2. Изменить год рождения ({1})\n3. Изменить разряд ({2})\n4. В меню\n", personToEdit.name, personToEdit.year, personToEdit.rank);
  751.                                     action = AskForAction(4);
  752.                                     switch (action)
  753.                                     {
  754.                                         case 1:
  755.                                             Console.Clear();
  756.                                             Console.WriteLine("Старые данные: {0}", personToEdit.name);
  757.                                             Console.Write("Новые данные: ");
  758.                                             newData = Console.ReadLine();
  759.                                             personToEdit.name = newData;
  760.                                             entryToEdit.key = newData;
  761.                                             ChangePerson(chosenPerson, personToEdit);
  762.                                             RearrangeIndexWith(chosenEntry, entryToEdit);
  763.                                             //ChangeIndex(chosenEntry, entryToEdit);
  764.                                             Console.WriteLine("\nЗапись изменена. Нажмите любую клавишу.");
  765.                                             Console.ReadKey();
  766.                                             Console.Clear();
  767.                                             break;
  768.                                         case 2:
  769.                                             int newYear;
  770.                                             Console.Clear();
  771.                                             Console.WriteLine("Старые данные: {0}", personToEdit.name);
  772.                                             do
  773.                                             {
  774.                                                 Console.Write("Новые данные: ");
  775.                                                 newData = Console.ReadLine();
  776.                                                 ok = int.TryParse(newData, out newYear) && newYear > 1900 && newYear < 2015;
  777.                                                 if (!ok)
  778.                                                 {
  779.                                                     RedLn("Ошибка.");
  780.                                                     Console.WriteLine("Убедитесь в правильности введенного года и повторите ввод.\n");
  781.                                                 }
  782.                                             } while (!ok);
  783.                                             personToEdit.year = newYear;
  784.                                             ChangePerson(chosenPerson, personToEdit);
  785.                                             Console.WriteLine("\nЗапись изменена. Нажмите любую клавишу.");
  786.                                             Console.ReadKey();
  787.                                             Console.Clear();
  788.                                             break;
  789.                                         case 3:
  790.                                             Console.Clear();
  791.                                             Console.WriteLine("Старые данные: {0}", personToEdit.name);
  792.                                             do
  793.                                             {
  794.                                                 Console.Write("Новые данные: ");
  795.                                                 newData = Console.ReadLine();
  796.                                                 ok = int.TryParse(newData, out newYear) && newYear >= 0 && newYear < 10;
  797.                                                 if (!ok)
  798.                                                 {
  799.                                                     RedLn("Ошибка.");
  800.                                                     Console.WriteLine("Убедитесь в правильности введенного разряда и повторите ввод.\n");
  801.                                                 }
  802.                                             } while (!ok);
  803.                                             personToEdit.rank = newYear;
  804.                                             ChangePerson(chosenPerson, personToEdit);
  805.                                             Console.WriteLine("\nЗапись изменена. Нажмите любую клавишу.");
  806.                                             Console.ReadKey();
  807.                                             Console.Clear();
  808.                                             break;
  809.                                         case 4:
  810.                                             break;
  811.                                     }
  812.                                 } while (action != 4);
  813.                                 Console.Clear();
  814.                             }
  815.                             break;
  816.                         case 5:
  817.                             Console.Clear();
  818.                             Console.Write("Удалить участника с ФИО: ");
  819.                             string key = Console.ReadLine();
  820.                             var array = FindEntriesWithRequestedKeys(key);
  821.                             if (array == null)
  822.                             {
  823.                                 Console.Clear();
  824.                                 Console.WriteLine("По запросу \"{0}\" ни одной записи не найдено.", key);
  825.                                 Console.WriteLine("\nНажмите любую клавишу.");
  826.                                 Console.ReadKey();
  827.                                 Console.Clear();
  828.                             }
  829.                             else
  830.                             {
  831.                                 Console.Clear();
  832.                                 Console.WriteLine("По запросу \"{0}\" найдены записи:\n", key);
  833.                                 Console.WriteLine("{0,-42} {1,5} {2,9}", "№  ФИО", "Год", "Разряд");
  834.                                 for (int i = 0; i < array.Length; i++)
  835.                                 {
  836.                                     Console.Write(i + 1 + ". ");
  837.                                     EjectPerson(array[i].offset / 255).Show();
  838.                                 }
  839.                                 do
  840.                                 {
  841.                                     Console.Write("\nУдалить запись № ");
  842.                                     string buf = Console.ReadLine();
  843.                                     ok = int.TryParse(buf, out chosenPerson) && chosenPerson > 0 && chosenPerson <= array.Length;
  844.                                     if (!ok)
  845.                                     {
  846.                                         RedLn("Ошибка.");
  847.                                         Console.WriteLine("Ожидалось число {0}-{1}.", 1, array.Length);
  848.                                     }
  849.                                 } while (!ok);
  850.                                 Console.Clear();
  851.                                 chosenPerson = array[chosenPerson - 1].offset / 255; // получаем номер подлежащей удалению (пометке об удалении) записи в БД
  852.                                 Person personToMark = EjectPerson(chosenPerson);
  853.                                 personToMark.active = false;
  854.                                 ChangePerson(chosenPerson, personToMark);
  855.                                 Console.WriteLine("\nЗапись удалена. Нажмите любую клавишу.");
  856.                                 Console.ReadKey();
  857.                                 Console.Clear();
  858.                             }
  859.  
  860.                             break;
  861.                         case 6:
  862.                             arrayOfPositions = new int[0];
  863.                             IndexEntry[] arrayOfDeleted = new IndexEntry[0];
  864.                             int quantity = ListAllDeletedRecords(ref arrayOfPositions);                 // вывод удаленных записей и возврат их количества в quantity
  865.                             if (quantity > 0)
  866.                             {
  867.                                 Console.WriteLine("\n1. Очистить корзину\n2. Восстановить записи\n3. В меню");
  868.                                 int case3act = AskForAction(3);
  869.                                 switch (case3act)
  870.                                 {
  871.                                     case 1:
  872.                                         arrayOfDeleted = MarkedDeleted(ref arrayOfPositions);
  873.                                         KillDeleted(arrayOfPositions);
  874.                                         break;
  875.                                     case 2:
  876.                                         arrayOfDeleted = MarkedDeleted(ref arrayOfPositions);
  877.                                         do
  878.                                         {
  879.                                             Console.Write("Восстановить запись № ");
  880.                                             string buf = Console.ReadLine();
  881.                                             ok = int.TryParse(buf, out chosenPerson) && chosenPerson > 0 && chosenPerson <= arrayOfDeleted.Length;
  882.                                             if (!ok)
  883.                                             {
  884.                                                 RedLn("Ошибка.");
  885.                                                 Console.WriteLine("Ожидалось число {0}-{1}.\n", 1, arrayOfDeleted.Length);
  886.                                             }
  887.                                         } while (!ok);
  888.                                         int number = arrayOfDeleted[chosenPerson - 1].offset / 255;
  889.                                         person = EjectPerson(number);
  890.                                         person.active = true;
  891.                                         ChangePerson(number, person);
  892.                                         Console.Clear();
  893.                                         Console.Write("\nЗапись восстановлена. Нажмите любую клавишу.");
  894.                                         Console.ReadKey();
  895.                                         Console.Clear();
  896.                                         break;
  897.                                     case 3:
  898.                                         Console.Clear();
  899.                                         break;
  900.                                 }
  901.                             }
  902.                             else
  903.                             {
  904.                                 Console.WriteLine("\nНажмите любую клавишу.");
  905.                                 Console.ReadKey();
  906.                                 Console.Clear();
  907.                             }
  908.                             break;
  909.                     }
  910.                 } while (act != exit);
  911.             }
  912.         }
  913.     }
  914. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement