如何获得最新或最大文件夹版本?

时间:2015-04-20 06:17:58

标签: c# get version directory

我有一些版本文件夹,如Vx_x_x

我想检索最大文件夹版本。

例如:

文件夹包含,

 V8_2_1
 V9_3_2
 V10_4_1

我想检查V旁边的最大数字,以此类推,以获取最新的文件夹版本。

我能够获得一个文件夹列表,但是如何获得最大数量的混乱。如果有人可以建议我,我会很有帮助。谢谢。

private static void GetFolderVersion()
{
     string startFolder = @"C:\Version\";
     System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);
     IEnumerable<System.IO.DirectoryInfo> directoryList = dir.GetDirectories("*.*", System.IO.SearchOption.AllDirectories);           
}

4 个答案:

答案 0 :(得分:2)

我会考虑使用内置的System.Version类型。假设所有目录名称的格式都是“VX_Y_Z”(其中X,Y和Z表示一个或多个数字,V表示文字“V”),以下代码将执行您想要的操作:

public string GetMaxVersion(IEnumerable<string> directoryNames)
{
    var vDict = directoryNames.ToDictionary(
        s => new Version(s.Substring(1).Replace("_", ".")),
        s => s);
    var maxKey = vDict.Keys.Max();
    return vDict[maxKey];
}

这里我们构建了一个版本到文件名映射的字典(请注意,我们将字符串格式从“VX_Y_Z”更改为“X.Y.Z”以便能够创建System.Version对象)。剩下的就是检索所有字典键的最大值,并返回分配给该给定键的值,这将是您要查找的目录名。

更新:为了完整起见,这里有一段使用上述方法的代码并负责所有事情:

public string GetMaxVersionDirectory(string rootDirectory)
{
    var dirNames = Directory.GetDirectories(rootDirectory, "V*_*_*")
        .Select(dir => Path.GetFileName(dir));
    return GetMaxVersion(dirNames);
}

在您的情况下,您需要将@"C:\Version"作为rootDirectory参数传递。

答案 1 :(得分:0)

尽管这可能有效,但建议使用@jbartuszek使用Version类的解决方案。

沿着这些方向可以做到这一点,但请注意,这是从我的头脑中写的,写在记事本中,因此可能无法构建或包含某种形式的逻辑错误。这只是展示了它的要点:

string[] version = folderName.Split('_');
string[] otherVersion = otherFolderName.Split('_');

然后你编写了一个方法来检查版本的各个部分:

private int CompareVersions(string[] version, string[] otherVersion)
{
    //we won't need the first character (the 'V')
    int vmajor = int.Parse(version[0].Substring(1));
    int vminor = int.Parse(version[1]);
    int vrevision = int.Parse(version[2]);

    int ovmajor = int.Parse(otherVersion[0].Substring(1));
    int ovminor = int.Parse(otherVersion[1]);
    int ovrevision = int.Parse(otherVersion[2]);

    int majorCompare = vmajor.CompareTo(ovmajor);

    //check if major already decides outcome
    if(majorCompare != 0)
    {
        return majorCompare;
    }

    int minorCompare = vminor.CompareTo(ovminor);

    //then if major equal, check if minor decides outcome
    if(minorCompare != 0)
    {
        return minorCompare;
    }

    //lastly, return outcome of revision compare
    return vrevision.CompareTo(ovrevision);
}

这就是你比较两个文件夹名称的方法。如果您想获得最大文件夹版本,可以foreach文件夹名称:

//we'll start out by assigning the first folder name as a preliminary max
string maxFolder = folderNames[1];
string[] maxFolderVersion = maxFolder.Split('_');

foreach(string folderName in folderNames)
{
    if(CompareVersions(folderName.Split('_'), maxFolderVersion) > 0)
    {
        maxFolder = folderName;
    }
}

答案 2 :(得分:0)

如果文件都与您提供的模式匹配,我很想使用正则表达式提取版本信息,然后从主要版本开始选择最高值并进行处理。

更新:将正则表达式中的V替换为您的案例的正确前缀。

var regex = new Regex(@"^V(\d+)_(\d+)_(\d+)$", RegexOptions.Compiled);
var versions = directoryList 
    .Select(f => regex.Match(f))
    .Where(m => m.Success)
    .Select(m => new
    {
        Major = Int32.Parse(m.Groups[1].Value),
        Minor = Int32.Parse(m.Groups[2].Value),
        Patch = Int32.Parse(m.Groups[3].Value)
    }).ToList();

    var major = versions.Max(a => a.Major);
    versions = versions
        .Where(a => a.Major == major)
        .ToList();

    var minor = versions.Max(a => a.Minor);
    versions = versions
        .Where(a => a.Minor == minor)
        .ToList();

    var patch = versions.Max(a => a.Patch);
    versions = versions
        .Where(a => a.Patch == patch)
        .ToList();

    var newest = versions.First();

    var filename = String.Format("V_{0}_{1}_{2}", newest.Major, newest.Minor, newest.Patch);

答案 3 :(得分:0)

您可以使用数学方法。假设您的版本的每个部分都可以达到最大值。 1000.所以基数是1000.版本部分是你的系数,指数是在你的循环中构建的。通过总结coefficent * base ^ exp,您可以获得一个值,您可以将其与最高版本进行比较:

private static string GetHighestFolderVersion()
{

    string startFolder = @"C:\Version\";
    System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);
    IEnumerable<System.IO.DirectoryInfo> directoryList = dir.GetDirectories("*.*", System.IO.SearchOption.AllDirectories);

    KeyValuePair<string, long> highestVersion = new KeyValuePair<string, long>("", 0);
    foreach (System.IO.DirectoryInfo dirInfo in directoryList)
    {
        string versionOrigName = dirInfo.Name;
        string versionStr = versionOrigName.Substring(1);
        List<string> versionParts = versionStr.Split('_').ToList<string>();

        long versionVal = 0;
        int exp = 0;
        for (int i = versionParts.Count - 1; i > -1; i--)
        {
            versionVal += (long.Parse(versionParts[i]) * (long)(Math.Pow(1000, exp)));
            exp++;
        }

        if (versionVal > highestVersion.Value)
        {
            highestVersion = new KeyValuePair<string, long>(versionOrigName, versionVal);
        }
    }

    return highestVersion.Key;
}