C#:无法隐式转换System.IO.FileInfo到string,媒体播放问题求助
解决ListBox双击播放音乐文件的报错问题
嘿,别慌,我来帮你捋捋这个播放报错的问题~你提到的核心问题确实大概率是files里的元素不是直接的文件路径字符串,或者你没拿到正确的完整路径,导致Windows Media Player无法识别。咱们一步步来解决:
先搞清楚files到底存的是什么
首先你得确认files变量的类型:
- 如果是用
Directory.GetFiles("你的音乐文件夹路径")获取的,那它本身就是字符串数组,每个元素都是完整的文件路径,这种情况直接用files[listBox1.SelectedIndex]应该没问题,但要先确保选中的索引有效(比如不是-1)。 - 如果是用
DirectoryInfo.GetFiles()获取的,那files是FileInfo[]数组,每个元素是FileInfo对象——这时候你直接用ToString()只会得到文件名(不是完整路径),当然会报错!这时候要取FileInfo的.FullName属性才能拿到完整路径。
针对不同情况的解决方案
情况1:files是FileInfo数组
如果你的files是这样定义的:
FileInfo[] files = new DirectoryInfo(@"C:\你的音乐文件夹").GetFiles();
那播放代码要改成这样:
// 先判断有没有选中项,防止索引无效 if(listBox1.SelectedIndex != -1) { axWindowsMediaPlayer.URL = files[listBox1.SelectedIndex].FullName; }
情况2:用ListBox绑定更稳妥(推荐新手用)
其实更靠谱的做法是把文件信息和ListBox绑定,让ListBox显示文件名,同时偷偷存好完整路径,这样不用自己维护files数组和选中索引的对应关系:
// 在Form初始化或者加载音乐列表的地方 private void Form1_Load(object sender, EventArgs e) { // 获取音乐文件夹的所有文件 FileInfo[] musicFiles = new DirectoryInfo(@"C:\你的音乐文件夹").GetFiles(); // 设置ListBox显示文件名,存储完整路径 listBox1.DisplayMember = "Name"; listBox1.ValueMember = "FullName"; // 绑定数据源 listBox1.DataSource = musicFiles; } // 双击ListBox的事件处理方法 private void listBox1_DoubleClick(object sender, EventArgs e) { if(listBox1.SelectedValue != null) { axWindowsMediaPlayer.URL = listBox1.SelectedValue.ToString(); } }
情况3:files是自定义对象数组
如果你自己定义了音乐文件的类,比如:
public class MusicFile { public string FileName { get; set; } public string FullPath { get; set; } }
那播放的时候要取对象的FullPath属性:
if(listBox1.SelectedIndex != -1) { axWindowsMediaPlayer.URL = files[listBox1.SelectedIndex].FullPath; }
额外注意点
- 一定要加判断:
listBox1.SelectedIndex != -1或者listBox1.SelectedValue != null,防止用户没选中任何项就双击,导致索引越界报错。 - 确保路径是完整的绝对路径,相对路径有时候会让MediaPlayer找不到文件。
你提供的代码片段:
public partial class Form1 : Form { public Form1() { Init...
内容的提问来源于stack exchange,提问作者mason22
相关产品推荐
相关产品推荐

