İçinde Update10, Update15, Update13 ve benzeri birçok klasörün bulunduğu Updates adlı bir dizin var. En son güncellemeyi, klasör adındaki sayıları karşılaştırarak ve bu klasöre giden yolu döndürebilmem gerekiyor. Herhangi bir yardımBir dizinde en yeni güncelleştirmeyi arama C#
aprecciated olacağınıcevap
Sen LINQ kullanabilirsiniz: LINQ böyle yan etkilere neden olmamalıdır çünkü dışarı-parametresi olarak
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;
}
A cleaner version yerel değişken kullanmak yerine int?
döndüren bir yöntem kullanır . Zararlı olabilirler. Bir not: Şu anda sorgu büyük/küçük harfe duyarlıdır, geçerli bir dizin olarak UPDATE11
tanımamıştır. Eğer harf duyarsız karşılaştırmak isterseniz uygun StartsWith
aşırı kullanmak zorunda:
.....
.Where(x => x.directoryName.StartsWith("Update", StringComparison.InvariantCultureIgnoreCase)) // precheck
.....
Teşekkür ederim çalışıyor –
iyi yaklaşım soru anlaşılacağı içinde yorum olarak değiştirilme tarihini kullanmaktır. Ancak dizeleri sayı olarak sıralamak için IComparer kullanmak için gidebilirsiniz. Bu zaten yapılmıştır ve dizinleri aldıktan sonra numunenin
ile here
düzenlemek bulunabilir: dirs en son öğe son "modifiye
string[] dirs = System.IO.Directory.GetDirectories(); var numComp = new NumericComparer(); Array.Sort(dirs, numComp);
olduğunu
"dizin.Bu işlev, son güncelleme dizin yolunu almak için LINQ kullanır. Eğer klasörlerin oluşturulma tarihi güvenebilirsiniz varsa
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;
}
, sen MoreLinq's MaxBy()
yararlanarak bu kolaylaştırabilirsiniz: Referans olarak
string updatesFolder = "D:\\TEST\\Updates"; // Your path goes here.
var newest = Directory.EnumerateDirectories(updatesFolder, "Update*")
.MaxBy(folder => new DirectoryInfo(folder).CreationTime);
, MaxBy()
bir uygulamasıdır:
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;
}
}
}
Tarihleri kullanamıyorum: \ –
Her klasör "Güncelle" sözcüğü ve ardından bir veya daha fazla sayı ile başlar? Ve daha yüksek sayı en yenisidir? – Steve
Oluşturulan/değiştirilen tarih çok daha doğru olmaz mı? – Soundararajan
Eminim buna izin verebilirsin. Denediğiniz bir şeyi yayınlayın –