2

SO上可能有很多像这样的问题,但没有一个能够解决我的问题。我正在以编程方式创建一个文本文件,并使用以下代码将文本写入其中:

 for (int y = 0; y < image.Height; y++)
            {
                for (int x = 0; x < image.Width; x++)
                {
                    string path = @"E:\Example.txt";


                    Color pixel = image.GetPixel(x, y);
                    if (!File.Exists(path))
                    {
                      //  File.Create(path);
                       File.Create(path).Dispose();
                        using (TextWriter tw = new StreamWriter(path))
                        {
                            tw.WriteLine("Value at" + x + "" + y + "" + "is:" +pixel);
                            tw.Close();
                        }

                    }

                    else if (File.Exists(path))
                    {
                        File.AppendAllText(path,
                   "Value at"+"" + x + "" + y + "" + "is:" +""+ pixel + Environment.NewLine);
                        //using (TextWriter tw = new StreamWriter(path))
                        //{
                        //    tw.WriteLine("The next line!");
                        //    tw.Close();
                        //}
                    }
                    if (pixel.R == keywordBytes[0] && pixel.G == keywordBytes[1] && pixel.B == keywordBytes[2])
                    {

                        firstMatchingBytePos = new Point(x, y);
                        KeywordFound(keyword, firstMatchingBytePos);
                    }
                }
            } 

我想在文本文件中写入每个像素的值。它适用于几个值,然后突然停止抛出上述异常。

此外,我检查了文件的安全属性,并确保我可以完全控制文件。我无法弄清楚。

任何解决此问题的建议将不胜感激

4

3 回答 3

3

你的程序应该可以工作。因此,如消息所述,该文件正在由另一个进程打开。除非您自己做某事导致此问题,否则罪魁祸首很可能是 Windows 搜索。

要阻止 Windows Search 干扰您的程序,请停止 Windows Search 服务。services.msc从“开始”菜单或命令提示符输入命令:

在此处输入图像描述

选择 Windows 搜索所在的行,然后使用工具栏按钮或右键菜单停止服务。

如果您愿意,您也可以禁用该服务,以防止它在您重新启动计算机时再次启动。属性设置可通过双击或右键菜单进行:

在此处输入图像描述

关于您的代码,请考虑使用 aStringBuilder将文本存储在循环中,然后在最后将文本写入文件一次,而不是多次访问文件系统:

StringBuilder sb = new StringBuilder();

for (int y = 0; y < image.Height; y++)
{
    for (int x = 0; x < image.Width; x++)
    {
        Color pixel = image.GetPixel(x, y);

        sb.AppendLine("Value at" + x + "" + y + "" + "is:" + pixel);

        if (pixel.R == keywordBytes[0] && pixel.G == keywordBytes[1] && pixel.B == keywordBytes[2])
        {
            firstMatchingBytePos = new Point(x, y);
            KeywordFound(keyword, firstMatchingBytePos);
        }
    }
}

string path = @"E:\Example.txt";

if (!File.Exists(path))
{
    File.Create(path);
}

File.AppendAllText(path, sb.ToString());

编辑:请注意,如果您确实使用这种方法,字符串可能会变得非常大,因此您可能需要对其进行优化,例如每次字符串达到一定长度时写入文件而不是最后一次写入文件。

于 2015-05-30T14:27:34.907 回答
0

您正在尝试为每个循环迭代重新创建文件。你试图智取 API,它已经知道什么时候必须创建一个新文件。不要那么做:

string path = @"E:\Example.txt";

for (int y = 0; y < image.Height; y++)
{
    for (int x = 0; x < image.Width; x++)
    {
        Color pixel = image.GetPixel(x, y);

        // this line is all you need to append a line to an existing, OR NEW file
        File.AppendText(path, "\nValue at" + x + "" + y + "" + "is:" + pixel);

        if (pixel.R == keywordBytes[0] && pixel.G == keywordBytes[1] && pixel.B == keywordBytes[2])
        {
            firstMatchingBytePos = new Point(x, y);
            KeywordFound(keyword, firstMatchingBytePos);
        }
    }
} 
于 2015-05-30T13:51:26.163 回答
0

尝试在 File.AppendAllText 之后添加 .Close()

于 2015-05-30T16:37:26.467 回答