|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как удалить файлы с определенной датой создания из каталога
Очень прошу помощи.
Тружусь над архиватором БД, он делает архивы баз и складывает их в папку. В связи с тем что база архивируется каждый день старые архивы теряют свою актуальность. Задача заключается в том чтобы раз в сутки пробегаться по папке с архивами и удалять все фалы дата создания у которых меньше DateToStr(Now -5); Помогите пожалуйста как решить проблемку. Последний раз редактировалось Dru095, 28.09.2007 в 22:27. |
#2
|
||||
|
||||
Просканировать каталог можно так (подгони этот пример под свою задачу) - http://decoding.narod.ru/faq/files/files001.html#006
Дату создания файла можно узнать так - http://decoding.narod.ru/faq/files/files002.html#002 |
#3
|
|||
|
|||
Цитата:
Спасибо за совет, справился следующим способом. //определяет размер файла 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
|
|||
|
|||
Прошу прощения данный способ работает неправильно
Данный способ неправильно удаляет файлы, прошу прощения.
Чего делать не знаю. (Две недели уже парюсь) В общем ситуация такая. 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
|
|||
|
|||
а ты пробывал архивы называть по дате ????
а потом по имени файла делитить date_old:=FormatDateTime('dd_mm_yyyy', dateof(now)-3); а потом по событию например по окончанию таймера проверять совпадает ли date_old и имя файла deleteFile(dirname+'\'+date_old+'.rar') в общем с таким расширением какое используешь |
#6
|
|||
|
|||
а ты пробывал архивы называть по дате ????
Да действительно архивы я создаю с именами в виде даты по маске
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
|
|||
|
|||
а зачем для сравнения даты переводишь в строку. Сравнивай в формате TDateTime и будет тебе счастье
|
#8
|
|||
|
|||
СПАСИБО!!!!
if FileDateToDateTime(FileAge(Path + '\' + sRec.Name)) < (Now - IniFiles.ReadInteger('SETUP', 'ACTUAL_BD_DAY', 6)) then
begin Deletefile(Path + '\' + sRec.Name); //Óäàëåíèå ôàéëà Спасибо разобрался. вот код сравнения двух дат, даты файла и даты текущей - несколько дней из ИНИшника... Кому нужна помощь подскажу чем смогу по данному вопросу. УРАААААААААААа |