2016-04-13 47 views
-2

İç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ı
+1

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

+1

Oluşturulan/değiştirilen tarih çok daha doğru olmaz mı? – Soundararajan

+1

Eminim buna izin verebilirsin. Denediğiniz bir şeyi yayınlayın –

cevap

1

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 
..... 
+0

Teşekkür ederim çalışıyor –

0

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.

1

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; 
} 
0

, 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; 
     } 
    } 
} 
+0

Tarihleri ​​kullanamıyorum: \ –