使用 Sytem.IO 删除文本文件中的特定行

Delete specific line in a text file , using Sytem.IO

我遇到了一个问题,删除文本列表,而不删除保存在文件中的所有文本,如果我搜索 1,则 1 中带有的行将被删除,而另一行不会被删除受影响的是示例输出..

示例输出:

耐克 SB 8000 1

勒布朗 7 9000 2

这是我的代码:

private void btnDelete_Click(object sender, EventArgs e)
    {

        try
        {
            string[] InventoryData = File.ReadAllLines("Inventory.txt");
            for (int i = 0; i < InventoryData.Length; i++)
            {
                if (InventoryData[i] == txtSearch.Text)
                {
                        System.IO.File.Delete("Inventory.txt");            
                }

            }

        }
        catch
        {
            MessageBox.Show("File or path not found or invalid.");
        }
    }

无法编辑磁盘内文本文件的内容。你必须再次覆盖文件。

您也可以将数组转换为列表并使用 List(T).Remove 方法从中删除第一个匹配项。

string[] inventoryData = File.ReadAllLines("Inventory.txt");
List<string> inventoryDataList = inventoryData.ToList();

if (inventoryDataList.Remove(txtSearch.Text)) // rewrite file if one item was found and deleted.
{
    System.IO.File.WriteAllLines("Inventory.txt", inventoryDataList.ToArray());
}

如果您想在一次搜索中删除所有项目,请使用 List<T>.RemoveAll 方法。

if(inventoryDataList.RemoveAll(str => str == txtSearch.Text) > 0) // this will remove all matches.

编辑: 对于较旧的 .Net Framework 版本(3.5 及更低版本),您必须调用 ToArray() 因为 WriteAllLines 仅将数组作为第二个参数。

你完全做错了,而是从集合中删除该行并写下

List<string> InventoryData = File.ReadAllLines("Inventory.txt").ToList();            

for (int i = 0; i < InventoryData.Count; i++)
{
    if (InventoryData[i] == txtSearch.Text)
    {
        InventoryData.RemoveAt(i);
        break;            
    }
}

System.IO.File.WriteAllLines("Inventory.txt", InventoryData.AsEnumerable());

您可以使用 linq 轻松做到这一点。

lines = File.ReadAllLines("Inventory.txt").Where(x => !x.Equals(txtSearch.Text));
File.WriteAllLines("Inventory.txt", lines);