2017-04-17 44 views
1

我想按照它们存在于窗口资源管理器中的顺序提取所有文件名。我GOOGLE了,发现很多答案,但这没有奏效。我有以下顺序的文件名:如何从目录中获取文件名,因为它存在于C#中?

video_1 
video_2 
video_3 
video_10 
video_15 
video_20 
video_21 

我想以相同的顺序,但结果以下面的形式出现。

video_1 
video_10 
video_10 
video_2 
video_20 
video_21 

我曾尝试以下代码:

var fileNames= Directory.GetFiles(basePath, "*" + fileExtension) //Not worked 
DirectoryInfo info = new DirectoryInfo(basePath); 
var filenames = info.GetFiles().OrderBy(p => p.CreationTIme).ToArray(); //Not worked 

有人告诉我,我怎么能做到这一点?

+0

well'.OrderBy(p => p.CreationTIme)'不会按照创建时间的顺序工作。尝试将它们与文件名进行排序。 –

+0

文件名也不起作用 – Umer

+0

@Steve - 这可能是一个重复的问题,但不是你关闭的那个。那个是VB.Net,因此不是一个确切的重复。将搜索在C#中找到一个# –

回答

3

订单“不正确”的原因是因为名称是字符串,因此按字符串排序。你想要什么是它的数字部分订购:

DirectoryInfo info = new DirectoryInfo(""); 
var files = info.GetFiles() 
       .OrderBy(p => p.FullName.Split('_')[0]) 
       .ThenBy(p => int.Parse(p.FullName.Split('_')[1])); 

如果你不知道的格式是完全一样的(有_,然后一个有效的数字),那么你可以:

Func<string, int, int> parseIntOrDefault = (input, defaultValue) => 
{ 
    int value = defaultValue; 
    int.TryParse(input, out value); 
    return value; 
}; 

var result = from file in info.GetFiles() 
      let sections = file.FullName.Split('_') 
      orderby sections[0], sections.Length == 2 ? 
       parseIntOrDefault(sections[1], int.MaxValue) : int.MaxValue 
      select file; 
+0

如果@Umer想要像文件系统一样排序,我会认为这将是对他的问题更合适的答案http://stackoverflow.com/questions/1601834/c-实施 - 或 - alternative-to-strcmplogicalw -in-SHLWAPI的DLL。实际的问题包含我认为他应该使用的代码。虽然他们的答案没有问题,但如果他改变格式,它就不会继续工作。 –

+0

@MaxYoung它适合我。最后。请将此评论写为答案,以便我可以将其标记出来,其他人可以从中获得帮助 – Umer

+0

@我自从复制件被接受以来无法使用。我只想提出这个问题。很高兴它对你有效。 –

相关问题