类型为' System.IO.IOException'发生在mscorlib.dll中 - 进程无法访问该文件,因为它正由另一个进程使用

时间:2015-05-30 13:44:48

标签: c# file-access contention

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

var data = [{
    'name': 'charlie',
    'id': 1
}, {
    'name': 'mack',
    'id': 2
}, {
    'name': 'dargen',
    'id': 3
}, {
    'name': 'cool',
    'id': 4
}, {
    'name': 'silver',
    'id': 5
}]


var ViewModel = function () {
    var self = this;
    self.innerLoop = ko.observableArray();
    self.replies = ko.observableArray([{
        'nameRep': 'becok',
        'rid': 1,
        'reply': 'hello'
    }, {
        'nameRep': 'saluk',
        'rid': 1,
        'reply': 'hey bro'
    }, {
        'nameRep': 'chin-ui',
        'rid': 4,
        'reply': 'wassup'
    }, {
        'nameRep': 'mark',
        'rid': 3,
        'reply': 'chill out'
    }, {
        'nameRep': 'kaj',
        'rid': 3,
        'reply': 'ok dear'
    }, ]);

    var comment = function (c) {
        this.id = ko.observable(c.id);
        this.name = ko.observable(c.name);
        this.array = ko.computed(function () {
            var name = this.id();
            var arr = [];
            arr = ko.utils.arrayFilter(self.replies(), function (item) {
                return item.rid === name;
            });
            return arr;
        }, this);
    }

    self.comments = ko.observableArray();
    ko.utils.arrayForEach(data, function (item) {
        self.comments.push(new comment(item));
    });
};

ko.applyBindings(new ViewModel());

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

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

任何解决这个问题的建议都会非常感激

3 个答案:

答案 0 :(得分:3)

您的计划应该有效。因此,正如消息所述,该文件正由另一个进程打开。除非你自己做一些事情导致这种情况,否则很可能是Windows搜索的罪魁祸首。

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

enter image description here

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

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

enter image description here

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

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

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

答案 1 :(得分: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);
        }
    }
} 

答案 2 :(得分:0)

尝试在File.AppendAllText

之后添加.Close()