我有一个名为Updates的目录,里面有许多名为Update10,Update15,Update13的文件夹,依此类推。 我需要通过比较文件夹名称上的数字并返回该文件夹的路径来获取最新的更新。 任何帮助都是aprecciated
答案 0 :(得分:1)
您可以使用LINQ:
int updateInt = 0;
var mostRecendUpdate = Directory.EnumerateDirectories(updateDir)
.Select(path => new
{
fullPath = path,
directoryName = System.IO.Path.GetFileName(path) // returns f.e. Update15
})
.Where(x => x.directoryName.StartsWith("Update")) // precheck
.Select(x => new
{
x.fullPath, x.directoryName,
updStr = x.directoryName.Substring("Update".Length) // returns f.e. "15"
})
.Where(x => int.TryParse(x.updStr, out updateInt)) // int-check and initialization of updateInt
.Select(x => new { x.fullPath, x.directoryName, update = updateInt })
.OrderByDescending(x => x.update) // main task: sorting
.FirstOrDefault(); // return newest update-infos
if(mostRecendUpdate != null)
{
string fullPath = mostRecendUpdate.fullPath;
int update = mostRecendUpdate.update;
}
cleaner version使用的方法返回int?
而不是将局部变量用作out参数,因为LINQ不应该导致这样的副作用。它们可能是有害的。
一个注意事项:目前查询区分大小写,它不会将UPDATE11
识别为有效目录。如果您想比较不区分大小写,则必须使用适当的StartsWith
重载:
.....
.Where(x => x.directoryName.StartsWith("Update", StringComparison.InvariantCultureIgnoreCase)) // precheck
.....
答案 1 :(得分:1)
此函数使用LINQ获取最后一个更新目录路径。
public string GetLatestUpdate(string path)
{
if (!path.EndsWith("\\")) path += "\\";
return System.IO.Directory.GetDirectories(path)
.Select(f => new KeyValuePair<string, long>(f, long.Parse(f.Remove(0, (path + "Update").Length))))
.OrderByDescending(kvp => kvp.Value)
.First().Key;
}
答案 2 :(得分:0)
最好的方法是使用修改日期作为有问题的评论建议。 然而,要将字符串排序为数字,您可以使用IComparer。 这已经完成,可以在here
中找到使用示例进行编辑
获得目录后:
string[] dirs = System.IO.Directory.GetDirectories();
var numComp = new NumericComparer();
Array.Sort(dirs, numComp);
dirs 中的最后一项是您的最后一项&#34;已修改&#34; 。目录
答案 3 :(得分:0)
如果您可以依赖文件夹的创建日期,则可以使用MoreLinq's MaxBy()
来简化此操作:
string updatesFolder = "D:\\TEST\\Updates"; // Your path goes here.
var newest = Directory.EnumerateDirectories(updatesFolder, "Update*")
.MaxBy(folder => new DirectoryInfo(folder).CreationTime);
作为参考,MaxBy()
的实现是:
public static class EnumerableMaxMinExt
{
public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{
return source.MaxBy(selector, Comparer<TKey>.Default);
}
public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector, IComparer<TKey> comparer)
{
using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
{
if (!sourceIterator.MoveNext())
{
throw new InvalidOperationException("Sequence was empty");
}
TSource max = sourceIterator.Current;
TKey maxKey = selector(max);
while (sourceIterator.MoveNext())
{
TSource candidate = sourceIterator.Current;
TKey candidateProjected = selector(candidate);
if (comparer.Compare(candidateProjected, maxKey) > 0)
{
max = candidate;
maxKey = candidateProjected;
}
}
return max;
}
}
}