我有一個文本文件,其中包含一些我想要編輯的信息。該文件看起來是這樣的:C#更改文件中的特定行
id: 31
name: Anna
profession: Doctor
我可以讀一個StreamReader
該條目,並在我的應用程序出示。然後我希望用戶能夠更改條目的name
和profession
,所以我想將這些特定行編輯爲新值,同時保持id
完整(在我的真實代碼中,不僅有幾行,但很多行只有一些應該改變)。因此,例如,我希望在我的操作結束時將文件看起來像這樣。
id: 31
name: Emma
profession: Programmer
但是,我也必須考慮到,有時候行並不是事先存在的。例如,編輯Anna
到Emma
之前,它並不一定是她有一個行業,該文件可能是這個樣子的:
id: 31
name: Anna
而且在這種情況下,我想行profession: Programmer
添加到結束。
我嘗試使用FileStream
與ReadWrite
訪問,我給一個StreamReader
和StreamWriter
,但後來我發現沒有更改或替換文本行,只有閱讀它,寫一個相同的新線,同時保持的方式舊。
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
using (StreamReader reader = new StreamReader(fileStream))
using (StreamWriter writer = new StreamWriter(fileStream))
{
bool idExists = false;
bool nameExists = false;
bool tagsExist = false;
string line;
while((line = reader.ReadLine()) != null)
{
if (line.StartsWith("id:"))
idExists = true;
else if (line.StartsWith("name:"))
{
nameExists = true;
line = $"name: {entryToSave.Name}";
writer.WriteLine(line); // Will write an additional line and not replace
}
else if (line.StartsWith("profession:"))
{
professionExists = true;
line = $"profession: {entryToSave.Profession}";
writer.WriteLine(line); // Will write an additional line and not replace
}
}
if (!idExists)
writer.WriteLine($"id: {generatedId}");
if (!nameExists)
writer.WriteLine($"name: {entryToSave.Name}");
if (!professionExists)
writer.WriteLine($"profession: {entryToSave.Profession}");
}
我也嘗試過使用File.ReadAllLines
,遍歷行,然後寫回所有的線到該文件,僅修改將被修改的行。但是,由於某些原因我無法通過File.WriteAllLines
訪問該文件,因爲StreamWriter
可以訪問。代碼:
var previousData = File.ReadAllLines(filePath);
var newData = new List<string>();
bool idExists = false;
bool nameExists = false;
bool professionExists = false;
for (int i = 0; i < previousData.Length; i++)
{
var line = previousData[i];
if (line.StartsWith("id:")
idExists = true;
else if (line.StartsWith("name:")
{
nameExists = true;
line = $"name: {entryToSave.Name}";
}
else if (line.StartsWith("profession:"))
{
professionExists = true;
line = $"profession: {entryToSave.Profession}";
}
newData.Add(line);
}
if (!idExists)
newData.Add($"id: {generatedId}");
if (!nameExists)
newData.Add($"name: {entryToSave.Name}");
if (!professionExists)
newData.Add($"profession: {entryToSave.Profession}");
File.WriteAllLines(filePath, newData.ToArray()); // Access denied
這是如何最容易實現的,沒有文件流互相干擾?
我剛剛發現我自己現在我無法做File.WriteAllLines的原因不是文件很忙,因爲某種原因訪問被拒絕,我不知道如何解決。我會編輯我的問題。 – Helena
如果您發現我的解決方案有幫助,我會非常感激,如果您將其標記爲答案:) – CitiZen
哦,對,對不起,我忘了!會做。 – Helena