2

その非常に奇妙な、私はメディアファイルを読み取り、サードパーティのdll(MediaInfo.dll)を使用してメディアファイルからいくつかのデータを抽出するコンソールアプリケーションを持っています

次に、そのファイルをソースから別の場所にアップロードし、最後に、すべてが完了したら、ソース内のそのファイルを削除します。

以下は私の削除コードです。

                    GC.Collect();
                    FileInfo[] fiListImages = (new DirectoryInfo(mfsData.Images)).GetFiles(String.Format("*{0}*", sp.Story.Slug));
                    foreach (FileInfo fi in fiListImages)
                    {

                        bool ImageFolder = fi.Directory.Name.Contains("Images");
                        if (ImageFolder)
                        {

                            File.Delete(fi.FullName);

                        }
                    }

                    FileInfo[] fiListMedia = (new DirectoryInfo(mfsData.EncodedMedia)).GetFiles(String.Format("*{0}*", sp.Story.Slug), SearchOption.AllDirectories);
                    foreach (FileInfo fi in fiListMedia)
                    {



                        if (sp.Profile.Name == "Comedy" && fi.FullName.Contains(@"\Comedy"))
                        {
                            File.Delete(fi.FullName);
                        }
                        else if (sp.Profile.Name == "Actuib" && ((fi.FullName.Contains(@"\Action") || (fi.FullName.Contains(@"\Syndicated")))))
                        {
                            File.Delete(fi.FullName);
                        }


                    }

削除を開始する前にガベージコレクターを呼び出したいだけです(これはすべてのロックを削除するのに役立つと思いましたが、間違っています)。

コードは非常にうまく機能している場合があり、「別のプロセスによって使用されているため、プロセスがファイルにアクセスできません」という例外がスローされる場合があります。

以下のようにメディアファイルをサードパーティのライブラリにロードすると、別の場所が疑われる可能性があります

                videoInterrogator.LoadFile(filename);
                logger.Info("video interrogar extract the video files");
                message.AppendFormat(messageFormat, "FileSize", videoInterrogator.GetFileSize(), Environment.NewLine);
                message.AppendFormat(messageFormat, "MaxBitRate", videoInterrogator.maxBitRate(), Environment.NewLine);
                logger.Info("Video Extract done");

このコードにアクセスした後、そのファイルを手動で削除しようとすると、同じエラーメッセージが表示され、接続を強制的に閉じてファイルを解放する方法がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

2

についてのより多くの情報videoInterrogatorは間違いなく役に立ちます。そのドキュメントを確認してみてください。実装されている場合は、完了したらオブジェクトIDisposableを呼び出してみてください。Dispose()COMオブジェクトの場合は呼び出しますMarshal.ReleaseComObject()

于 2012-07-05T04:48:46.797 に答える