这是我的计划:
protected int CheckExisting(string item_id)
{
StreamReader sr = new StreamReader(@"D:\ItemID.txt");
string line = sr.ReadLine();
while (line != null)
{
if (0 == string.Compare(line, item_id))
return 1;
line = sr.ReadLine();
}
sr.Close();
return 0;
}
protected void WriteNewLog(string item_id)
{
using (StreamWriter sw = File.AppendText(@"D:\ItemID.txt"))
{
sw.WriteLine(item_id);
}
}
protected void xHandler(int num)
{
for(int i= 0; i< num; i++)
if (0 == CheckExisting(item_id))
{
WriteNewLog(item_id);
}
}
当运行程序时,会发生未处理的异常:“进程无法访问文件'D:\ ItemID.txt',因为它正由另一个进程使用。”你能帮助吗?我解决了吗?非常感谢!
答案 0 :(得分:10)
如果执行:
if (0 == string.Compare(line, item_id))
return 1;
然后你不会关闭StreamReader
。在阅读和写作时使用using
块。
此外:
bool
而不是整数来表示是/否结果Compare
并根据0
检查结果File.ReadLines
是一种更简单的阅读行CheckExisting
以xHandler
不遵循.NET命名约定CheckExisting
和WriteNewLog
方法需要受到保护而非私有i
中使用 xHandler
变量以下是我使用的实现:
const string FileName = @"D:\ItemID.txt";
private bool CheckExisting(string itemId)
{
return File.ReadLines(FileName)
.Contains(itemId);
}
private void WriteNewLog(string itemId)
{
using (TextWriter writer = File.AppendText(FileName))
{
writer.WriteLine(itemId);
}
}
// Adjust name appropriately
protected void FooHandler(int num)
{
for (int i = 0; i < num; i++)
{
// Probably use i here somewhere?
if (!CheckExisting(itemId))
{
WriteNewLog(itemId);
}
}
}
答案 1 :(得分:1)
尝试将流阅读器放入使用中,以便调用其dispose。
现在你的代码将在调用sr.Close()之前返回。
答案 2 :(得分:1)
从CheckExisting返回1时,您没有关闭文件。还可以使用using (StringReader rdr = ...)
。
由于您的流程仍然锁定了该文件,因此无法再次打开该文件。这就是您看到此异常的原因:The process cannot access the file 'D:\ItemID.txt' because it is being used by another process
。
答案 3 :(得分:1)
您应该使用using
或try/finally
来确保您的资源被关闭,在您的代码中会抛出异常,因为return 1;
方法将在不关闭流的情况下退出,因此您正在使用其他进程使用的文件。 try/finally
StreamReader sr = new StreamReader(@"D:\ItemID.txt");
try
{
string line = sr.ReadLine();
while (line != null)
{
if (0 == string.Compare(line, item_id))
return 1;
line = sr.ReadLine();
}
}
finally
{
sr.Close();
}
return 0;