Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.09.2007, 22:23
Dru095 Dru095 вне форума
Прохожий
 
Регистрация: 28.09.2007
Сообщения: 6
Репутация: 10
По умолчанию Как удалить файлы с определенной датой создания из каталога

Очень прошу помощи.

Тружусь над архиватором БД, он делает архивы баз и складывает их в папку. В связи с тем что база архивируется каждый день старые архивы теряют свою актуальность. Задача заключается в том чтобы раз в сутки пробегаться по папке с архивами и удалять все фалы дата создания у которых меньше DateToStr(Now -5);

Помогите пожалуйста как решить проблемку.

Последний раз редактировалось Dru095, 28.09.2007 в 22:27.
Ответить с цитированием
  #2  
Старый 29.09.2007, 03:10
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Просканировать каталог можно так (подгони этот пример под свою задачу) - http://decoding.narod.ru/faq/files/files001.html#006

Дату создания файла можно узнать так - http://decoding.narod.ru/faq/files/files002.html#002
Ответить с цитированием
  #3  
Старый 29.09.2007, 08:21
Dru095 Dru095 вне форума
Прохожий
 
Регистрация: 28.09.2007
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Decoding
Просканировать каталог можно так (подгони этот пример под свою задачу) - http://decoding.narod.ru/faq/files/files001.html#006

Дату создания файла можно узнать так - http://decoding.narod.ru/faq/files/files002.html#002


Спасибо за совет, справился следующим способом.



//определяет размер файла
function GetFileDate(FileName: string): string;
var
FHandle: Integer;
begin
FHandle := FileOpen(FileName, 0);
try
Result := DateToStr(FileDateToDateTime(FileGetDate(FHandle)) );
finally
FileClose(FHandle);
end;
end;

//удаляет старые архивы
procedure GetAllFiles( Path: string );
var
sRec: TSearchRec;
isFound: boolean;
begin

IniFiles := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Setup.ini'); //указываем на ИНИ файл

isFound := FindFirst( Path + '\*.rar', faAnyFile, sRec ) = 0;
while isFound do
begin
if ( sRec.Name <> '.' ) and ( sRec.Name <> '..' ) then
if ( sRec.Attr and faDirectory ) <> faDirectory then
//проверка архивов на актуальность
if GetFileDate(Path + '\' + sRec.Name) < DateToStr(Now - StrToInt(IniFiles.ReadString('SETUP', 'ACTUAL_BD_DAY', '6'))) then
//удаление
deletefile(Path + '\' + sRec.Name);

isFound := FindNext( sRec ) = 0;
end;

FindClose( sRec );
end;





вызов
GetAllFiles(SetWorkArxiv_path.Text); //Выполняем функцию удаления старых архивов

где SetWorkArxiv_path.Text //путь к каталогу с архивами


Вопрос к спецам можно ли сделать это как то проще?
Ответить с цитированием
  #4  
Старый 12.11.2007, 15:45
Dru095 Dru095 вне форума
Прохожий
 
Регистрация: 28.09.2007
Сообщения: 6
Репутация: 10
Печаль Прошу прощения данный способ работает неправильно

Данный способ неправильно удаляет файлы, прошу прощения.

Чего делать не знаю. (Две недели уже парюсь)

В общем ситуация такая.

1. Есть каталог в нем каждый день появляются новые архивы *.rar
2. Есть setup.ini с параметром ACTUAL_BD_DAY = 3
3. Каждый день необходимо выполнять функцию удаления старых архивов оставляя архивы за последни 3 дня. (как указанно в ACTUAL_BD_DAY = 3)

Как вариант решение вижу в том чтобы из текущей даты вычесть 3 дня потом пройтись по каталогу с архивами и удалить все архивы чья дата меньше текущей даты - 3 дня.


Если есть знающие люди подскажите пожалуйста код.


Скорее всего тут я делаю чегото неправильно if GetFileDate(Path + '\' + sRec.Name) < DateToStr(Now - StrToInt(IniFiles.ReadString('SETUP', 'ACTUAL_BD_DAY', '6'))) then

Уровень знаний не позволяет решить проблему самостоятельно. Прошу помощи!!!
Ответить с цитированием
  #5  
Старый 12.11.2007, 21:35
wrag wrag вне форума
Прохожий
 
Регистрация: 05.11.2007
Сообщения: 9
Репутация: 10
По умолчанию

а ты пробывал архивы называть по дате ????
а потом по имени файла делитить

date_old:=FormatDateTime('dd_mm_yyyy', dateof(now)-3);

а потом по событию например по окончанию таймера проверять совпадает ли date_old и имя файла

deleteFile(dirname+'\'+date_old+'.rar') в общем с таким расширением какое используешь
Ответить с цитированием
  #6  
Старый 13.11.2007, 10:18
Dru095 Dru095 вне форума
Прохожий
 
Регистрация: 28.09.2007
Сообщения: 6
Репутация: 10
По умолчанию а ты пробывал архивы называть по дате ????

Да действительно архивы я создаю с именами в виде даты по маске
base_2007-11-11(00.25).rar но думаю правильнее было бы просто сканировать определенный каталог с архивами и проверять дату создания файла. Если она окажется меньше чем DateToStr(Now - StrToInt(IniFiles.ReadString('SETUP', 'ACTUAL_BD_DAY', '6')


В моем исходнике есть ошибка. Дата переведена в string и осуществляется сравнение двух дат.
if GetFileDate(Path + '\' + sRec.Name) < DateToStr(Now - StrToInt(IniFiles.ReadString('SETUP', 'ACTUAL_BD_DAY', '6')))

При таком сравнении удаляются не те архивы.
в общем запарочка с датами скорее всего..


//Функция определяет дату создания файла
function GetFileDate(FileName: string): string;
var
FHandle: Integer;
begin
FHandle := FileOpen(FileName, 0);
try
Result := DateToStr(FileDateToDateTime(FileGetDate(FHandle)) );
finally
FileClose(FHandle);
end;
end;


//функция удаляет старые архивы
procedure GetAllFiles( Path: string );
var
sRec: TSearchRec;
isFound: boolean;
begin

IniFiles := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Setup.ini'); //указываем на ИНИ файл

isFound := FindFirst( Path + '\*.rar', faAnyFile, sRec ) = 0;
while isFound do
begin
if ( sRec.Name <> '.' ) and ( sRec.Name <> '..' ) then
if ( sRec.Attr and faDirectory ) <> faDirectory then
//проверка архивов на актуальность

// Ошибка сравнения двух дат скорее всего тут..
//
// GetFileDate(Path + '\' + sRec.Name) - дата создания файла
// DateToStr(Now - StrToInt (IniFiles.ReadStrin('SETUP', 'ACTUAL_BD_DAY', '6')) - текущая дата минус кол во дней указанное в ini.
//
//
//
//
//---------------------------------------------------------------
if GetFileDate(Path + '\' + sRec.Name) < DateToStr(Now - StrToInt (IniFiles.ReadString('SETUP', 'ACTUAL_BD_DAY', '6'))) then
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
//
// В итоге использования такого сравнения удаляются не те архивы.
//
//


//удаление
deletefile(Path + '\' + sRec.Name);

isFound := FindNext( sRec ) = 0;
end;

FindClose( sRec );
end;




Прошу помощи в исправлении ошибки.
Ответить с цитированием
  #7  
Старый 21.11.2007, 12:49
Ksepa Ksepa вне форума
Прохожий
 
Регистрация: 21.11.2007
Сообщения: 1
Репутация: 10
По умолчанию

а зачем для сравнения даты переводишь в строку. Сравнивай в формате TDateTime и будет тебе счастье
Ответить с цитированием
  #8  
Старый 21.11.2007, 13:22
Dru095 Dru095 вне форума
Прохожий
 
Регистрация: 28.09.2007
Сообщения: 6
Репутация: 10
Радость СПАСИБО!!!!

if FileDateToDateTime(FileAge(Path + '\' + sRec.Name)) < (Now - IniFiles.ReadInteger('SETUP', 'ACTUAL_BD_DAY', 6)) then
begin
Deletefile(Path + '\' + sRec.Name); //Óäàëåíèå ôàéëà

Спасибо разобрался.
вот код сравнения двух дат, даты файла и даты текущей - несколько дней из ИНИшника...


Кому нужна помощь подскажу чем смогу по данному вопросу.

УРАААААААААААа
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter