我有一个包含多个文件,一些目录.txt
和一些.sql
。让我们只关注.sql
文件。
这些文件包含我需要解析并稍后执行的sql语句,但是这些文件的名称1_ORCA_3_9_56.sql
与99_ACT_VERSAO.sql
或和其他名称相同,唯一重要的部分是它们启动时所用的编号,它将决定我执行它们所需的顺序。
我使用Linq制作了一个函数,该文件将按升序排列所有文件(实际上是检索它们的全名/路径,这就是我所需要的文件)的列表,从而为我提供了一个列表,但查询返回了0个项目。
这是功能:
public List<string> ListaDeFicheiros(string Directoria)
{
Global.Erro = "";
Global.ErroGrave = false;
string caminho = "";
var Paths = new List<string>();
Version version = null;
var lastVersion = new DirectoryInfo(Directoria).EnumerateFiles()
.Where(d => d.Name.ToLower().EndsWith(".sql"))
.Select(d => new { Directory = d.Directory, Token = d.Name.Split('_') })
//.Select(d => new { Directory = d, Token = d.Name.Split('_') })
.Where(x => x.Token.Length == 3 && Version.TryParse(x.Token[2], out version))
.Select(x => new { Directory = x.Directory, Date = x.Token[1], Version = version })
.OrderByDescending(x => x.Version)
.Select(x => x.Directory.FullName);
Paths = lastVersion.ToList();
return Paths;
}
任何帮助将不胜感激,任何问题都只能发表评论,我将尽可能详细地回答。
请记住,我只需要获取.sql文件并忽略任何其他扩展名。
我建议Directory.GetFiles()
仅使用枚举“ * .sql”文件。然后,我使用Select
并创建一个包含完整路径和已解析版本的匿名类型。
为了解析版本,我使用Path.GetFileName()
了不带路径的文件名。如果文件名格式不正确,则将版本设置为-1
。
然后,我筛选有效版本,按该版本对枚举排序并返回已排序文件名的列表:
List<string> Paths = Directory.GetFiles(Directoria, "*.sql", SearchOption.TopDirectoryOnly).
Select(f => {
int version;
string[] parts = Path.GetFileName(f).Split('_');
if (parts.Length < 1 || !int.TryParse(parts[0], out version))
version = -1;
return new {File = f, Version = version};
}).
Where(f => f.Version > -1).
OrderBy(f => f.Version).
Select(f => f.File).ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句