Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2024, 11:01   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Сортировка по дате создания файла в TStringList

Добрый день!

Есть такой код, который сортирует файлы по времени их создания от самого последнего до первого, в обратном порядке.
Проблема в том, что мне нужно, в Memo2 вывести не только полученную дату создания файлов, но, и их имена, для дальнейшего действия над ними.
Вот код:
Код:
function CompareDates(List: TStringList; SortStart,SortFinish: Integer): Integer;
begin
  Result:=CompareValue(StrToDate(List[SortFinish]),StrToDate(List[SortStart]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SRList: TSringList;
begin
  SRList:=TStringList.Create;
  Memo2.Clear;
  try
    for i:=0 to Memo1.Lines.Count - 1 do
    begin
       SRList.Add(GetBefore(' ',DateTimeToStr(GetFiileDateTime(Memo1.Lines[i]))));
    end;
    SRList.CustomSort(CompareDates);
    Memo2.Lines.Assign(SRList);
  finally
    SRList.Free;
  end;
end;
Прошу помощи в доработке кода.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.04.2024, 12:37   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. добавлять не только дату, но и имя файла
Код:
datetimetostr(... ) + '|' +Memo1.Lines[i];
2. сравнивать не весь текст, а только часть содержащую дату
Код:
 strtodate( copy(list[sortfinish], 1, ???);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 11.04.2024, 13:19   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
1. добавлять не только дату, но и имя файла
Код:
datetimetostr(... ) + '|' +Memo1.Lines[i];
2. сравнивать не весь текст, а только часть содержащую дату
Код:
 strtodate( copy(list[sortfinish], 1, ???);
Спасибо за помощь!

А вместо ??? нужно какое значение подставить? 10? В дате же 10 символов...
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.04.2024, 16:04   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

у меня долго, но так реализовано. 10 лет назад чего-то делал для переименование 50-60 тыс. файлов в папке.
Код:
//----- сортируем список по времени создания в порядке убывания ----------
if(RadioButton9.Checked=True)then
      begin
         //----- переименовываем список на промежуточный -----------------------
         for i:=nm to nm+q-1 do
         begin
            Name1:=sps[i-nm+1];
            Insert('~',sps[i-nm+1],0);
            Name2:=sps[i-nm+1];//промежуточное имя
            if(FileExists(Put+Name1)=False)then Memo1.Lines.Add('Файл '+Name1+' не найден');
            if(FileExists(Put+Name1)=True)then
            begin
               AssignFile(F,Put+Name1);
               Rename(F,Put+Name2);
            end;
         end;
         q:=0;
         PrintFile('*'+Mask,Put);//считаем количество файлов *.Mask
         //----- сортируем по размеру в порядке возрастания --------------------
         for j:=1 to q-1 do for i:=1 to q-1 do
         begin
            n1:=StrToInt(tim[i]);
            n2:=StrToInt(tim[i+1]);
            if(n2<n1)then
            begin
               tim[q+1]:=tim[i+1];//запоминаем i+1-й элемент
               pos[q+1]:=pos[i+1];
               tim[i+1]:=tim[i];//сдвигаем на 1 вверх
               pos[i+1]:=pos[i];
               tim[i]:=tim[q+1];//меняем на большее значение
               pos[i]:=pos[q+1];
            end;
         end;
         tim[q+1]:='';//убираем ненужные элементы
         pos[q+1]:='';
         //----- меняем список на полностью обратный порядок -------------------
         for i:=q downto 1 do pos[q+i]:=pos[i];
         for i:=1 to q do pos[i]:=pos[q+q+1-i];
         for i:=1 to q do pos[q+i]:='';
         //----- переименовываем из промежуточного в отсортированный список ----
         for i:=nm to nm+q-1 do
         begin
            //----- создаём новый номер и имя файла ----------------------------
            num1:=IntToStr(i);
            while(Length(num1)<StrToInt(Edit5.Text))do num1:='0'+num1;//добавляем к номеру ведущие ноли
            if(CheckBox3.Checked=True)then Name1:=Edit1.Text+' '+num1+Mask;//имя нового файла с пробелом
            if(CheckBox3.Checked=False)then Name1:=Edit1.Text+num1+Mask;//имя нового файла без пробела
            if(FileExists(Put+pos[i-nm+1])=False)then Memo1.Lines.Add('Файл '+pos[i-nm+1]+' не найден');
            if(FileExists(Put+pos[i-nm+1])=True)then
            begin
               AssignFile(F,Put+pos[i-nm+1]);
               Rename(F,Put+Name1);
            end;
         end;
         Memo1.Lines.Add('Список отсортирован по времени создания в порядке убывания');
      end;
могу весь рабочий исходник скинуть.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 12.04.2024, 02:15   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Вообще-то у всех наследников TStrings есть свойство Objects, в котором можно хранить всё что угодно.
northener вне форума Ответить с цитированием
Старый 12.04.2024, 06:45   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
1. добавлять не только дату, но и имя файла
Код:
datetimetostr(... ) + '|' +Memo1.Lines[i];
2. сравнивать не весь текст, а только часть содержащую дату
Код:
 strtodate( copy(list[sortfinish], 1, ???);
А можно ли этот код доработать так, чтобы сортировка выполнялась не только по дате создания, но и по времени?
Ведь в за одну дату могут быть несколько файлов создано, но в разное время и время создания тоже влияет на сортировку.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 12.04.2024, 09:33   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
А можно ли этот код доработать так, чтобы сортировка выполнялась не только по дате создания, но и по времени?
Цитата:
Код:
DateTimeToStr(GetFiileDateTime(
здесь время у нас УЖЕ есть.
осталось его учесть при сортировке.
Код:
CompareValue(StrToDateTIME
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.04.2024, 10:14   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
здесь время у нас УЖЕ есть.
осталось его учесть при сортировке.
Код:
CompareValue(StrToDateTIME
Как? Через Copy опять?
Сейчас у меня эта функция выглядит так:
Код:
function CompareDates(List: TStringList; SortStart,SortFinish: Integer): Integer;
begin
  Result:=CompareValue(StrToDate(Copy(List[SortFinish],1,10)),StrToDate(Copy(List[SortStart],1,10)));
end;
Я пробовал добавить и время вот так:
Код:
function CompareDates(List: TStringList; SortStart,SortFinish: Integer): Integer;
var
  s,f: string;
begin
  s:=Copy(List[SortStart],1,10);
  f:=Copy(List[SortFinish],1,10);
  Result:=CompareValue(StrToDate(Copy(f,12,19)),StrToDate(Copy(s,12,19)));
end;
Но, это не работает, т.к. выдает ошибку:
Код:
"" is not a valid date.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 12.04.2024 в 10:39.
artemavd вне форума Ответить с цитированием
Старый 12.04.2024, 11:01   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

откуда в строке длины 10
f:=copy(...., 1, 10);
возьмется 12-й символ
copy(f, 12, ...);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.04.2024, 11:10   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
откуда в строке длины 10
f:=copy(...., 1, 10);
возьмется 12-й символ
copy(f, 12, ...);
В смысле откуда?
Ну, дату же создания файла беру, там получается строка в которой 19 символов, где дата и время разделены пробелом (11-ый символ)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск файлов по дате создания и по маске marales Общие вопросы Delphi 11 20.09.2015 14:31
Как обратиться к дате создания файла Алекс7 Microsoft Office Excel 3 28.07.2011 22:36
Сортировка БД по дате создания NuR1k БД в Delphi 7 24.08.2010 16:06
Поиск по дате создания файла kayman БД в Delphi 1 14.09.2007 14:54
Поиск по дате создания файла kayman Общие вопросы Delphi 1 14.09.2007 10:36