带来多个扩展文件,并在列表到达结束时停止循环 - c#

问题描述 投票:0回答:2

我有一个简单的软件循环多Images/videos 并使用(Next) - (previous)按钮逐个显示它们

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

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

我尝试使用此代码在列表到达End时停止循环:

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

请原谅我的错误,因为我在c#中仍然是Noob,但是当我调试它时 > 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)那个。

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

c# listview directory getfiles filelist
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


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
© www.soinside.com 2019 - 2024. All rights reserved.