2012-07-05 5 views
2

매우 이상합니다. 미디어 파일을 읽고 타사 DLL (MediaInfo.dll)을 사용하여 미디어 파일에서 데이터를 추출하는 콘솔 응용 프로그램이 있습니다.프로세스가 파일을 액세스 할 수 없기 때문에 다른 프로세스에서 사용하고 있기 때문에 항상 사용할 수는 없습니다.

그리고 그 파일을 소스의 다른 위치에 업로드 한 다음, 마침내 모든 파일이 생성되면 souce에서 해당 파일을 삭제합니다.

아래는 제 코드입니다.

    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); 
         } 


        } 

난 그냥 시작 삭제 이전 가비지 컬렉터를 호출 할 (나는이 날 모든 잠금을 제거하지만, 잘못 생각하는 데 도움이 될 것입니다 생각).

코드가 너무 잘 작동하고 때로는 "프로세스가 다른 프로세스에서 사용 중이기 때문에 파일에 액세스 할 수 없습니다."라는이 예외가 throw됩니다.

내가 좋아하는 타사 라이브러리에 미디어 파일을로드 할 때 내가 다른 장소를 의심 할 수 아래

   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"); 

후 내가 같은 오류가 수동으로 파일을 삭제하려고 할 때이 코드 조각에 도착 메시지를 표시하고 강제로 연결을 닫아 파일을 해제하는 방법을 모르겠습니다.

도움을 주시면 감사하겠습니다.

+0

코드의 올바른 형식 및 들여 쓰기가 매우 유용합니다. – TheVillageIdiot

+0

전 세계에서 'videoInterrogator'가 무엇인지 알 수 없습니다. 하지만 타사 응용 프로그램/라이브러리이고 네트워크에 파일을 업로드하는 경우 작업을 완료 할 때 제기해야하는 일정이 있어야합니다. – TheVillageIdiot

+0

@ TheVillageIdiot, VideoInterrogator는 제 3 자 dll (media info) – Usher

답변

2

videoInterrogator에 대한 자세한 내용은 분명 유용 할 것입니다. 설명서를 확인하십시오. IDisposable을 구현하는 경우 완료되면 개체에 Dispose()을 호출 해보세요. COM 개체 호출이면 Marshal.ReleaseComObject()입니다.

+0

을 회신 해 주신 래퍼 클래스입니다. VideoInterrogator 코드도 추가해 주실 수 있습니다. 제발 저에게 제안 해주십시오. – Usher

+0

@Usher 작동하지 않을 때, 아마도 제 3 자 라이브러리에서 파일을 삭제할 수없는 잠금이 있습니다. 관리되는 라이브러리가 아닌 경우 가비지 수집기를 호출하면이를 해제 할 수 없습니다. [this] (http://mediainfo.sourceforge.net/ko)가 사용중인 라이브러리입니까? –

+0

C++에서 언급하고 작성한 것과 동일한 라이브러리를 사용하고 있습니다. – Usher

관련 문제