这里我想删除包含特定字符串的文本文件中的行,例如" 21309#003"其中item1是一个文件名,但它显示了运行时异常,即item1(文件)已在某些进程中使用。如何解决这个问题。我是.net C#中的新用户。
private void button1_Click(object sender, EventArgs e)
{
var selectedItems = listBox1.SelectedItems.Cast<String>().ToList();
foreach (var item in selectedItems)
{
listBox1.Items.Remove(item);
}
foreach (var item1 in selectedItems)
{
listBox1.Items.Remove(item1);
string line = null;
//string line_to_delete = "the line i want to delete";
using (StreamReader reader = new StreamReader(item1))
//item1= "C:\\IMP2711\\textpresent.txt"
{
using (StreamWriter writer = new StreamWriter(item1))
{
while ((line = reader.ReadLine()) != null)
{
//if (String.Compare(line, @"*21349#003*") == 0)
//if (!line.Contains("21349#003") )
if (!line.StartsWith("21349#003"))
{**strong text**
writer.WriteLine(line);
}
}
}
答案 0 :(得分:4)
您正在同时阅读和写入同一文件。
var item2 = item1;
如果文件不大,您可以将行读入内存,然后将要保留的行写回文件。我们甚至可以简化你的代码。
File.WriteAllLines(item1,
File.ReadLines(item1).Where(l => !l.StartsWith("21349#003")).ToList());
如果文件非常大,则另一个选项是写入临时文件。删除原始文件,然后重命名临时文件。
var tmp = Path.GetTempFileName();
File.WriteAllLines(tmp, File.ReadLines(item1).Where(l => !l.StartsWith("21349#003")));
File.Delete(item1);
File.Move(tmp, item1);
答案 1 :(得分:0)
如果您的文件很小,请先将其读入内存,然后尝试在其上写入,您在同一文件上有两个流,一个文件可以在多个流之间共享但是当另一个文件打开时您无法修改该文件流,如果你的文件太大而你无法移动到内存,你可以创建一个临时文件,并在读取完毕后用临时文件替换原始文件并删除临时文件时写入临时文件。
答案 2 :(得分:-2)
有一些进程锁定文件c:\imp2711\textpresent.txt
。你必须找到并杀死它。
要找到它,请参阅此问题:https://superuser.com/questions/117902/find-out-which-process-is-locking-a-file-or-folder-in-windows