Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取目录文件,按文件名中的日期排序_C#_Linq_File_Directory - Fatal编程技术网

C# 获取目录文件,按文件名中的日期排序

C# 获取目录文件,按文件名中的日期排序,c#,linq,file,directory,C#,Linq,File,Directory,我需要从目录中获取所有文件,按文件名中的日期排序: James_2015.06.27.pdf Anna_2017.01.17.pdf Timmy_2017.02.19.pdf 目前,我正在使用它,它只按名称对文件进行排序 DirectoryInfo info = new DirectoryInfo(path); FileInfo[] files = info.GetFiles(filter).OrderBy(p => p.Name).ToArray(); 有什么办法可以做到这一点吗

我需要从目录中获取所有文件,按文件名中的日期排序:

James_2015.06.27.pdf
Anna_2017.01.17.pdf
Timmy_2017.02.19.pdf
目前,我正在使用它,它只按
名称
对文件进行排序

 DirectoryInfo info = new DirectoryInfo(path);
 FileInfo[] files = info.GetFiles(filter).OrderBy(p => p.Name).ToArray();

有什么办法可以做到这一点吗?

我会创建一个以文件名为键的字典,该值是文件名的子字符串,只包含日期

您可以在DirectoryEntry上循环并以循环方式将它们添加到字典中,算法如下所示:

                        string filename1 = "asbdahszd2018.02.01.pdf";
                        string filename2 = "foobar2018.02.01.pdf";

                        Dictionary<string, string> myDict = new Dictionary<string,string>();

                        myDict.Add(filename1, filename1.Substring(filename1.Length - 14, 10));
                        myDict.Add(filename2, filename2.Substring(filename2.Length - 14, 10));

                        myDict.OrderBy(item => item.Value);
string filename1=“asbdahszd2018.02.01.pdf”;
字符串filename2=“foobar2018.02.01.pdf”;
Dictionary myDict=新字典();
添加(filename1,filename1.Substring(filename1.Length-14,10));
Add(filename2,filename2.Substring(filename2.Length-14,10));
myDict.OrderBy(item=>item.Value);

我将创建一个以文件名为键的字典,该值将是文件名的子字符串,并且只包含日期

您可以在DirectoryEntry上循环并以循环方式将它们添加到字典中,算法如下所示:

                        string filename1 = "asbdahszd2018.02.01.pdf";
                        string filename2 = "foobar2018.02.01.pdf";

                        Dictionary<string, string> myDict = new Dictionary<string,string>();

                        myDict.Add(filename1, filename1.Substring(filename1.Length - 14, 10));
                        myDict.Add(filename2, filename2.Substring(filename2.Length - 14, 10));

                        myDict.OrderBy(item => item.Value);
string filename1=“asbdahszd2018.02.01.pdf”;
字符串filename2=“foobar2018.02.01.pdf”;
Dictionary myDict=新字典();
添加(filename1,filename1.Substring(filename1.Length-14,10));
Add(filename2,filename2.Substring(filename2.Length-14,10));
myDict.OrderBy(item=>item.Value);

您需要解析文件名:

DirectoryInfo info = new DirectoryInfo(path);
FileInfo[] files = info.GetFiles(filter)
    .OrderBy(p => Path.GetFileNameWithoutExtension(p.FullName).Split('_')[1])
    .ToArray();
但这很容易出错


使用linq

就像我说的,这很容易出错,我可能会这样写:

DirectoryInfo info = new DirectoryInfo(path);


FileInfo[] files = (from fileInfo in info.GetFiles(filter)
                    let splitted = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_')
                    where splitted.Length > 1
                    orderby splitted[1]
                    select fileInfo).ToArray();

更好的方法是解析日期时间并对其进行排序。

这也会过滤文件名中没有有效日期的文件

private DateTime? ParseFilename(FileInfo fileInfo)
{
    var parts = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_');
    if (parts.Length < 1)
        return null;

    DateTime result;

    if (!DateTime.TryParse(parts[1], out result))
        return null;

    return result;
}

您需要解析文件名:

DirectoryInfo info = new DirectoryInfo(path);
FileInfo[] files = info.GetFiles(filter)
    .OrderBy(p => Path.GetFileNameWithoutExtension(p.FullName).Split('_')[1])
    .ToArray();
但这很容易出错


使用linq

就像我说的,这很容易出错,我可能会这样写:

DirectoryInfo info = new DirectoryInfo(path);


FileInfo[] files = (from fileInfo in info.GetFiles(filter)
                    let splitted = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_')
                    where splitted.Length > 1
                    orderby splitted[1]
                    select fileInfo).ToArray();

更好的方法是解析日期时间并对其进行排序。

这也会过滤文件名中没有有效日期的文件

private DateTime? ParseFilename(FileInfo fileInfo)
{
    var parts = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_');
    if (parts.Length < 1)
        return null;

    DateTime result;

    if (!DateTime.TryParse(parts[1], out result))
        return null;

    return result;
}

这应该适合您:

DirectoryInfo info = new DirectoryInfo(path);
FileInfo[] files = info.GetFiles(filter).OrderBy(p => Path.GetFileNameWithoutExtension(p.Name).Split('_').Last()).ToArray();

这应该适合您:

DirectoryInfo info = new DirectoryInfo(path);
FileInfo[] files = info.GetFiles(filter).OrderBy(p => Path.GetFileNameWithoutExtension(p.Name).Split('_').Last()).ToArray();

在:
Path.GetFileNameWithoutExtension(p)
仍然无效:
p.Name
不存在exist@KobyDouek再次更新。。(你试过什么吗?)宾果。谢谢您,先生。@KobyDouek您可以检查最新版本。在:
Path.GetFileNameWithoutExtension(p)
仍然无效:
p.Name
仍然无效exist@KobyDouek再次更新。。(你试过什么吗?)宾果。谢谢您,先生。@KobyDouek您可以查看最新版本。