我的asp.net(c#)方法如下所示:
static public bool GetVideoLength(string fileName, out double length)
{
DirectShowLib.FilterGraph graphFilter = new DirectShowLib.FilterGraph();
DirectShowLib.IGraphBuilder graphBuilder;
DirectShowLib.IMediaPosition mediaPos;
length = 0.0;
try
{
graphBuilder = (DirectShowLib.IGraphBuilder)graphFilter;
graphBuilder.RenderFile(fileName, null);
mediaPos = (DirectShowLib.IMediaPosition)graphBuilder;
mediaPos.get_Duration(out length);
return true;
}
catch
{
return false;
}
finally
{
mediaPos = null;
graphBuilder = null;
graphFilter = null;
}
}
我用上面的方法得到了持续时间。但我的问题是我无法删除物理文件 我的手术后。我用了
File.Delete(文件路径);
执行此操作时,我得到如下例外:
“该进程无法访问该文件,因为该文件正由另一个进程使用。”
我的Os是Windows 7(IIS 7)
有人请帮我解决这个问题吗?
答案 0 :(得分:1)
我没有使用C#编写directshow应用程序的经验,但在C ++方面有丰富的经验。
DirectShow基于一种名为COM的技术 - 它使用引用计数来告诉它何时使用对象。
例如,它将使用COM对象来表示IGraphBuilder。
在C ++中,我们必须通过删除所有过滤器来解构图形,然后释放图形。
我知道C#有自己的垃圾收集等,但除非你明确释放你使用的对象,否则它们将保留在内存中。
从您引用的代码看来,即使播放可能已完成,图表仍会打开。在这种情况下,它会保留对您播放的文件的引用,这可以解释为什么您无法删除它 - 例如文件上有一个读锁定。
希望这能指出你正确的方向!