2

私のアプリケーションはこれを行い、wmplib を使用して選択したサウンドを再生し、statechangeevent = 1 (メディア プレーヤーが停止) になったら、close() コマンドを使用してプレーヤーを閉じ、URL を "" に設定します。

毎回、現在再生中のサウンドを削除しようとしましたが、実際には削除されます。ディレクトリを見ると、ファイルが削除されているためです。ファイルを削除するたびに、ディレクトリ内のメディア ファイルをリストするコントロールをリロードします。ただし、ディレクトリ内で既に削除されているサウンドは検索されます。

私はこの方法でゆっくりとデバッグを試みましたが、ファイル情報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;
        }
4

1 に答える 1

1

この問題に対する簡単な答えは、現在再生されているものの削除を許可しないことです... または、コレクションをリロードする前に削除プロセスが完了していることを確認してください。

EDIT 上記のコードに基づいて、削除するfileinfoをインスタンス化するときConvert.ToString(filepath[i])に、新しいfileinfoオブジェクトのファイルパスに追加しています。代わりに、その前にすべてを取り除き、filepath[i].FullName.

したがって、削除するオブジェクトを としてインスタンス化するだけnew FileInfo(filepath[i].FullName);です。

于 2010-02-22T15:36:36.707 に答える