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

时间:2017-01-28 03:32:40

标签: c# listview directory getfiles filelist

我有一个简单的软件循环 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)。

如果你知道如何轻松获得多扩展 使用像我这样的大量编码,我会很高兴知道它 还有我的循环过程,因为你看到的不是那么好,如果你可以引导我走向正确的方式,我仍然在学习那些对我来说有点困难的事情,因为我来自一个完全不同的环境,提前谢谢

2 个答案:

答案 0 :(得分: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

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