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

How to append string to file in windows store app?

我有 windows 商店应用程序用于购物。我创建了日志文件来管理错误。但有时我在文件中追加数据时会出现以下错误。

这是我的代码:

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

我不明白为什么会出现此错误。有人可以建议我如何解决这个问题吗?

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

即使您修复了有关 "sync" 用法的评论中提到的问题(我建议这样做),也无助于解决此问题。

有几种可能的解决方案:

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

2) 将整个 LogError 锁定在对象上或使用 Mutex。因此,您对 LogError 的所有调用都将是顺序的,并且在访问日志文件时不会出现竞争条件。

3) 在每次 LogError 调用时使用唯一的文件名(例如,将新的 GUID 添加到名称中)。