0

我有一个简单的软件,可以循环播放 Images/videos
并使用()-()按钮一一显示Nextprevious

到目前为止,我成功地一次只带来一个扩展,使用:

string[] FileList = Directory.GetFiles(Dir, "*.jpg", SearchOption.AllDirectories);

当列表到达末尾时,我尝试使用以下代码停止循环:

int currentPosition = 0;
if (currentPosition != ImageList.Length) currentPosition++;

请原谅我的错误,因为我在 c# 中仍然是菜鸟,但是当我调试它时说
> IndexOutOfRangeException

在我添加这样的多个扩展之后:

    string[] VOut_AVI = Directory.GetFiles(@Curr_DirectoryName, "*.avi", SearchOption.AllDirectories);
    string[] VOut_MP4 = Directory.GetFiles(@Curr_DirectoryName, "*.mp4", SearchOption.AllDirectories);
    string AddMP4 = VOut_MP4[VOut_MP4.Length - 1];
    //------ Adding other format to our call ------------
    Array.Resize(ref VOut_AVI, VOut_AVI.Length + 1);
    VOut_AVI[VOut_AVI.Length - 1] = AddMP4;

    // just for test ----->>
    MessageBox.Show("Video link : " + VOut_AVI[currentPosition]);

我得到这个错误说(XamlParserException)那个。

如果您知道无需像我那样使用那么多编码而获得多个扩展的简单方法,我会很高兴知道它也是我的循环过程,因为如果您能指导我正确的方式,我仍然认为这不是很好学习这些东西对我来说有点难,因为我来自一个完全不同的环境,在此先感谢

4

2 回答 2

0

要获取具有不同扩展名的文件名列表,请使用Directory.EnumerateFiles并连接这些查询。

IEnumerable<string> myFilesQuery = new string[] { };

myFilesQuery = myFilesQuery.Concat( Directory.EnumerateFiles( dir, "*.avi", SearchOption.AllDirectories ) );
myFilesQuery = myFilesQuery.Concat( Directory.EnumerateFiles( dir, "*.mp4", SearchOption.AllDirectories ) );
myFilesQuery = myFilesQuery.Concat( Directory.EnumerateFiles( dir, "*.jpg", SearchOption.AllDirectories ) );

// nothing will happen until we call

IList<string> myFiles = myFilesQuery.ToList( );

如果您想为您的代码编写一行代码,请编写一个帮助程序,例如

public static class DirectoryHelper
{
    public static IEnumerable<string> EnumerateFiles( 
        string path, 
        SearchOption searchOption, 
        params string[] searchPatterns )
    {
        if ( searchPatterns == null )
            throw new ArgumentNullException( nameof( searchPatterns ) );

        IEnumerable<string> result = new string[] { };

        foreach ( var searchPattern in searchPatterns )
        {
            result = result.Concat( Directory.EnumerateFiles( path, searchPattern, searchOption ) );
        }

        return result;
    }
}

在我们的代码中,你只有

IList<string> myFiles 
    = DirectoryHelper
        .EnumerateFiles( 
            dir, 
            SearchOption.AllDirectories, 
            "*.avi", "*.mp4", "*.jpg" )
        .ToList();

您不必担心数组的任何长度。该列表将包含Count属性中包含的元素的数量。

所有集合都是从零开始的,第一项具有索引 0,最后一项具有索引Count-1(集合)或Length-1(数组)。当你到达终点时currentPosition >= mylist.Count-1,你可以增加索引,只要currentPosition < mylist.Count-1.

更新

这里已经有一个关于 SO 处理具有并行实现的多个搜索模式的答案

https://stackoverflow.com/a/3754470/1744164

于 2017-01-28T19:01:28.067 回答
0

Length 返回项目数,但将从索引 0,1 检索。

例如,如果您的列表共有 2 条记录,那么您只能访问 0,1 索引中的项目。它在第二个索引中不可用,因此会引发错误。

变成ImageList.Length-1

要获取所有具有不同扩展名的文件,您可以使用扩展名类型为 * 的 EnumerateFiles。您也可以使用 where 子句过滤文件。

var resufile = Directory.EnumerateFiles(@"fullpath", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp4") || s.EndsWith(".jpg"));  //different extension you can specify it
于 2017-01-28T03:34:44.913 回答