繁体   English   中英

Windows UWP StorageFile访问被拒绝异常

[英]Windows UWP StorageFile access is denied exception

我有一个Windows 10移动版应用程序,它确实记录到文本文件。 我正在使用MetroLog。 日志记录方面运行良好,但是,我需要将日志文件转换为字节数组,以便可以传输它。

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

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

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

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

编辑:这是我用来将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;
    }

以上两种方法都可以在测试文件上使用,但是日志文件上都具有例外。

谢谢!!

如@ kurakura88所述,这通常是由于文件具有排他锁而导致的,因此在尝试写入之前,应刷新该文件并关闭它。

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

KeepLogFilesOpenForWrite = false

完整的代码是:

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

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM