写入文本文件C#的问题

时间:2011-07-11 13:37:03

标签: c#

这是我的计划:

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',因为它正由另一个进程使用。”你能帮助吗?我解决了吗?非常感谢!

4 个答案:

答案 0 :(得分:10)

如果执行:

if (0 == string.Compare(line, item_id))
    return 1;

然后你不会关闭StreamReader。在阅读和写作时使用using块。

此外:

  • 我建议使用bool而不是整数来表示是/否结果
  • 我使用简单的等式检查,而不是调用Compare并根据0检查结果
  • 如果您使用的是.NET 4,File.ReadLines是一种更简单的阅读行
  • 的方法
  • LINQ可以更轻松地实现CheckExisting
  • 开头
  • 名称xHandler不遵循.NET命名约定
  • 参数名称中的下划线不遵循.NET命名约定
  • 我建议在任何地方都使用大括号,即使它们不是绝对必要的
  • 我会将常数放在比较的 end 而不是开头的比较中;我相信大多数人会发现更具可读性
  • 没有迹象表明CheckExistingWriteNewLog方法需要受到保护而非私有
  • 您实际上并未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)

您应该使用usingtry/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;