Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск последнего созданного файла в каталоге, Реализация поиска файла по дате  
:(
    Опции темы
ivanfr
Дата 5.7.2012, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



Народ!

Помогите изменить код. сейчас в каталог выгружается каждый день - 5 файлов с одинаковой датой, но с разным временем создания (файл1 :11.06.2012, 11.00, 59, 123 файл2 :11.06.2012, 11.01, 35, 451.....). эти пять файлов отличаются на секунды.

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

Возникла идея добавить 
Код
if FindFirst(DirectoryList[dr], faAnyFile, SR) = 0 and obraotfile  = SR.Name  then  
 доп исключение, но не получилось. 



Код


  DirectoryList[0]:='каталог 1';
  DirectoryList[1]:='каталог 2';
  DirectoryList[2]:='каталог 3';
  DirectoryList[3]:='каталог 4';
  DirectoryList[4]:='каталог5 ';
  fn := '';
  dt := 0;
 [quote]
 dr := 0;
[/quote]
  for dr:= 0 to 4 do
  begin
   try
      if FindFirst(DirectoryList[dr], faAnyFile, SR) = 0 then 
        repeat
          index:=AnsiPos('имя нужного файла',SR.Name);
          if index = 0 then Continue
            else
              begin
                if SR.Attr = faDirectory then Continue;
                FileTimeToSystemTime(SR.FindData.ftCreationTime, st);
                ft := SystemTimeToDateTime(st);
                if ft > dt then
                  begin
                    dt := ft;
                    fn := SR.Name;
                  end;
              end;
        until (FindNext(SR) <> 0);
    finally
      FindClose(SR);
    end;
    if fn = '' then Continue//ShowMessage('Нет Файлов')
    else
      begin
        DirectoryPath:= ExpandFileName(SR.Name);
        Form2.Label3.Caption:=DirectoryPath;
        ShowMessage('Самый новый файл: ' + fn);
      end;
end;
end;


  

Это сообщение отредактировал(а) ivanfr - 9.7.2012, 14:18
PM MAIL   Вверх
ivanfr
Дата 9.7.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



Прошу, глянуть код на наличие ошибок. В таком виде работает как мне нужно. Может кто подскажет, как оптимизировать или заменить? 
Решил свою пробему так:

Код


//Так вызываю
procedure TForm2.BitBtn6Click(Sender: TObject);
var
directoryList : array [0..4] of string;
directoryListData : array  [0..4] of TDateTime;

begin
 SearchFreshFile(directoryList, directoryListData);
end;

Вот сам код

Код

procedure SearchFreshFile(var directoryList:array of string; var directoryListData : array of TDateTime);
 var
  SR: TSearchRec;
  fn,ActualFileName: string;
  st: TSystemTime;
  dt,ft: TDateTime;
  dr, counter:integer;
  DirectoryPath, Data, w,TimeCreate,TimeCreate1 :string;
 label metka1;
begin
  //Обнуление переменных
  counter:=0;
  fn := '';
  dt := 0;
  dr := 0;
  directoryList[0]:='';
  directoryList[1]:='';
  directoryList[2]:='';
  directoryList[3]:='';
  directoryList[4]:='';
  directoryListData[0]:=0;
  directoryListData[1]:=0;
  directoryListData[2]:=0;
  directoryListData[3]:=0;
  directoryListData[4]:=0;
  metka1:
  if FindFirst('c:\Reports\'+'*.xls', faAnyFile, SR) = 0 then
    repeat
      w:='c:\Reports\'+sr.Name;
      if SR.Attr = faDirectory then Continue;
      FileTimeToSystemTime(SR.FindData.ftCreationTime, st);
      ft := SystemTimeToDateTime(st);
      if counter>4 then begin  ShowMessage('Переполнение массива:  directoryList и directoryListData '); exit; end;
      if directoryList[0]<>''then
        begin
          if ((FormatDateTime('dd.mm.yyyy', ft) = FormatDateTime('dd.mm.yyyy', directoryListData[0])) and ('c:\Reports\'+sr.Name <> directoryList[0]))
            then
              begin
                directoryList[counter]:='c:\Reports\'+ sr.Name;
                directoryListData[counter]:=ft;
                if counter<4 then inc(counter);//будет ошибка если больше массив расчитан на до 4
              end;
        end;
      if ft > dt then //ищет самую новую дату файла, включая время. 
        begin
          dt := ft;
          fn := SR.Name;
        end;
   until (FindNext(SR) <> 0);
    if fn = '' then
    else
      begin
        directoryList[0]:='c:\Reports\'+SR.Name;
        directoryListData[0]:=ft;
        if directoryList[4]=''then  begin inc(counter); goto metka1; end;
     end;
   FindClose(SR);
 end;



Это сообщение отредактировал(а) ivanfr - 9.7.2012, 14:16
PM MAIL   Вверх
Akella
Дата 9.7.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(ivanfr @  9.7.2012,  14:14 Найти цитируемый пост)
'c:\Reports\'


За такое на кол!
PM MAIL   Вверх
ivanfr
Дата 10.7.2012, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



Цитата

За такое на кол!

Почему так делать не стоит? 
Лучше в переменную присваивать?
PM MAIL   Вверх
Akella
Дата 10.7.2012, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



1. В корень системного диска никогда не пиши. Даст по рукам или система, или пользователи. Для своих каких-то файлов есть профиль пользователя.
2. Да, переменная или константа.
3. Может быть стоит внести пусть в настройки, чтобы пользователь сам смог, если понадобится, изменить путь по умолчанию?
PM MAIL   Вверх
ivanfr
Дата 10.7.2012, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



Цитата

1. В корень системного диска никогда не пиши. Даст по рукам или система, или пользователи. Для своих каких-то файлов есть профиль пользователя

Не, у меня путь на сетевой диск - это я для примера, чтоб понятно было. 

PM MAIL   Вверх
Akella
Дата 10.7.2012, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(ivanfr @  10.7.2012,  11:16 Найти цитируемый пост)
 меня путь на сетевой диск

Тогда будь готов к зависаниям программы, особенно если винды кривые или права неправильно дадены.
PM MAIL   Вверх
ivanfr
Дата 10.7.2012, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



Это да(ошибки и права), Подскажи лучше как мне сделать обработчик событий.
try exept end не дает использовать метки(goto)?

Это сообщение отредактировал(а) ivanfr - 10.7.2012, 11:38
PM MAIL   Вверх
Akella
Дата 10.7.2012, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(ivanfr @  10.7.2012,  11:37 Найти цитируемый пост)
использовать метки(goto)?

и не надо, забудь про них
PM MAIL   Вверх
ivanfr
Дата 10.7.2012, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



А тогда у меня не получается, получить пути.

Вот тут вот.

Код

procedure SearchFreshFile(var directoryList:array of string; var directoryListData : array of TDateTime);
 var
  SR: TSearchRec;
  fn,ActualFileName: string;
  st: TSystemTime;
  dt,ft: TDateTime;
  dr, counter:integer;
  DirectoryPath, Data, w,TimeCreate,TimeCreate1 :string;
 label metka1;
begin
  //Обнуление переменных
  counter:=0;
  fn := '';
  dt := 0;
  dr := 0;
  directoryList[0]:='';
  directoryList[1]:='';
  directoryList[2]:='';
  directoryList[3]:='';
  directoryList[4]:='';
  directoryListData[0]:=0;
  directoryListData[1]:=0;
  directoryListData[2]:=0;
  directoryListData[3]:=0;
  directoryListData[4]:=0;
  metka1:
  if FindFirst('c:\Reports\'+'*.xls', faAnyFile, SR) = 0 then
    repeat
      w:='c:\Reports\'+sr.Name;
      if SR.Attr = faDirectory then Continue;
      FileTimeToSystemTime(SR.FindData.ftCreationTime, st);
      ft := SystemTimeToDateTime(st);
      if counter>4 then begin  ShowMessage('Переполнение массива:  directoryList и directoryListData '); exit; end;
      if directoryList[0]<>''then
        begin
          if ((FormatDateTime('dd.mm.yyyy', ft) = FormatDateTime('dd.mm.yyyy', directoryListData[0])) and ('c:\Reports\'+sr.Name <> directoryList[0]))
            then
              begin
                directoryList[counter]:='c:\Reports\'+ sr.Name;
                directoryListData[counter]:=ft;
                if counter<4 then inc(counter);//будет ошибка если больше массив расчитан на до 4
              end;
        end;
      if ft > dt then //ищет самую новую дату файла, включая время. 
        begin
          dt := ft;
          fn := SR.Name;
        end;
   until (FindNext(SR) <> 0);
    if fn = '' then
    else
      begin
        directoryList[0]:='c:\Reports\'+SR.Name;
        directoryListData[0]:=ft;
        if directoryList[4]=''then  begin inc(counter); goto metka1; end;
     end;
   FindClose(SR);
 end;

PM MAIL   Вверх
Akella
Дата 10.7.2012, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Мне кажется, что тебе нужно использовать рекурсию

Добавлено через 9 минут и 7 секунд
Сделать процедуру функцией и вызывать саму себя
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.