从目录中选择一个radom文件

时间:2017-11-28 11:01:30

标签: c#

我想构建我的随机文件夹电影播放器​​。

如果我理解正确,我需要做的就是在顶部添加另一个公共方法,指定随机播放文件的目录,对吗?

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

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你想在特定目录中随机播放媒体文件,对吧? 有很多方法可以做到这一点。例如,您可以在特定文件夹中获取具有特定扩展名的所有文件,将它们存储在数组中,然后您可以使用 Linq 按照以下随机数对数组进行排序。 / p>

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

第一种方法是通过检查文件的扩展名来检查文件是否是媒体文件,当然还有更好的方法可以做到这一点。
第二种方法接受一个string类型的参数,它是你想在其中查找媒体文件的目录路径。
它返回Task<IEnumerable<string>>

  1. Task<T> 因为我要求GetFiles方法在所有子目录中递归搜索并且需要很长时间 - 这取决于 - 。你当然可以改变这种行为!

  2. IEnumerable<string> 因为我想要返回多个字符串,它就像一个字符串数组,但是通用的方式!


  3. 注意 我强烈建议您通过传入自定义媒体播放器服务的接口类型将媒体播放器逻辑与表单逻辑分开,这样就不会在表单和媒体播放器的实际实现之间存在明确的依赖关系。

    <小时/> 希望这对你有所帮助!

答案 1 :(得分: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();
    }
}

或者,您可以在FolderBrowserDialog中实现Form1并让用户选择包含可以播放的媒体文件的目录(最好不在Form1_Load事件中):< / p>

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