首页 文章

Windows UWP StorageFile访问被拒绝异常

提问于
浏览
0

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

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

我能够将StorageFolder中的MetroLog日志文件成功地作为StorageFile获取,就在我尝试将StorageFile转换为字节数组时,我得到了异常 .

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

我假设问题是因为它是Archive属性?有任何想法吗?

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

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

然后当它不起作用时,我也尝试调用此方法并传入StorageFile . 通过这种方法,我在使用线上得到了例外 .

/// <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;
    }

以上两个都在测试文件上工作,但两个日志文件都有例外 .

谢谢!!

1 回答

  • 1

    正如@ kurakura88所提到的,这通常是由具有独占锁的文件引起的,您应该在尝试写入之前刷新文件并关闭它 .

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

    KeepLogFilesOpenForWrite = false
    

    完整的代码是:

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

    将此属性设置为false后,我尝试使用日志文件时不再出现异常 .

    希望这可以帮助 .

相关问题