如何将字符串追加到Windows商店应用程序中的文件?

时间:2016-04-07 09:23:29

标签: c# windows-store-apps

我有购物的Windows商店应用程序。我创建了Logfile来管理错误。但有时我在将数据附加到文件中时会出现以下错误。

这是我的代码:

        public static async void logError(string pagename, string functionname, string errordescription)
        {
            try
            {
                var folder = ApplicationData.Current.LocalFolder;
                var file = await folder.CreateFileAsync("errorLog.txt", CreationCollisionOption.OpenIfExists);
                await FileIO.AppendTextAsync(file, string.Format("{0}Date: {1} \t PageName: {2} \t FunctionName: {3} \t ErrorDescription: {4}", Environment.NewLine, DateTime.Now, pagename, functionname, errordescription));
            }
            catch (Exception)
            {
                throw;
            }
        }

它写了几行,但经过一段时间后,它会抛出以下错误: 访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))

我不知道为什么会出现这个错误。任何人都可以建议我如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

此错误的原因是您在每次LogError调用时打开/创建文件。由于这些调用可以异步并行地发生,因此打开日志文件时存在竞争条件。如果文件在第一次调用中已经打开,则第二次调用将失败并显示访问拒绝错误。

即使你修复了关于" sync"的评论中提到的问题。用法(我建议做)它无助于解决这个问题。

有几种可能的解决方案:

1)创建只打开文件一次的Logger类,然后它提供LogError调用(同时调用LogError并锁定对象或使用Mutex)。

2)锁定对象上的整个LogError或使用Mutex。因此,对LogError的所有调用都是顺序的,访问日志文件时没有竞争条件。

3)在每个LogError调用上使用唯一的文件名(例如,为名称添加新的GUID)。