2010-02-22 2 views
2

내 응용 프로그램에서 wmplib을 사용하여 선택한 사운드를 재생하고 statechangeevent = 1 (미디어 플레이어가 중지됨)에서 close() 명령을 사용하여 플레이어를 닫고 URL을 ""로 설정합니다.Fileinfo delete 명령

이제는 현재 재생중인 사운드를 삭제하려고 시도했지만 실제로 디렉토리를 보면 파일이 삭제 되었기 때문에 실제로 삭제됩니다. 파일을 삭제할 때마다 디렉토리 내의 미디어 파일로 나열되는 컨트롤을 다시로드합니다. 그러나 여전히 디렉토리에서 이미 삭제 된 사운드를 찾습니다.

천천히 디버깅하는 방법을 시도해 보았습니다. 파일 정보 delete() 명령을 삭제하는 데 시간이 오래 걸리는 것으로 나타났습니다. 미디어 플레이어를 닫으면 미디어 플레이어를 닫을 때 시간이 오래 걸립니다. 현재 재생중인 노래를 삭제 한 후 모음을 다시로드하려고 시도했지만 삭제 된 노래는 아직 남아 있습니다. 미디어 플레이어가 노래를 재생하지 않을 때 삭제하려고하면 빨리 삭제되고 다시 불러오는 모음에는 사라진 노래의 결과가 표시됩니다.

질문 : 현재 재생중인 파일을 삭제하여 다시 불러 오기 모음에 올바른 노래 수가 표시되도록하려면 어떻게해야합니까?

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

내 코드는 다음과 같습니다.

DirectoryInfo di = new DirectoryInfo(@"C:/Sounds/Custom Sounds/"); 
     FileInfo[] filepaths = MultipleFileFilter(di, "*.mp3,*.wma,*.wav"); 
     for (int i = 0; i < filepaths.Length; i++) 
     { 
      if (Path.GetFileNameWithoutExtension(Convert.ToString(filepaths[i]))== deleteItem) 
      { 

       System.IO.FileInfo fi = new System.IO.FileInfo(@"C:/Sounds/Custom Sounds/" + Convert.ToString(filepaths[i])); 
       fi.Delete(); 
      } 
     } 

// Load the sounds 
     DirectoryInfo dii = new DirectoryInfo(@"C:/Sounds/Custom Sounds/"); 
     FileInfo[] filess = MultipleFileFilter(dii, "*.mp3,*.wma,*.wav"); 
     for (int i = 0; i < filess.Length; i++) 
     { 
      RadioButton rb = new RadioButton(); 
      rb.Text = Path.GetFileNameWithoutExtension(filess[i].ToString()); 
      rb.Name = Path.GetFileName(filess[i].ToString()); 
      rb.CheckedChanged += new EventHandler(radioButton_Update); 
      Point lc = new Point(15, yPos); 
      rb.Location = lc; 
      panelSound.Controls.Add(rb); 
      lstbxCustomSounds.Items.Add(Path.GetFileNameWithoutExtension(rb.Text)); 

      yPos += 20; 
      //add into the arraylist 
      controlsCollections.Add(rb); 
     } 

어쩌면 이것이 문제입니까? 현재 재생중인 사운드 만 삭제되므로이 문제가 발생합니까?

private void wPlayer_PlayStateChange(int newstate) 
    { 

     if (newstate == 1)//Media finished 
     { 
      btnPlay.Text = "Play"; 
      wplayer.close(); 
      btnDelete.Enabled = true; 
      wplayer.URL = ""; 
     } 
     else if (newstate == 3) 
     { 
      btnDelete.Enabled = false; 
     } 
+0

무엇이 문제입니까? –

+0

더 이상 제안 사항이 있습니까? – Daniel

답변

1

... 하나이 문제에 대한 쉬운 대답은 현재 재생중인 무언가의 삭제를 허용하지 않는 것이라고 할 것을 보인다 또는 삭제 프로세스 컬렉션을 다시로드하기 전에 완료되었는지 확인합니다. 당신은, 당신은 새로운에서는 FileInfo 개체의 파일 경로에 Convert.ToString(filepath[i])를 추가하고 삭제하는 것입니다에서는 FileInfo를 인스턴스화 할 때

편집은, 위의 코드를 기준으로합니다. 대신, 나는 그 전에 모든 것을 없애고 단지 filepath[i].FullName을 사용합니다.

그래서 개체를 인스턴스화하면 new FileInfo(filepath[i].FullName);으로 삭제됩니다.

+0

그럼 컬렉션을 다시로드하기 전에 삭제 프로세스가 완료되도록하려면 어떻게해야합니까? 나는 while 루프를 시도해 (파일 이름을위한 디렉토리를 검사했다), 콜렉션을 다시로드하기 전에 5 초 동안 프로그램을 매달았다. – Daniel

+0

언제 삭제를 수행 하시겠습니까? 다른 스레드에 있습니까? 삭제 진술 바로 뒤에 컬렉션을 업데이트한다고 말합니다. 삭제 진술에 걸리는 시간과 관계없이 삭제가 끝난 후에도 업데이트됩니다. – Aaron

+0

삭제가 다른 스레드에 없습니다. 내 리로드 컬렉션은 이런 방식으로 작동하며 디렉토리를 탐색하여 디렉토리 내의 파일을 찾습니다. 파일을 삭제 한 후에는 리로드 컬렉션 메서드를 호출하고 슬프게도 파일을 찾을 수 있습니다. 파일이 아직 완전히 삭제되지 않았다고 생각했는데, 왜 여전히 파일을 감지 할 수 있는지. – Daniel