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

时间:2015-10-01 05:39:47

标签: c# system.io.file

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

示例输出:

Nike 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.");
        }
    }

3 个答案:

答案 0 :(得分:2)

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

此外,您可以将数组转换为列表,并使用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只接受数组作为第二个参数。

答案 1 :(得分:2)

你可以用linq做到这一点。

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

答案 2 :(得分:1)

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

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());