2016-05-11 3 views
-1

У меня есть каталог со многими папками, имена - это номера, которые всегда восходящие.Получить последний каталог внутри каталога, упорядочивая его по имени

Пример:

1 
2 
3 
4 
5 
6 
7 

Итак, предположим, что они находятся внутри c:\folders\

Чтобы получить последнюю папку(), я бы это сделать:

string[] folders = Directory.GetDirectories("c:\folders\", "*", 
       SearchOption.AllDirectories) 

А потом возьмите последний элемент строки.

Но в этом каталоге имеется более 5000 папок, поэтому getdirectories занимает около 1 минуты для запуска.

Почему я это делаю:

У меня есть исходный каталог и каталог назначения. Я копирую все новые папки и их содержимое в исходном тексте (да, резервная копия).

Это то, что в настоящее время делает мой код:

string[] directories = Directory.GetDirectories(source, "*", 
        SearchOption.AllDirectories); 

foreach (string dirPath in directories) 
    Directory.CreateDirectory(dirPath.Replace(source, target)); 

foreach (string newPath in Directory.GetFiles(source, "*.*", 
    SearchOption.AllDirectories)) 
{ 
    if (!File.Exists(newPath.Replace(source, target)) && !newPath.Contains("\\Temp\\")) 
    { 
     File.Copy(newPath, newPath.Replace(source, target), false); 
    } 
} 

После того как я получить последнюю папку, мне нужно создать каталоги и скопировать файлы внутри только папки, которые приходят после него в исходном каталоге.


Итак, как я могу получить папку с наивысшим наименованием (числом) быстрее? Я мог бы создать файл TXT, чтобы отслеживать последнюю вставленную папку, но не очень хороший способ иметь дополнительные файлы, которые можно изменить.

Ах, источник содержит несколько папок с буквами, например Temp, например. Я хочу игнорировать эти папки и получать только те, у которых есть только числовое имя.

Я знаю, что вопрос звучит слишком широк, я не прошу кого-либо выполнять свою работу, я просто хочу идею, я не нашел подходящего способа сделать это после некоторых исследований.

ответ

0

Во многих случаях я слышал, что Directory.EnumerateDirectories(string path) намного лучше перечислять.

var path = @"C:\test"; 
var highestNumberedDirectory = Directory.EnumerateDirectories(path) 
            // Gets just the folder names without the full path 
            .Select(d => ParseNumber(d.Split('\\').Last())) 
            // Orders the results by number. If you don't convert to int first then you'll start seeing some 
            // ordering you might not expect. 1, 11, 2, 22, etc. 
            .OrderBy(d=>d) 
            // Gets the highest numbered result, ignoring nulls. 
            .LastOrDefault(d => d != null); 

private int? ParseNumber(string potentialNumber) { 
    int result; 
    if (int.TryParse(potentialNumber, out result)) { 
     return result; 
    } 

    return null; 
} 

структура каталогов выглядит следующим образом:

1 
2 
3 
10 
11 
12 
20 
21 
22 
bad 
__ok 

и возвращает 22. Если вам нужен полный путь, вы можете просто добавить его к оригинальному пути

+0

Перечислите Каталоги предназначены только для .NET 4.0. Я забыл упомянуть, что я использую 2.0 – Phiter

+0

А, это, безусловно, меняет вещи :) – KSib

+0

Я сделал некоторые тяжелые исследования этим утром и до сих пор не смог получить желаемые результаты. – Phiter

0

просто реализовать IComparer перечислите и сравните последний пункт по пути в классе Stringcomparer

Импорт системы.Коллекции

Public Класс StringComparer: Реализует IComparer (Of String) Public Function Сравнить (ByVal х As String, ByVal Y As String) As Integer Implements IComparer (Of String) .Compare

x = Split(x, "\")(Split(x, "\").Length - 1) 
    y = Split(y, "\")(Split(y, "\").Length - 1) 
    Dim ix As Int16 
    Dim iy As Int16 

    If Not Integer.TryParse(x, ix) Then 

     ix = -1 

    End If 

    If Not Integer.TryParse(y, iy) Then 

     iy = -1 

    End If 



    If ix > iy Then 


     Return 1 

    End If 

    If ix < iy Then 


     Return -1 

    End If 

    ' Return 0 
End Function 

End Class

, а затем в коде

Dim FilesArray As String() 
    FilesArray = Directory.GetDirectories(path) 


    Dim ListofStrFile As New List(Of String) 
    ListofStrFile.AddRange(FilesArray) 

    ' take instance of Stringcomparer clases it to sort method 'method 
    Dim dc As New Stringcomparer 


    ListofStrFile.Sort(dc)