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

theinova

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

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.
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));
    }
}
Очень большой и страшный код. Я напутал в индексах с последнем цикле, ошибку не понял, но до него все работает. Вернусь немного позже.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
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

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.
Вот ещё решение. Уже работает до конца. В проекте нужны только "Список 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. Там всё одной строкой делается
Так получше будет? ))
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
Вот ещё решение. Уже работает до конца. В проекте нужны только "Список 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 строка)
 
Последнее редактирование модератором:

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Последнее редактирование модератором:

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.
Пожалуйста...
 
  • Спасибо
Реакции: doc

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
  • Спасибо
Реакции: doc

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
  • Спасибо
Реакции: TwistDanceR и doc

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Что именно необходимо реализовать?
Окончательная цель загрузить профиль с самой ранней датой сохранения. Поэтому получение списка файла отсуртированного по дате сохранения очень интересная возможность. Это многим пригодится для выбора очередного(самого старого) профиля для обработки. Или самого нового, например загрузить только что обработанный профиль другим шаблоном.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Поэтому получение списка файла отсуртированного по дате сохранения очень интересная возможность.
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();
 

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
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 чтоб отработал?
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 913
Благодарностей
1 122
Баллы
113
throw new Exception("выходим по красной");

Допишите к условию, если список пустой допустим
 

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