Получить список файлов с сортировкой по дате

  • Автор темы Автор темы theinova
  • Дата начала Дата начала

theinova

Client
Регистрация
07.09.2016
Сообщения
133
Реакции
85
Баллы
28
Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.
 
Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.

C#:
Развернуть Свернуть Копировать
List<string> files = Directory.GetFiles(project.Directory).ToList();
List<string> times = new List<string>();
List<string> times2 = new List<string>();
List<string> dates = new List<string>();
List<string> cor = new List<string>();
List<string> sort = new List<string>();
List<string> resultat = new List<string>();
var table = project.Tables["Таблица 1"];
table.Clear();
for(int i = 0; i<files.Count; i++) {
    times.Add(File.GetLastWriteTime(files[i]).ToString()); //время в отдельном файле
    table.AddRow(files[i]+";"+File.GetLastWriteTime(files[i]).ToString());
}
//Теперь нужно обработать и отрезать
//1 переводим дату в корректный формат
for(int i = 0 ; i < times.Count; i++) {
    string curable = times[i];
    var cured = curable.Split(new [] {" "},StringSplitOptions.None).ToList();
    times2.Add(cured[0].ToString());
    dates.Add(cured[1].ToString());
}
// соединяем дату в корректный формат
for(int i = 0 ; i < times2.Count ; i++) {
    var correct = times2[0].Split(new [] {"."},StringSplitOptions.None).ToList();
    string result = correct[2]+"."+correct[1]+"."+correct[0];
    cor.Add(result);
}
// теперь добавляем время к корректной дате Формируем список для сортировки
for(int i = 0 ; i < cor.Count ; i++) {
    sort.Add(cor[i]+" "+dates[i]);
}
//Сортируем список Sort через Sort
sort.Sort();
times2.Clear(); //Очищаем старые данные
dates.Clear(); //Оставляем место для новых
cor.Clear();
//Теперь нужно вернуть значения обратно. применяем ранее известные функции сплитов и возвращаемся к исходному значению.
for(int i = 0 ; i < sort.Count; i++) {
    string sorted = sort[i];
    var letsback = sorted.Split(new [] {" "},StringSplitOptions.None).ToList();
    times2.Add(letsback[0].ToString());
    dates.Add(letsback[1].ToString());
}
//Абсолютно такой же цикл, переворачивающий дату задом наперёд
for(int i = 0 ; i < times2.Count ; i++) {
    var correct = times2[0].Split(new [] {"."},StringSplitOptions.None).ToList();
    string result = correct[2]+"."+correct[1]+"."+correct[0];
    cor.Add(result);
}
//Снова соединяем значения
for(int i = 0 ; i < cor.Count ; i++) {
    sort.Add(cor[i]+" "+dates[i]);
}
// а теперь ищем по отсортированным значениям - совпадения из times - исходного файла
/*for(int i = 0 ; i < sort.Count ; i++) {
    for(int j=0; j < cor.Count ; j++) {
            
    }
}*/
for(int i = 0; i < times.Count ; i++) {
    for(int j = 0 ; j <sort.Count ; j++) {
        if(sort[i].Contains(times[j]))
            resultat.Add(table.GetCell(0,j));
    }
}

Очень большой и страшный код. Я напутал в индексах с последнем цикле, ошибку не понял, но до него все работает. Вернусь немного позже.
 
C#:
Развернуть Свернуть Копировать
List<string> files = Directory.GetFiles(project.Directory).ToList();
List<string> times = new List<string>();
List<string> times2 = new List<string>();
List<string> dates = new List<string>();
List<string> cor = new List<string>();
List<string> sort = new List<string>();
List<string> resultat = new List<string>();
var table = project.Tables["Таблица 1"];
table.Clear();
for(int i = 0; i<files.Count; i++) {
    times.Add(File.GetLastWriteTime(files[i]).ToString()); //время в отдельном файле
    table.AddRow(files[i]+";"+File.GetLastWriteTime(files[i]).ToString());
}
//Теперь нужно обработать и отрезать
//1 переводим дату в корректный формат
for(int i = 0 ; i < times.Count; i++) {
    string curable = times[i];
    var cured = curable.Split(new [] {" "},StringSplitOptions.None).ToList();
    times2.Add(cured[0].ToString());
    dates.Add(cured[1].ToString());
}
// соединяем дату в корректный формат
for(int i = 0 ; i < times2.Count ; i++) {
    var correct = times2[0].Split(new [] {"."},StringSplitOptions.None).ToList();
    string result = correct[2]+"."+correct[1]+"."+correct[0];
    cor.Add(result);
}
// теперь добавляем время к корректной дате Формируем список для сортировки
for(int i = 0 ; i < cor.Count ; i++) {
    sort.Add(cor[i]+" "+dates[i]);
}
//Сортируем список Sort через Sort
sort.Sort();
times2.Clear(); //Очищаем старые данные
dates.Clear(); //Оставляем место для новых
cor.Clear();
//Теперь нужно вернуть значения обратно. применяем ранее известные функции сплитов и возвращаемся к исходному значению.
for(int i = 0 ; i < sort.Count; i++) {
    string sorted = sort[i];
    var letsback = sorted.Split(new [] {" "},StringSplitOptions.None).ToList();
    times2.Add(letsback[0].ToString());
    dates.Add(letsback[1].ToString());
}
//Абсолютно такой же цикл, переворачивающий дату задом наперёд
for(int i = 0 ; i < times2.Count ; i++) {
    var correct = times2[0].Split(new [] {"."},StringSplitOptions.None).ToList();
    string result = correct[2]+"."+correct[1]+"."+correct[0];
    cor.Add(result);
}
//Снова соединяем значения
for(int i = 0 ; i < cor.Count ; i++) {
    sort.Add(cor[i]+" "+dates[i]);
}
// а теперь ищем по отсортированным значениям - совпадения из times - исходного файла
/*for(int i = 0 ; i < sort.Count ; i++) {
    for(int j=0; j < cor.Count ; j++) {
           
    }
}*/
for(int i = 0; i < times.Count ; i++) {
    for(int j = 0 ; j <sort.Count ; j++) {
        if(sort[i].Contains(times[j]))
            resultat.Add(table.GetCell(0,j));
    }
}

Очень большой и страшный код. Я напутал в индексах с последнем цикле, ошибку не понял, но до него все работает. Вернусь немного позже.
покопай в сторону linq. Там всё одной строкой делается
 
  • Спасибо
Реакции: TwistDanceR
Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.

Вот ещё решение. Уже работает до конца. В проекте нужны только "Список 1" и "Таблица 1".
C#:
Развернуть Свернуть Копировать
List<string> files = Directory.GetFiles(project.Directory).ToList();
var table = project.Tables["Таблица 1"];
table.Clear();
project.Lists["Список 1"].Clear();
foreach(string item in files)
    table.AddRow(item+";"+File.GetLastWriteTime(item).ToString());
List<string> times = table.GetColumn(1).ToList();
List<string> cortimes = new List<string>();
List<string> end = new List<string>();
List<string> final = new List<string>();
foreach(string time in times) {
    var result = time.Split(new [] {" "},StringSplitOptions.None).First().ToString();
    var date = time.Split(new [] {" "},StringSplitOptions.None).Last().ToString();
    var res2 = result.Split(new [] {"."},StringSplitOptions.None).ToList();
    res2.Reverse();
    cortimes.Add(String.Join(".",res2)+" "+date);
}
cortimes.Sort(); //сортировали
foreach(string sorted in cortimes) {
    var corres = sorted.Split(new [] {" "},StringSplitOptions.None).First().ToString();
    var cordate = sorted.Split(new [] {" "},StringSplitOptions.None).Last().ToString();
    var cor2 = corres.Split(new [] {"."},StringSplitOptions.None).ToList();
    cor2.Reverse();
    end.Add(String.Join(".",cor2)+" "+cordate);
}
for(int i=0;i<end.Count; i++) {
    for(int j=0;j<table.RowCount;j++) {
        if(end[i]==table.GetCell(1,j)) final.Add(table.GetCell(0,j));
    }
}
project.Lists["Список 1"].AddRange(final);

покопай в сторону linq. Там всё одной строкой делается
Так получше будет? ))
 
Вот ещё решение. Уже работает до конца. В проекте нужны только "Список 1" и "Таблица 1".
C#:
Развернуть Свернуть Копировать
List<string> files = Directory.GetFiles(project.Directory).ToList();
var table = project.Tables["Таблица 1"];
table.Clear();
project.Lists["Список 1"].Clear();
foreach(string item in files)
    table.AddRow(item+";"+File.GetLastWriteTime(item).ToString());
List<string> times = table.GetColumn(1).ToList();
List<string> cortimes = new List<string>();
List<string> end = new List<string>();
List<string> final = new List<string>();
foreach(string time in times) {
    var result = time.Split(new [] {" "},StringSplitOptions.None).First().ToString();
    var date = time.Split(new [] {" "},StringSplitOptions.None).Last().ToString();
    var res2 = result.Split(new [] {"."},StringSplitOptions.None).ToList();
    res2.Reverse();
    cortimes.Add(String.Join(".",res2)+" "+date);
}
cortimes.Sort(); //сортировали
foreach(string sorted in cortimes) {
    var corres = sorted.Split(new [] {" "},StringSplitOptions.None).First().ToString();
    var cordate = sorted.Split(new [] {" "},StringSplitOptions.None).Last().ToString();
    var cor2 = corres.Split(new [] {"."},StringSplitOptions.None).ToList();
    cor2.Reverse();
    end.Add(String.Join(".",cor2)+" "+cordate);
}
for(int i=0;i<end.Count; i++) {
    for(int j=0;j<table.RowCount;j++) {
        if(end[i]==table.GetCell(1,j)) final.Add(table.GetCell(0,j));
    }
}
project.Lists["Список 1"].AddRange(final);


Так получше будет? ))
говорю же, 1 строка)
 
Последнее редактирование модератором:
Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.

Пожалуйста...
 
  • Спасибо
Реакции: doc
Что именно необходимо реализовать?
Окончательная цель загрузить профиль с самой ранней датой сохранения. Поэтому получение списка файла отсуртированного по дате сохранения очень интересная возможность. Это многим пригодится для выбора очередного(самого старого) профиля для обработки. Или самого нового, например загрузить только что обработанный профиль другим шаблоном.
 
Поэтому получение списка файла отсуртированного по дате сохранения очень интересная возможность.
List<string> files - это объект списка.
Поэтому взаимодействуйте с ним:
C#:
Развернуть Свернуть Копировать
project.Variables["var"].Value = files[0]; // Первый элемент списка
project.Variables["var"].Value = files.Last(); // Последний элемент списка

// Если необходимо работать с обычным списком из ZP. То сначала объявите его в кубике и в конце добавьте в него массив из временного списка files.
IZennoList lst = project.Lists["lst"]; // Объявление списка
lst.AddRange(files);

Полный код

C#:
Развернуть Свернуть Копировать
IZennoList lst = project.Lists["lst"];

List<string> files = Directory.GetFiles(@"C:\Users\User\Downloads").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(files);

project.Variables["var"].Value = lst.Last();
 
List<string> files - это объект списка.
Поэтому взаимодействуйте с ним:
C#:
Развернуть Свернуть Копировать
project.Variables["var"].Value = files[0]; // Первый элемент списка
project.Variables["var"].Value = files.Last(); // Последний элемент списка

// Если необходимо работать с обычным списком из ZP. То сначала объявите его в кубике и в конце добавьте в него массив из временного списка files.
IZennoList lst = project.Lists["lst"]; // Объявление списка
lst.AddRange(files);

Полный код

C#:
Развернуть Свернуть Копировать
IZennoList lst = project.Lists["lst"];

List<string> files = Directory.GetFiles(@"C:\Users\User\Downloads").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(files);

project.Variables["var"].Value = lst.Last();

Спасибо большое!!!

А тут можно дописать чтобы при неудаче Exception возвратить по BAD чтоб отработал?
 
throw new Exception("выходим по красной");

Допишите к условию, если список пустой допустим
 
было бы удобно в кубике иметь галку - сортировка по дате, мне нужно вернуть список в список зеннопостера, я не понял как это сделать, в кубике с есть вернуть в переменную, подскажите пожалуйста как
List<string> files = Directory.GetFiles(@"C:\Users\User\Downloads").OrderBy(f => File.GetLastWriteTime(f)).ToList();
вернуть вставить в список
зеннопостера
чтобы в итоге получить список в зеннопостере где файлы по дате отсортированы

разобрался благодаря коду выше,

IZennoList profiles = project.Lists["profiles"]; // Объявление списка profiles.AddRange(files);
тупил потому что название списка lst меня путало, думал это 1 ячейка

Разрабы добавьте в кубик варианты сортировки плиз, я думал кубик вернёт в такой сортировке которая указана у винды в папке, но нет
 
Последнее редактирование:

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)