我有一个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;
}
以上两个都在测试文件上工作,但两者在日志文件中都有例外。
谢谢!
答案 0 :(得分:1)
如@ kurakura88所述,这通常是由具有独占锁定的文件引起的,您应该在尝试写入之前刷新文件并关闭它。
但是,我找到了专门针对MetroLog的解决方案。我正在使用StreamingFileTarget,并且可以设置属性:
KeepLogFilesOpenForWrite = false
完整的代码是:
LogManagerFactory.DefaultConfiguration.AddTarget(LogLevel.Debug, LogLevel.Fatal,
new StreamingFileTarget {RetainDays = RetainDays, KeepLogFilesOpenForWrite = false});
将此属性设置为false后,当我尝试使用日志文件时,我不再收到异常。
希望这有帮助。