C# 在文件中查找变量?
C# Find a variable in a file?
我正在创建一个数据库,我的系统有一个小问题:我只能读取整个文件(不能读取变量),但可以将变量写入我的文件,但我需要能够编辑文件也。我可以编辑它,但我想自己编辑这些部分,而不必打开整个文件进行编辑/仅在部分中替换整个文件中的给定字符串。
我想询问用户他们要更改文件中的哪个部分,但我的脚本更改了给整个文件的所有字符串。
这就是我想要的:
select file -->select section/line to edit -->input data -->Save data
to line
文件如下所示:
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();
实际上那是不可能的。文件是保存在磁盘中的 inode
的顺序块。这是一个巨大的 linked list
结构。除非您获取并检查前一个节点,否则您无法找到下一个节点。
所以这意味着您不能只替换文件中的特殊位置。您必须至少读取一次文件直到该位置才能找到该位置。
对于你的情况,我认为最好的选择是 -
- 保留具有所有可更新属性的对象。
- 获取输入并更新该对象的 属性
- 最后完成后,将对象数据写入文件。所以无论做了什么改变,它都会自动反映在文件中..
这样您就可以跟踪更改的项目。
但是无论如何,每次在中间更改某些内容时,您都必须编写完整的文件。
如果您不介意引入 Microsoft.VisualBasic
程序集,您可以通过随机文件访问获得您想要的内容:
https://msdn.microsoft.com/en-us/library/aa711474(v=vs.71).aspx
MSDN link中描述的文件操作(如FileOpen
)在您引用C#程序集后FileSystem
class中。 -- 即 FileSystem.FileOpen()
我正在创建一个数据库,我的系统有一个小问题:我只能读取整个文件(不能读取变量),但可以将变量写入我的文件,但我需要能够编辑文件也。我可以编辑它,但我想自己编辑这些部分,而不必打开整个文件进行编辑/仅在部分中替换整个文件中的给定字符串。
我想询问用户他们要更改文件中的哪个部分,但我的脚本更改了给整个文件的所有字符串。
这就是我想要的:
select file -->select section/line to edit -->input data -->Save data to line
文件如下所示:
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();
实际上那是不可能的。文件是保存在磁盘中的 inode
的顺序块。这是一个巨大的 linked list
结构。除非您获取并检查前一个节点,否则您无法找到下一个节点。
所以这意味着您不能只替换文件中的特殊位置。您必须至少读取一次文件直到该位置才能找到该位置。
对于你的情况,我认为最好的选择是 -
- 保留具有所有可更新属性的对象。
- 获取输入并更新该对象的 属性
- 最后完成后,将对象数据写入文件。所以无论做了什么改变,它都会自动反映在文件中..
这样您就可以跟踪更改的项目。
但是无论如何,每次在中间更改某些内容时,您都必须编写完整的文件。
如果您不介意引入 Microsoft.VisualBasic
程序集,您可以通过随机文件访问获得您想要的内容:
https://msdn.microsoft.com/en-us/library/aa711474(v=vs.71).aspx
MSDN link中描述的文件操作(如FileOpen
)在您引用C#程序集后FileSystem
class中。 -- 即 FileSystem.FileOpen()