【问题标题】:Error "file in use" when playing aac while appending bytes to aac在将字节附加到 aac 时播放 aac 时出现“文件正在使用”错误
【发布时间】:2016-09-01 04:56:25
【问题描述】:
var outputfile = "outputfile.aac";     
var fileList = new List<string>
                {
                    "1.aac",
                    "2.aac",
                    "3.aac",
                    "4.aac",
                    "5.aac",
                    "6.aac"
                };

                foreach (var file in fileList)
                {
                    using (var stream = new FileStream(outputfile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
                    {
                        var bytes = File.ReadAllBytes(file);
                        stream.Write(bytes, 0, bytes.Length);
                        stream.Flush();
                    }
                }

我尝试将 fileList 中的 aac 文件加入到输出文件中。将文件“3.aac”写入 outputfile.aac 时,我用 MediaPlayer 打开 outputfile,然后 FileStream 返回异常“file in use”,即使 FileShare 模式是 ReadWrite,这意味着其他进程可以读取和写入该文件。那么原因在哪里呢?

但是,在这种情况下,输出文件没有被阻止

Stream s = resp.GetResponseStream();
                    var fs = File.Exists(outputFile) ? new FileStream(outputFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)
                        : new FileStream(outputFile, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

                    byte[] buffer = new byte[4096];
                    while (s.CanRead)
                    {
                        int bytesRead = s.Read(buffer, 0, buffer.Length);
                        fs.Write(buffer, 0, bytesRead);
                    }

P/s:我找到原因是因为它是aac文件

【问题讨论】:

  • 当你说when writing file "3.mp3" to outputfile.mp3, I open outputfile with MediaPlayer - 你是在Visual Studio中执行using语句之前还是之后打开outputfile.mp3文件?
  • 顺便说一下,在这种情况下不需要同时执行 Flush() 和 Using。
  • 我无法重现您的问题。虽然我使用 VLC 媒体播放器打开文件输出文件。由于您使用了不同的音乐播放器,因此不确定是否会有所不同。
  • 我在 flush() 之后和 using 语句之前打开 outputfile.mp3。这个问题也发生在 VLC 上。请在这里找到代码示例mediafire.com/download/7cerhydjseyxdez/Debug.zip

标签: c# exception filestream aac


【解决方案1】:

当您使用FileShare.ReadWrite 时,您允许随后以读取或写入模式打开文件。

MediaPlayer 然后打开带有FileShare.Read 的文件,拒绝您对该文件的写入权限。

【讨论】:

  • 你知道第二种情况的原因以及如何防止MediaPlayer锁定写权限吗?
  • @HoàngTrầnHuy 你不能,任何体面的媒体播放器都会这样做。您首先需要重新考虑为什么要尝试这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多