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

Поиск:

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


Шустрый
*


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

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



Суть такая есть, каталог, в который производится выгрузка xls файлов с данными, эти файлы  я через свою программку обрабатываю.
Количество файлов растёт, а постоянно через вызов "диалога" не натыкаешься ручками, надоело на это тратить время к тому же таких каталогов штук шесть. Захотелось автоматизировать и этот процесс.
Короче суть такая:
К работе на текущий день нужен актуальный файл, который выгрузился, вчера ночью, а сегодня утром нужно его обработать. Открываю программку, ищу файл,  выбираю и жму обработать.
Думаю, дайка напишу, что бы программа сама находила самый последний по дате выгруженный файл и брала его к обработке.
Тут столкнулся с проблемой, как бы это реализовать?!
Почитала, что люди пишу.  И решил делать так.
Есть у меня ранее подогнанный  код под мои нужды, который ищет в заданном каталоге xls файлы и берет их к обработке.
На сайте нашёл кусок кода, который находит файл с устаревшим времем от системного времени на 5 минут и выводит сообщение не много не то что я хотел.
Данный код мне ничего не даёт.
Код

begin
  try
    while FindFirst('c:\*.*', faAnyFile, SearchRec) = 0 do
         begin
            MyFileTime := SearchRec.FindData.ftCreationTime;
            Application.ProcessMessages;
            FileTimeToSystemTime(MyFileTime,MyFileSysTime);
              GetSystemTime(MySysTime);
            MyFileDate := SystemTimeToDateTime(MyFileSysTime);
            Application.ProcessMessages;
            MySysDate := SystemTimeToDateTime(MySysTime);
            Delta := MySysDate - MyFileDate;
            if Delta / MyMin > 5 Then ShowMessage('Файл устарел');
         end;
  finally
    FindClose(SearchRec);
  end;


А вот если я возьму, получу  текущую системную дату, сравню с первым найденным файлом в каталоге и посмотрю разницу, затем  цикл while найдет второй файл, получу интервал между системой датой и  датой второго найденного файла  и сравню с первым полученным результатом(интервалом), и так далее  пока не получу самый маленький интервал между системной датой и датой создания файла, который и буду считать последним созданным файлом в каталоге.
Вопрос  будет ли это правильно или можно лучше сделать, а может, есть функции, которые умеют искать последний созданный файл в каталоге.
А может сделать так: записать все обработанные  на данный момент файлы в каталоге в текстовый файл, при  обработке нового файла искать с помощью «pos» в  текстовом файле совпадения, если найден в файле, значит файл обработан, если нет, то обработать?



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


Творец
****


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

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



Цитата(ivanfr @  15.3.2012,  09:47 Найти цитируемый пост)
‘c:\*.*'

ничего не замечаешь?
PM MAIL   Вверх
ivanfr
Дата 15.3.2012, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну это понятно что там ошибка.
Я вопросы то другие задавал.

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


Эксперт
****


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

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



Код
var
  sr: TSearchRec;
  fn: string;
  st: TSystemTime;
  dt,ft: TDateTime;
begin
  fn := '';
  dt := 0;
  try
    if FindFirst('C:\*.*', faAnyFile, sr) = 0 then
    repeat
      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;
    until (FindNext(sr) <> 0);
  finally
    FindClose(sr);
  end;
  if fn = '' then ShowMessage('Нет Файлов')
  else ShowMessage('Самый новый файл: ' + fn);
end;

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


Шустрый
*


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

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



Так как у меня в данную папку выгружается по 4 отчета, но названия разные, а мне нужен только под определенным именем. А код приведенный выше выводит только последний созданный файл в каталоги  и он не подходит, привел небольшую модификацию.  Добавил на проверку наличия в переменной имени файла определенного значения. 
Посоветуйте, корректно ли так использовать код или могут быть проблемы?

Код

var
  SR: TSearchRec;
  fn: string;
  st: TSystemTime;
  dt,ft: TDateTime;
  index:integer;
  Directory_Path, Data:string;
 begin
  fn := '';
  dt := 0;
  try
    if FindFirst('C:\*.xls', 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
      Directory_Path:= ExpandFileName(SR.Name);
      Form2.Label3.Caption:=Directory_Path;
      ShowMessage('Самый новый файл: ' + fn);
    end;
end;

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


Шустрый
*


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

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



Помогите решить проблему?
Нужно пять раз прогнать выше приведенный код загоняю его в цикл for.

с кодом почему-то при использовании цикла в переменную присваивает 5, в место 0 ни чего не понимаю.


Код

 for i:=0 to 4 do 
begin
end;




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


Эксперт
****


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

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



В переменную присваивается поочереди - 0, 1, 2, 3, 4, 5
По окончании цикла в ней останется 5.
Всё логично.
PM MAIL   Вверх
ivanfr
Дата 16.3.2012, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



  ну вот кусок кода когда подходи к dr у него в значении 5 хотя я его перед циклом обнуляю? 
Код


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;



 и вообще почему он пропускает строку  dr := 0;

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


Эксперт
****


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

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



Нет, в этом куске кода dr не может принимать значения 5. Никак.
PM MAIL   Вверх
ivanfr
Дата 16.3.2012, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Но почему-то принимает? 

user posted image

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



Сдается мне, что отладка идет по какому-то другому модулю.


--------------------
PM MAIL WWW   Вверх
ivanfr
Дата 17.3.2012, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Вот почему, перед for пропускается присвоение переменной, странно как-то? Посидел, подумал сегодня и у меня есть подозрение, что это косяк происходит из-за  конструкции try except end. Нужно попробовать в понедельник перенести  try перед for i=.. 


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


Творец
****


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

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



Попробуй отключи оптимизацию в свойствах проекта
PM MAIL   Вверх
ivanfr
Дата 19.3.2012, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Отключение оптимизации в свойствах проекта помогло, только не сразу, а через пару запусков.
Обнуление переменной dr - пропускать перестал. 

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


Творец
****


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

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



После изменения настроек проекта, нужно выполнить перекомпиляцию.
Но для готовой программы лучше включать оптимизицию.
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.0764 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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