使用文件名获取文件。可能有多个名称相似的文件_1,_2等

时间:2014-01-28 14:59:35

标签: c# file

我使用以下内容来获取文件的大小

FileInfo(filePath).Length

当然有效。

文件路径类似于

Live\Sites\User\297387\XYZ - ABC

但是当文件重复时会出现问题

Live\Sites\User\297387\XYZ - ABC_2

有没有办法可以获得名称匹配的文件的最新版本

Live\Sites\User\297387\XYZ - ABC

所以我有以下文件

Live\Sites\User\297387\XYZ - ABC
Live\Sites\User\297387\XYZ - ABC_1
Live\Sites\User\297387\XYZ - ABC_2

我需要获得最新的匹配

Live\Sites\User\297387\XYZ - ABC

4 个答案:

答案 0 :(得分:1)

使用FileSystemWatcher

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = " Live\Sites\User\297387\XYZ";
watcher.Changed += new FileSystemEventHandler(OnChanged);


private static void OnChanged(object source, FileSystemEventArgs e)
{
    // Specify what is done when a file is changed, created, or deleted.
   Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
}

答案 1 :(得分:1)

您可以使用Path类和LINQ:

string fileName = Path.GetFileName(filePath);
string dir = Path.GetDirectoryName(filePath);
var latestFile = new DirectoryInfo(dir)
    .EnumerateFiles("*.*", SearchOption.TopDirectoryOnly)
    .Where(file => file.Name.StartsWith(fileName))
    .OrderByDescending(file => file.LastAccessTime)
    .First();
long len = latestFile.Length;

如果您不想查看上次访问时间但_后面的数字,您可以使用此查询:

var latestFile = new DirectoryInfo(dir)
    .EnumerateFiles("*.*", SearchOption.TopDirectoryOnly)
    .Where(file => file.Name.StartsWith(fileName))
    .Select(file => 
    {
        int index = file.Name.LastIndexOf('_');
        string vStr = "0";
        if(index >= 0)
            vStr = file.Name.Substring(index + 1);
        int version;
        if(!int.TryParse(vStr, out version))
            version = 0;
        return new { file, version }; 
    })
    .OrderByDescending(xFile => xFile.version)
    .Select(xFile => xFile.file)
    .First();

答案 2 :(得分:1)

此LinQ查询获取目录中的最后一个文件:

var lastFile = (from a in directoryInfo.EnumerateFiles()
                        orderby a.CreationTime descending
                        select a).FirstOrDefault();

var lastFile = (from a in directoryInfo.EnumerateFiles()
                        orderby a.CreationTime
                        select a).LastOrDefault();

答案 3 :(得分:1)

这是我“最干净”的首选解决方案:

string regx = "file"; // replace this with your actual "base" file name
var f = Directory.EnumerateFiles("C:\\") // replace with your directory path
    .Where(fn=>
        System.Text.RegularExpressions.Regex.IsMatch(fn, regx, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
    .Select(fn=>new FileInfo(fn))
    .Aggregate( (f1,f2) => f1.LastWriteTime> f2.LastWriteTime? f1 : f2);

这将匹配C:\中包含word文件的所有文件 - 然后选择最近编写的文件。