繁体   English   中英

什么是搜索目录中文件的多个扩展名并根据文件名获取最后写入时间的最佳方法

[英]Whats the best way to search files in a directory for multiple extensions and get the last write time according to filename

我很难在forloop中将类型与linq混合。 基本上,我需要使用dbname搜索目录,而不知道文件是.bak还是.7z。 如果有多个具有相同dbname的文件,我需要使用扩展名为.7z的文件。 如果有多个文件具有相同的dbname和扩展名.7z,则需要获取具有最后写入时间的文件。 这是我到目前为止所拥有的。

        string [] files = Directory.GetFiles(directory, "*.*", SearchOption.TopDirectoryOnly);
        foreach (var fileName in files)
        {
            var dbName = "Test";
            var extention7 = ".7z";
            var extentionBak = ".bak";
            if (fileName.Contains(dbName) && (fileName.Contains(extention7) || fileName.Contains(extentionBak)))
            {
                Console.WriteLine(fileName);
            }


        }

获取目录中的文件:

    var sourceFilePaths = Directory.EnumerateFiles(sourceDirectory).Where(f =>  Path.GetExtension(f).ToLower() == ".exe" || 
                                                                                Path.GetExtension(f).ToLower() == ".dll" ||
                                                                                Path.GetExtension(f).ToLower() == ".config");

文件比较:

    var sourceFileInfo = new FileInfo(filePath);
    var destinationFileInfo = new FileInfo(destinationFilePath);

    var isNewer = sourceFileInfo.LastWriteTime.CompareTo(destinationFileInfo.LastWriteTime) > 0;

与其将所有内容打包在一个if条件中,不如将所有情况分开处理:

var dbName = "Test";
var extention7 = ".7z";
var extentionBak = ".bak";
foreach (var fileName in files)
{
    if (!fileName.Contains(dbName)) continue; // wrong base name
    if (File.GetExtension(filename) == extention7)
    {
         // handle this case:
         // extract file date
         // remember latest file
    }
    else if(File.GetExtension(filename) == extentionBak)
    {
            // handle this case
    }
}

我不会为此创建仅LINQ的解决方案-很难理解。

这是我会做的:

string GetDatabaseFile(string folder, string dbName)
{
    var files =
        Directory.EnumerateFiles(folder, dbName + "*.*")
                 .Select(x => new { Path = x, Extension = Path.GetExtension(x) })
                 .Where(x => x.Extension == ".7z" || x.Extension == ".bak")
                 .ToArray();

    if(files.Length == 0)
        return null;
    if(files.Length == 1)
        return files[0].Path;
    var zippedFiles = files.Where(x => x.Extension == ".7z").ToArray();
    if(zippedFiles.Length == 1)
        return zippedFiles[0].Path;
    return zippedFiles.OrderByDescending(x => File.GetLastWriteTime(x.Path))
                      .First().Path;
}

请注意,这没有考虑数据库没有.7z文件而是多个.bak文件的情况。 如果发生这种情况,您需要相应地扩展方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM