2015-12-10 5 views
1

Я создаю базу данных, и у меня есть небольшая проблема с моей системой: я могу читать только весь файл (а не переменные), но писать переменные в свой файл, но мне также нужно иметь возможность редактировать файл. Я могу отредактировать его, но я хочу редактировать разделы самостоятельно, не открывая весь файл для редактирования/замены заданных строк во всем файле только в разделах.C# Найти переменную в файле?

Я хочу спросить пользователя, какой раздел в файле они будут меняться, но мой скрипт изменяет все строки, заданные для всего файла.

так это то, как я хочу:

выберите файл -> выберите раздел/строка для редактирования -> входные данные -> Сохранить данные в линию

В файле выглядит следующим образом:

Name: Kim jr. 

Age: 1980/05/20 

Gender: Male 

Status: Single 

Weight: 46.2 Kg 

Friends: Unknown 

Notes: 
This is a dummy file, used for testing. 

Это как мой код в настоящее время:

Console.Clear(); 

string[] fileArray = Directory.GetFiles(@"C:\Nova_Files\Database"); //slecets the files in the folder 

if (fileArray.Length < 1) 
{ 
    Console.WriteLine(); 
    Console.WriteLine("There are no files in the database for deleting"); 
    Console.ReadLine(); 
} 
else 
{ 
    Console.WriteLine("Here is a list of the files in the database, please select a file to edit.\n"); 

    foreach (string name in fileArray) //shows the files in the folder. 
    { 
     Console.WriteLine(name); 
    } 

    Console.WriteLine(); 
    userValue = Console.ReadLine(); 

    string filename = userValue; 

    foreach (string x in fileArray) 
    { 
     if (x.Contains(filename)) 
     { 
      Console.WriteLine(); 
      Console.WriteLine(filename + " Was selected for editing"); 
      Console.WriteLine(); 
      Console.WriteLine("Press anykey to continue"); 
      Console.ReadLine(); 
      Console.Clear(); 
      Console.WriteLine("The current editing " + filename); 
      Console.WriteLine("The File [" + filename + "] Contains This:\n"); 

      string text = System.IO.File.ReadAllText(@"C:\Nova_Files\Database\" + filename); 

      Console.WriteLine(text); 
      Console.WriteLine(); 
      Console.WriteLine("What do you want to edit?"); 
      userValue = Console.ReadLine(); 

      string needOfEdit = userValue; 

      Console.WriteLine(); 
      Console.WriteLine("What will you replace " + needOfEdit + " With?"); 
      userValue = Console.ReadLine(); 

      string replacement = userValue; 

      File.WriteAllText(@"C:\Nova_Files\Database\" + filename, File.ReadAllText(@"C:\Nova_Files\Database\" + filename).Replace(needOfEdit, replacement)); 
      text = System.IO.File.ReadAllText(@"C:\Nova_Files\Database\" + filename); 
      Console.WriteLine(text); 
      Console.Read(); 

ответ

1

Если вы не возражаете, в результате чего в Microsoft.VisualBasic сборке, вы можете получить то, что вы ищете с помощью случайного доступа Файла:

https://msdn.microsoft.com/en-us/library/aa711474(v=vs.71).aspx

файловых операций, описанных в ссылке MSDN (например, FileOpen) находятся в классе FileSystem после ссылки на сборку на C#. - то есть FileSystem.FileOpen()

2

На самом деле это невозможно. Файлы представляют собой последовательные фрагменты inode, сохраненные на диске. Это огромная структура linked list. Вы не можете найти следующий узел, если вы не заберете и не проверите предыдущий узел.

Значит, вы не можете просто заменить специальное место в файле. Вы должны прочитать файл до этой позиции хотя бы один раз, чтобы найти эту позицию.

В вашем случае, я думаю, что лучший вариант -

  1. Держите объект со всеми свойствами, которые могут быть обновлены.
  2. Взять ввод и обновить свойство этого объекта
  3. Затем, наконец, после этого напишите эти данные объекта внутри файла. Поэтому, независимо от того, какое изменение сделано, оно автоматически отражается в файле.

Таким образом, вы можете отслеживать измененные предметы.

Но в любом случае вам придется писать полный файл каждый раз, когда вы что-то меняете в середине.

+0

Хорошо, спасибо, как бы я это сделал? я понятия не имею прямо сейчас –