【问题标题】:Windows UWP StorageFile access is denied exceptionWindows UWP StorageFile 访问被拒绝异常
【发布时间】:2017-05-31 23:14:36
【问题描述】:

我有一个可以记录到文本文件的 Windows 10 移动应用程序。我正在使用 MetroLog 敌人。日志记录方面工作得很好,但是,我需要将日志文件转换为字节数组以便可以传输。

当我尝试将其转换为字节数组时,我得到一个访问被拒绝异常。我知道问题出在文件上,因为我创建了一个示例文本文件,并且示例文件没有异常,并且能够获取我的字节数组。

我能够成功地从 StorageFolder 获取 MetroLog 日志文件作为 StorageFile,只是当我尝试将 StorageFile 转换为字节数组时,我得到了异常。

有效的测试文件和提供异常的 MetroLog 日志文件之间只有两个区别。 MetroLog 文件的扩展名为 .log,属性为 Archive。测试文件是一个具有 Normal 属性的 .txt。

我假设问题是因为它是存档属性?有什么想法吗?

编辑:这是我用来将 StorageFile 转换为字节数组的代码。我首先尝试了这种更简单的方法:

var buffer = await Windows.Storage.FileIO.ReadBufferAsync(logFile);
return buffer.ToArray();

然后当这不起作用时,我也尝试调用此方法并传入 StorageFile。使用这种方法,我在 using 行得到了异常。

    /// <summary>
    /// Loads the byte data from a StorageFile
    /// </summary>
    /// <param name="file">The file to read</param>
    public async Task<byte[]> ReadFile(StorageFile file)
    {
        byte[] fileBytes = null;
        using (IRandomAccessStreamWithContentType stream = await file.OpenReadAsync())
        {
            fileBytes = new byte[stream.Size];
            using (DataReader reader = new DataReader(stream))
            {
                await reader.LoadAsync((uint)stream.Size);
                reader.ReadBytes(fileBytes);
            }
        }

        return fileBytes;
    }

以上两个都在测试文件上工作,但在日志文件上都有异常。

谢谢!!

【问题讨论】:

  • 能分享一下StorageFile转字节数组的代码吗?
  • @kurakura88 我已经编辑了帖子以显示您要求的代码。没想到这会有所帮助,抱歉没有发帖,但就在这里。
  • 好的。我的猜测是您的日志文件仍被另一个进程打开/锁定,因此在其他进程释放它之前您无法访问它。不确定如何记录日志文件,但我建议在尝试打开日志之前刷新/关闭日志。
  • @kurakura88 我想了想,我有两个问题要跟进。第一个问题,我认为即使记录器打开了文件,我仍然可以打开它并以只读模式读取它吗?唯一不是这种情况的情况是记录器对文件有排他锁,我认为它没有。其次,我遵循 MetroLog 的代码示例,它将记录器包装到一个单例(延迟初始化)类中。单例的构造函数配置日志文件参数。我不确定如何关闭或释放文件,尤其是考虑到它是单例的。
  • 这确实取决于您如何实现日志。如果你不独占锁定它,你应该可以访问它,但如果它没有被刷新,它将是一个空日志。对于您的第二个问题,我再次不确定该示例,但您可以实现一种方法来刷新和关闭文件。如果您不想破坏当前日志文件,请先刷新它,然后将当前日志文件复制到另一个文件,然后再访问副本。

标签: c# .net windows-10-universal


【解决方案1】:

正如@kurakura88 所述,这通常是由具有排他锁的文件引起的,您应该在尝试写入之前刷新文件并关闭它。

但是,我找到了专门针对 MetroLog 的解决方案。我正在使用 StreamingFileTarget 并且可以设置属性:

KeepLogFilesOpenForWrite = false

完整代码为:

LogManagerFactory.DefaultConfiguration.AddTarget(LogLevel.Debug, LogLevel.Fatal,
            new StreamingFileTarget {RetainDays = RetainDays, KeepLogFilesOpenForWrite = false});

将此属性设置为 false 后,我在尝试使用日志文件时不再遇到异常。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2012-05-19
    • 2014-11-19
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多