【问题标题】:`Not a WAVE file - no RIFF header` locks file`不是 WAVE 文件 - 没有 RIFF 头` 锁定文件
【发布时间】:2020-05-11 03:40:56
【问题描述】:

使用代码:

using (var reader = new WaveFileReader(audioFileLocation))
{
    // Do something....
}

如果给定一个抛出异常的 wav 文件:

不是 WAVE 文件 - 没有 RIFF 标头
异常详细信息:System.FormatException:不是 WAVE 文件 - 没有 RIFF 标头

它会锁定文件audioFileLocation 以防止其被删除。

在使用阅读器之前,有什么方法可以检查是否存在有效的 RIFF 标头?

【问题讨论】:

  • WaveFileReader 中很可能存在一个错误,因为它不会关闭文件。你从哪里得到的那门课?
  • 文件锁定多长时间?直到进程终止还是一会儿?
  • 它被锁定,直到我重新启动 IIS。这是NAudio.Wave.WaveFileReader
  • WaveFileReader 类在这里有一个错误。根据 codeplex 上的源代码,这里:naudio.codeplex.com/SourceControl/latest#NAudio/Wave/…,它检查文件是否是有效的 RIFF 文件在设置ownInput 参数之前,因此如果给定一个参数,则不会关闭流无效文件。
  • @Lasse 感谢会提交错误报告

标签: c# asp.net naudio


【解决方案1】:

尝试使用流:

using(var inputStream = new FileStream(audioFileLocation, FileMode.Open, 
                           FileAccess.Write, FileShare.ReadWrite))
{
    using (var reader = new WaveFileReader(inputStream))
    {
        // Do something....
    }
}

如果THISWaveFileReader 类的当前代码,它在构造函数的“字符串重载”中使用File.OpenRead(waveFile),并且返回的Stream 似乎没有被关闭/处置。也许follownin已经起作用了:

using(var inputStream = File.OpenRead(audioFileLocation))
{
    using (var reader = new WaveFileReader(inputStream))
    {
        // Do something....
    }
}

因为这应该处理流。

【讨论】:

  • 这样就解决了OP的问题,不过WaveFileReader类还是有bug的。
  • 是的,我同意@LasseV.Karlsen - 也许你应该将此作为错误报告给NAudio...
【解决方案2】:

我有相同的代码,但就在我处理 FileWriter 之前,它正在写入 audioFileLocation

fileWriter.Dispose; // writes to audioFileLocation
// ...
using (var reader = new WaveFileReader(audioFileLocation))
{
    // Do something....
}

一些运行代码的计算机太慢而无法重置到初始位置,导致在文件末尾搜索波头。解决方法是重置位置:

using (var reader = new WaveFileReader(audioFileLocation))
{
    reader.Position = 0;
    // Do something....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2018-07-07
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多