实际上,当您调用 MediaPlayer.Open 时,它会自动通过流读取文件。问题是当您尝试删除文件时流仍处于打开状态。
MediaPlayer 上有一个 .Close 方法。调用它会关闭正在文件中读取的流。
这是有关 MediaPlayer 类的文档,因此您可以查看可以使用的其他方法:http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer.aspx
编辑:如果您不介意播放器在您调用 Close 时停止播放,那么您可以关闭然后删除您的文件。如果您确实需要继续播放,那么您将需要一种不同的方法。
如果您使用的是 Silverlight,那么您可以直接将流加载到 MediaElement:
var bytes = File.ReadAllBytes(@"c:\yourfile.ext");
var mStream = new MemoryStream(bytes);
mediaElement1.SetSource(mStream);
遗憾的是,WPF 没有相同的流支持。我试图通过将流写入资源包来获取 MemoryStream 的 Uri。虽然,我无法让它在我的测试中正确播放。我将包括我的来源,以防你想摆弄它并让它工作:
var bytes = File.ReadAllBytes(@"C:\Bill\TestWaveFiles\14043.wav");
MemoryStream packStream = new MemoryStream()
Package pack = Package.Open(packStream, FileMode.Create, FileAccess.ReadWrite);
Uri packUri = new Uri("bla:");
PackageStore.AddPackage(packUri, pack);
Uri packPartUri = new Uri("/MemoryResource", UriKind.Relative);
PackagePart packPart = pack.CreatePart(packPartUri, "Media/MemoryResource");
packPart.GetStream().Write(bytes, 0, bytes.Length);
var inMemoryUri = PackUriHelper.Create(packUri, packPart.Uri);
mediaElement1.LoadedBehavior = MediaState.Manual;
mediaElement1.Source = inMemoryUri;
mediaElement1.Play();
另一种选择是在打开文件之前简单地复制文件。这样你就可以随时删除原件。不过,您也可以只“标记”要删除的文件。当用户播放完文件后,您可以关闭并删除它。
另一个选项是使用名为 BoxedApp 的第 3 方库。它似乎允许您拥有一个包含内存流的“虚拟文件”。然后,您可以获得指向此虚拟文件的 Uri 并将其加载到媒体播放器中。看看这个答案
user1108125 了解如何使用这个 BoxedApp 库(我从未使用过)。 https://stackoverflow.com/a/8587166/1721136