Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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_Io - Fatal编程技术网

C# 在多个文件夹中搜索最近的文件名

C# 在多个文件夹中搜索最近的文件名,c#,linq,io,C#,Linq,Io,我有一个目录 在这1个目录中,我有10个子文件夹 在每个子文件夹中都有“n”个文件 每个文件的文件名采用以下格式: yyyymmddhhmissfff.jpg 其中: yyyy=年份值 mm=月值 dd=日值 hh=小时值 mi=分钟值 ss=第二个值 fff=毫秒值 所以我要做的是,例如,我正在搜索最接近20140316182212*.jpg的文件名。我知道我能做到: var files = from file in Directory.EnumerateFiles(searchPath, "

我有一个目录

在这1个目录中,我有10个子文件夹

在每个子文件夹中都有“n”个文件

每个文件的文件名采用以下格式:

yyyymmddhhmissfff.jpg

其中:

yyyy=年份值 mm=月值 dd=日值 hh=小时值 mi=分钟值 ss=第二个值 fff=毫秒值

所以我要做的是,例如,我正在搜索最接近20140316182212*.jpg的文件名。我知道我能做到:

var files = from file in Directory.EnumerateFiles(searchPath, "*.jpg", SearchOption.AllDirectories);
然后我通过枚举结果得到最接近的文件名

但是有没有一种更有效的方法?顺便提一句我无法依赖文件的创建时间戳,因为无法保证文件名与创建日期匹配。

请尝试以下代码:

string path = "C:\\YourFolderName\\";
string filePath = Directory.GetFiles(path, "*.JPG", SearchOption.AllDirectories).First(f => System.IO.Path.GetFileName(f).Contains("20140316182212"));

除了迭代所有文件和检查标准之外,没有其他方法可以通过一些随机条件找到文件。您确实可以编写一些LINQ查询来进行搜索,但它的效率不会更高(可能比手工编写的迭代更快)。例如,某种
OrderBy(name=>DateTime.ParseExact(name,“yyyymmddhhmmsf”,CultureInfo.InvariantCulture)-timeOfMyFile)
可以作为查找的起点。您好,谢谢确认。我也这么想,但我想把问题说出来。谢谢,谢谢你的回复,但这比我之前的回复效率要低。另外,我问了一个关于linq的问题——但感谢您的时间:)这是带有扩展方法的lambda表达式。就像林克。它是linq等效的
var files=来自Directory.GetFiles(路径“*.jpg”,SearchOption.AllDirectories)中的文件,其中file.Contains(“20140316182212”)选择文件嗨,对不起,我没有滚动到最后。我现在来看看这个。但从我所知道的情况来看,这段代码是行不通的。它的末尾有一个
.Contains()
语句,这不是原始帖子所要求的。原始帖子要求查找与时间戳最近的文件名,而不是精确匹配的文件名。
var file = "20140316182212.jpg";    
var fileNum = Convert.ToInt64(Path.GetFileNameWithoutExtension(file));

var minDiff = Directory.EnumerateFiles(searchPath, "*.jpg", SearchOption.AllDirectories)
             .Select(path => Convert.ToInt64(Path.GetFileNameWithoutExtension(path)))
             .Min(num => Math.Abs(fileNum - num));

var result = Directory.EnumerateFiles(searchPath, "*.jpg", SearchOption.AllDirectories)
            .First(path => Math.Abs(fileNum - Convert.ToInt64(Path.GetFileNameWithoutExtension(path))) == minDiff);