Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Linq_File Extension - Fatal编程技术网

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

C# 在一个目录中搜索多个扩展名的文件并根据文件名获取上次写入时间的最佳方法是什么,c#,.net,linq,file-extension,C#,.net,Linq,File Extension,我很难在forloop中混合linq类型。基本上,我需要用dbname搜索一个目录,不知道文件是.bak还是.7z。如果有多个文件具有相同的dbname,我需要获取扩展名为.7z的文件。如果有多个文件具有相同的dbname和extention.7z,我需要获取具有上次写入时间的文件。这就是我目前所拥有的 string [] files = Directory.GetFiles(directory, "*.*", SearchOption.TopDirectoryOnly);

我很难在forloop中混合linq类型。基本上,我需要用dbname搜索一个目录,不知道文件是.bak还是.7z。如果有多个文件具有相同的dbname,我需要获取扩展名为.7z的文件。如果有多个文件具有相同的dbname和extention.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;
。 .

文件比较:

    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;

如果您应单独处理所有箱子,而不是将所有货物包装在一个箱子中:

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文件的情况。如果出现这种情况,则需要相应地扩展该方法