public List <string> ReturnGedFormatPerson(Person person)//Возвращает строки, которые будут описывать нового человека в файле (Поля добавляются в любом случае, даже если они будут пустые, для простоты их поиска и замены информации) { List <string> newPersonDescription = new List <string>(); newPersonDescription.Add($"0 {person.Id} INDI"); newPersonDescription.Add($"1 {GedcomAttributes.PhotoPath} {person.PathPhoto}"); string current = $"1 NAME {person.FirstName} {person.Patronymic} /{person.SecondName}/"; newPersonDescription.Add(current); newPersonDescription.Add($"1 SEX {person.Gender}"); newPersonDescription.Add("1 BIRT"); newPersonDescription.Add($"2 DATE {person.DateOfBirth}"); newPersonDescription.Add($"2 PLAC {person.PlaceOfBirth}"); newPersonDescription.Add($"1 FAMC {person.Parents}"); int familyIndex = GedcomFileReader.IndexOf(FileData, $"FAM {person.Parents}"); newPersonDescription.Add("1 DEAT"); newPersonDescription.Add($"2 DATE {person.DateOfDeath}"); newPersonDescription.Add($"2 PLAC {person.PlaceOfDeath}"); int familiesCount = person.PersonFamilies.Count; for (int counter = 0; counter < familiesCount; counter++) { newPersonDescription.Add($"1 FAMS {person.PersonFamilies[counter]}"); } newPersonDescription.Add($"1 NOTE {person.Description}"); return(newPersonDescription); }
public static GedcomFileWriter OpenFile(string path) { if (!File.Exists(path)) { throw new IOException("Файла по данному пути не существует"); } GedcomFileReader.findPersonAndFamilyId(path); FileStream fileStream = new FileStream(path, FileMode.Truncate, FileAccess.Write); GedcomFileWriter openedFile = new GedcomFileWriter(fileStream); return(openedFile); }
public void AddPerson(Person newPerson) { var newGedNote = ReturnGedFormatPerson(newPerson); int insertIndex = GedcomFileReader.IndexOf(FileData, @"0 @F\d+@ FAM"); //Индекс первой семьи в файле if (insertIndex == -1) { FileData.AddRange(newGedNote); } else { FileData.InsertRange(insertIndex, newGedNote); } }
public void ChangeInfoAboutFamily(Family changedFamily) { var changedGedFamily = ReturnGedFormatFamily(changedFamily); int personIndexStart = GedcomFileReader.IndexOf(FileData, changedFamily.ID); //Индекс, где написан номер человека (самая верхняя строчка) int personIndexEnd = GedcomFileReader.IndexOf(FileData, @"^0", personIndexStart + 1); //Индекс, который больше на 1 индеса последней записи о человеке if (personIndexEnd == -1) //Если -1, то был достигнут конец файла без обнаружения совпадений, следовательно это последняя запись в файле { FileData.RemoveRange(personIndexStart, FileData.Count - personIndexStart); FileData.AddRange(changedGedFamily); } else { FileData.RemoveRange(personIndexStart, personIndexEnd - personIndexStart + 1); FileData.InsertRange(personIndexStart, changedGedFamily); } }
public void ChangeInfoAboutPerson(Person changedPerson) // ID - "@I{ID}@" (если изменения связаны с семьями, то добавление записи о семье в файл должно происходить вместе с вызовом этого метода) { int personIndexStart = GedcomFileReader.IndexOf(FileData, changedPerson.Id); //Индекс, где написан номер человека (самая верхняя строчка) int personIndexEnd = GedcomFileReader.IndexOf(FileData, @"^0", personIndexStart + 1); //Индекс, который больше на 1 индеса последней записи о человеке var changedGedPerson = ReturnGedFormatPerson(changedPerson); if (personIndexEnd == -1)//Если -1, то был достигнут конец файла без обнаружения совпадений, следовательно это последняя запись в файле { FileData.RemoveRange(personIndexStart, FileData.Count - personIndexStart); FileData.AddRange(changedGedPerson); } else { FileData.RemoveRange(personIndexStart, personIndexEnd - personIndexStart + 1); FileData.InsertRange(personIndexStart, changedGedPerson); } }
public void DeleteFamily(Family family) { if (family.ChildrenID.Count > 0) { throw new ArgumentException("В удаляемой семье не может быть детей"); } int personStartIndex = GedcomFileReader.IndexOf(FileData, family.ID); int personEndIndex = GedcomFileReader.IndexOf(FileData, @"^0", personStartIndex + 1); if (personEndIndex == -1) { FileData.RemoveRange(personStartIndex, FileData.Count - personStartIndex); } else { FileData.RemoveRange(personStartIndex, personEndIndex - personStartIndex + 1); } }
//Предполагается, что при удалении персоны все записи в семьях, где он присутствует будут удалены посредством метода ChangeInfoAboutFamily, где он просто будет не упомянут //Также предполагается, что public void DeletePerson(Person person) { if (person.PersonFamilies.Count > 0) { throw new ArgumentException("К сожалению из-за лени человека, писавшего эту программу, вы сначала должны сделать так, чтобы ни в одной семье в файле не было упоминания этого человека. I'm sorry, really"); } int personStartIndex = GedcomFileReader.IndexOf(FileData, person.Id); int personEndIndex = GedcomFileReader.IndexOf(FileData, @"^0", personStartIndex + 1); if (personEndIndex == -1) { FileData.RemoveRange(personStartIndex, FileData.Count - personStartIndex); } else { FileData.RemoveRange(personStartIndex, personEndIndex - personStartIndex + 1); } }
public void AddChild(Person child)//Предполагается, что семья уже занесена в файл { AddPerson(child); int parentsFamily = GedcomFileReader.IndexOf(FileData, $"0 {child.Parents} FAM"); if (parentsFamily == -1) { throw new ArgumentException("Каким-то образом семья родителей не была занесена в файл"); } //Если есть жена, значит в семье 2 родителя, добавляем через 3 строчки, иначе если один родитель через 2 if (FileData[parentsFamily + 2].Contains("WIFE")) { FileData.Insert(parentsFamily + 3, $"1 CHIL {child.Id}"); } else { FileData.Insert(parentsFamily + 2, $"1 CHIL {child.Id}"); } }
public GedcomFileWriter(FileStream file) { Writer = new StreamWriter(file, System.Text.Encoding.Unicode); FileData = GedcomFileReader.ReturnFIleData(file.Name); }