【发布时间】: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