2017-11-28 24 views
-1

私のランダムなフォルダムービープレーヤを構築したいと思います。ディレクトリからradomファイルを選択する

私が正しく理解していれば、ファイルをランダムに再生するディレクトリを指定するもう1つのパブリックメソッドを一番上に追加するだけです。

WMPLib.WindowsMediaPlayer Player; 

private void PlayFile(String url) 
{ 
    Player = new WMPLib.WindowsMediaPlayer(); 
    Player.PlayStateChange += 
     new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(Player_PlayStateChange); 
    Player.MediaError += 
     new WMPLib._WMPOCXEvents_MediaErrorEventHandler(Player_MediaError); 
    Player.URL = url; 
    Player.controls.play(); 
} 

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    // TODO Insert a valid path in the line below. 
    PlayFile(@"c:\myaudio.wma"); 
} 

private void Player_PlayStateChange(int NewState) 
{ 
    if ((WMPLib.WMPPlayState)NewState == WMPLib.WMPPlayState.wmppsStopped) 
    { 
     this.Close(); 
    } 
} 

private void Player_MediaError(object pMediaObject) 
{ 
    MessageBox.Show("Cannot play media file."); 
    this.Close(); 
} 
+1

私にこの質問をする理由はわかりません。あなたのコードですか? – Liam

答えて

0

私が正しくあなたを理解していれば、あなたは右、ランダムに特定のディレクトリ内のメディアファイルを再生したいですか?
これを行う方法はたくさんあります。たとえば、あなたは、特定のフォルダ内の特定の拡張子を持つすべてのファイルを取得することができます配列に格納した後、次の

public bool IsMediaFile(string fileNameWithExtension) 
{ 
    return fileNameWithExtension.EndsWith(".mp3") 
      || fileNameWithExtension.EndsWith(".wmv") 
      || fileNameWithExtension.EndsWith(".avi"); 
} 
public Task<IEnumerable<string>> GetMediaFilesInDirectory(string path) 
{ 
    return Task.Factory.StartNew<IEnumerable<string>>(() => 
    { 
     var random = new Random(); 
     var originalPathsArray = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories) 
      .Where(IsMediaFile).ToArray(); 
     return originalPathsArray.OrderBy(e => random.Next()).ToArray(); 
    }); 
} 

最初にこのような乱数で配列を注文するのLINQを使用することができますメソッドは、ファイルがその拡張子をチェックすることによってメディアファイルであるかどうかをチェックします。もちろん、そのようなことをするより良い方法があります。
2番目の方法は文字列型の1つのパラメータを受け入れます。これは、その内部のメディアファイルを検索するディレクトリパスです。私は子ディレクトリのすべての内部で再帰的に検索するGetFiles方法を尋ね、それがdepends-型ウェルそれは長い時間がかかりますので
それはTask<IEnumerable<string>>

  1. Task<T> を返します。もちろん、この動作を変更することができます!

  2. IEnumerable<string> 複数の文字列を返したいので、それは文字列の配列のようですが、一般的な方法です。


私は非常には、カスタムメディアプレーヤーのサービスのインターフェイスタイプに渡すことによって、フォームロジックからメディアプレーヤーのロジックを分離することを示唆している、この方法は、間には明示的な依存関係は存在しませんメディアプレーヤーの実際の実装方法について説明します。


これはあなたのやり方を助けてくれるでしょうか!

0

あなたが再生できるメディアファイルが含まれるディレクトリにそのコンストラクタへのパスを渡すあなたのForm1をインスタンス化できます。

public class Form1 : Form 
{ 
    WMPLib.WindowsMediaPlayer Player; 
    String m_Directory; 

    public Form1(String directory) 
    { 
     m_Directory = directory; 
    } 

    private void PlayFile(String url) 
    { 
     Player = new WMPLib.WindowsMediaPlayer(); 
     Player.PlayStateChange += 
      new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(Player_PlayStateChange); 
     Player.MediaError += 
      new WMPLib._WMPOCXEvents_MediaErrorEventHandler(Player_MediaError); 
     Player.URL = url; 
     Player.controls.play(); 
    } 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     var di = new DirectoryInfo(m_Directory); 
     var files = di.GetFiles("*.*").Where(f => f.Extension.ToLowerInvariant() == ".wma"); 

     Random random = new Random(); 
     Int32 randomIndex = random.Next(0,files.Count()); 
     var file = files.ElementAt(randomIndex).FullName; 

     PlayFile(file); 
    } 

    private void Player_PlayStateChange(int NewState) 
    { 
     if ((WMPLib.WMPPlayState)NewState == WMPLib.WMPPlayState.wmppsStopped) 
      this.Close(); 
    } 

    private void Player_MediaError(object pMediaObject) 
    { 
     MessageBox.Show("Cannot play media file."); 
     this.Close(); 
    } 
} 

代わりに、あなたはForm1FolderBrowserDialogを実装し、ユーザーが選択しましょう可能性(Form1_Loadイベントには好ましくない)再生できるメディアファイルを含むディレクトリ:私のコードで

private void PlayRandomButton_Clicked(object sender, System.EventArgs e) 
{ 
    DialogResult result = folderBrowserDialog.ShowDialog(); 

    if (result != DialogResult.OK) 
     return; 

    String directory = folderBrowserDialog.SelectedPath; 

    var di = new DirectoryInfo(directory); 
    var files = di.GetFiles("*.*").Where(f => f.Extension.ToLowerInvariant() == ".wma"); 

    Random random = new Random(); 
    Int32 randomIndex = random.Next(0,files.Count()); 
    var file = files.ElementAt(randomIndex).FullName; 

    PlayFile(file); 
} 

.wma上のフィルタ異なるタイプのファイルを再生できるようにするために、ファイルを修正または改良することができます。例:

private static String[] s_Extensions = new String[] { ".mp3", ".wma", ".wmv" }; 

// ... 

var files = di.GetFiles("*.*").Where(f => s_Extensions.Contains(f.Extension.ToLowerInvariant())); 
関連する問題