在目录中搜索多个扩展名的文件并根据文件名获取最后写入时间的最佳方法是什么
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。如果有多个文件具有相同的数据库名称,我需要获取扩展名为 .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 文件的情况。如果会出现这种情况,需要相应的扩展方法。
我很难在 forloop 中将类型与 linq 混合使用。基本上我需要搜索一个带有 dbname 的目录,不知道文件是 .bak 还是 .7z。如果有多个文件具有相同的数据库名称,我需要获取扩展名为 .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 文件的情况。如果会出现这种情况,需要相应的扩展方法。