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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2010, 11:10   #1
D_A_akella
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 12
По умолчанию Удаление старых файлов.

Добрый день или вечер.
Прошу помощи, ибо уже не знаю что делать. есь программа бекап. суть такова что нужно будет проверять директорию папки, где хранятся бекапы, на наличие старых версий..например Бекап_2010.05.15 Бекап_2010.05.16 Бекап_2010.05.17 Бекап_2010.05.18 Бекап_2010.05.19, и вот наступает 20 число, нужно записать Бекап_2010.05.20, а Бекап_2010.05.15 удалить...

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

Код:
var
SR: TSearchRec;
I, file_count: Integer;
date_attr, date_older_attr : TDateTime;
to_delete,  SourceDir : string;
Код:
//n в этот момент будет равна 4.
n:=n+1;
Kol:=n*5;
j:=0;
for j:=0 to n do
begin
IniFile:=TIniFile.Create(ProgDir+'\BackUp.ini');
SourceDir:=IniFile.ReadString('BackUp','BackupPath','');
I := FindFirst(SourceDir + '*.rar', faAnyFile, SR);
date_older_attr:=GetFileDateTime(SR.Name);
to_delete:=SourceDir + string(SR.Name);
file_count:=1;

  while I = 0 do
    begin
      I := FindNext(SR);
      date_attr:=GetFileDateTime(SR.Name);
      if (date_attr < date_older_attr) then
         to_delete:=SourceDir + string(SR.Name);
      inc(file_count);
    end;

  FindClose(SR);
  if file_count>Kol then DeleteFile(to_delete);
функция времени.
Код:
function GetFileDateTime(FileName: string): TDateTime;
var
  intFileAge: LongInt;
begin
  intFileAge := FileAge(FileName);
  if intFileAge = -1 then
    Result := 0
  else
    Result := FileDateToDateTime(intFileAge)
end;
и эта негодяйка вместо старых баз..(у меня 5 баз, переод архивации 5 дней, и того в день с каждой базы по 1 бекапу, получается 25 файлов, и на 6 lдень старые нужно удалить) ..удаляет просто первые 5 файлов.

догадываюсь что виной тому
Код:
  if file_count>Kol then DeleteFile(to_delete);
если убрать то, ничего не делает...и грешу я на функцию function GetFileDateTime

ну оч буду признателен если поможете разобраться.)):blushing:
D_A_akella вне форума Ответить с цитированием
Старый 12.04.2010, 11:45   #2
quit
Я есть!
Форумчанин
 
Аватар для quit
 
Регистрация: 17.02.2008
Сообщений: 318
По умолчанию

D_A_akella, ты сам написал, что n = 4, поэтому у тебя и удалит первые пять файлов проходя по циклу
Код:
 for j:=0 to n do
ставь проверку в теле while и сразу удаляй эти файлы, или формируй список в стринглист, пихай туда путь к файлу и его дату, а потом им оперируй
©Учиться, учиться и еще раз учиться!
quit вне форума Ответить с цитированием
Старый 12.04.2010, 11:49   #3
D_A_akella
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 12
По умолчанию

счас вот пришла мысль,..а если сделать такой финт
Код:
var
D:TDateTime;
begin
D:=now;
n:=n+1;
Kol:=n*5;
j:=0;
for j:=0 to n do
begin
IniFile:=TIniFile.Create(ProgDir+'\BackUp.ini');
SourceDir:=IniFile.ReadString('BackUp','BackupPath','');
I := FindFirst(SourceDir + '*.rar', faAnyFile, SR);
//date_older_attr:=FileAge(SR.Name);
to_delete:=SourceDir + string(SR.Name);
file_count:=1;

  while I = 0 do
    begin
      I := FindNext(SR);
      date_attr:=FileAge(SR.Name);

      if (D-date_attr<5) then
         begin
         to_delete:=SourceDir + string(SR.Name);
         DeleteFile(to_delete);
         end;
      inc(file_count);
    end;

  FindClose(SR);
  //if file_count>Kol then DeleteFile(to_delete);


end;


end.
интересует вопрос, как сравнить дату например сегоднешнюю и дату создания файла, и если разница больше 5 то дальше по условию?
D_A_akella вне форума Ответить с цитированием
Старый 12.04.2010, 12:10   #4
quit
Я есть!
Форумчанин
 
Аватар для quit
 
Регистрация: 17.02.2008
Сообщений: 318
По умолчанию

если по простому, то
Код:
uses DateUtils;
.....
if DaysBetween(Now,date_attr)>5 then
©Учиться, учиться и еще раз учиться!
quit вне форума Ответить с цитированием
Старый 12.04.2010, 12:26   #5
D_A_akella
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 12
По умолчанию

Ребят концепция поменялась.

последний вопрос.
i=2.3.4.5.6
есть файлы с названиями База1_1[i].03.10 База2_1[i].03.10 База3_1[i].03.10 и того получаеться 15 файлов. нужно после записи i=7. отстортироваь каждую базу по имени и оставиь 5.

Последний раз редактировалось D_A_akella; 12.04.2010 в 13:09.
D_A_akella вне форума Ответить с цитированием
Старый 13.04.2010, 10:22   #6
D_A_akella
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 12
По умолчанию

Ребят такая беда. нужно в код

Код:
program CBackUP;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  IniFiles,
  ShellAPI,
  DateUtils,
  ExtActns;

var
IniFile: TIniFile; // инициализация Ини файла
ProgDir: String[60];//Дирректория где храниться наш ини, в моей программе он храниться в её дирректории

POut:string;//Откуда берем файлы для архивации, путь
PIn:string; // куда делаю Бекап
Options:string; //параметры настройки винрара
Param:String;   //склееные параметры для винрара с учетом опция пути куда и откуда
//a:string;
PoutName:string;      //имя папки архива
a:integer;
j:integer;            //счетчик цикла
n:integer;
s:integer;           //береться с ини файла,значение определяющее количесво баз для архивации.

Date:string;
SDate:String;
SDate1:String;
Date1:string;
filename :string;
Arr_FileName: Array[0..100]of string;
//переменные для очистки

SR: TSearchRec;
I: Integer;

to_delete,  SourceDir : string;


begin
//вытаскиваем параметры с Инифайлы
GetDir(0,ProgDir);
IniFile:=TIniFile.Create(ProgDir+'\BackUp.ini');
n:=IniFile.ReadInteger('Cikl','Schetchik',n);
Options:=IniFile.ReadString('Parametr','WinRar','');
PIn:=IniFile.ReadString('BackUp','BackupPath','');
//работа с датой

SDate:=DateTimeToStr(now);

for j:=1 to 10 do
begin
Date:=Date+SDate[j];
end;

SDate1:=Date[7]+Date[8]+Date[9]+Date[10]+Date[6]+Date[4]+Date[5]+Date[6]+Date[1]+Date[2];


for j:=1 to 10 do
Date1:=Date1+SDate1[j];
//------------------
//нужная вещь
n:=n-1;
//цикл шерстит инифаqл и вытаскивает по очереди базы и архивирует их
for j:=0 to n do
begin
GetDir(0,ProgDir);
IniFile:=TIniFile.Create(ProgDir+'\BackUp.ini');
POut:=IniFile.ReadString('Base'+IntToStr(j),'Path','');
PoutName:=IniFile.ReadString('Base'+IntToStr(j),'Name','');

Param:=Options+' '+PIn+PoutName+'_'+Date1+'.rar'+' '+POut;

ShellExecute(HInstance,'open','C:\Program Files\WinRAR\Rar.exe',PChar(Param), nil, 1);
//ждем окончания работы
sleep(60000);

IniFile.Free;

end;
//поиск удаление
n:=n+1;


for j:=0 to n do
begin
IniFile:=TIniFile.Create(ProgDir+'\BackUp.ini');
SourceDir:=IniFile.ReadString('BackUp','BackupPath','');
PoutName:=IniFile.ReadString('Base'+IntToStr(j),'Name','');
I := FindFirst(SourceDir +Poutname+'_'+ '*.rar', faAnyFile, SR);
to_delete:=SourceDir + string(SR.Name);
Arr_FileName[0]:=string(SR.Name);
 a:=1;
  while I = 0 do
    begin
      I := FindNext(SR);
      filename:=SR.Name;
      Arr_FileName[a]:=FileName;
      inc(a);
    end;

 s:=a-7;

if a>6 then
  begin


    While s>-1 do
      begin
        DeleteFile(SourceDir+Arr_FileName[s]);
        dec(s);
      end;
    FindClose(SR);

   end;

end;




end.
вставить функцию вместо Shell

Код:
FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
  with StartUpInfo do
begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_SHOWNORMAL;
  end;
  Rlst := CreateProcess('C:\Program Files\WinRAR\Rar.exe', Param, nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo);
  if Rlst then
  with ProcessInfo do begin
    WaitForInputIdle(hProcess, INFINITE); // 
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE); // 
    GetExitCodeProcess(ProcessInfo.hProcess, ExitCode); // 
    CloseHandle(hThread); // 
    CloseHandle(hProcess); // 
  end
else Error := GetLastError;
end;
подключая модуль windows, у меня в строках появляются ошибки

Код:
 While s>-1 do
      begin
        DeleteFile(SourceDir+Arr_FileName[s]);//Incompatible types: 'String' and 'PAnsiChar'
        dec(s);
      end;
    FindClose(SR);
//[Error] CBackUP.dpr(144): Incompatible types: 'Cardinal' and 'TSearchRec'

делал
Код:
While s>-1 do
      begin
        DelFile:=SourceDir+Arr_FileName[s];
        string (CharToStr(DelFile));
        DeleteFile(DelFile);
        dec(s);
      end;
    FindClose(SR);
до лампочки....ну вот как моно пользоваться описанием вещей если они идут изначально не юзабельные(((( уже крыша едит...что нифига не пашет(

если кто поможет..буду очень признателен!

Последний раз редактировалось D_A_akella; 13.04.2010 в 10:41.
D_A_akella вне форума Ответить с цитированием
Старый 13.04.2010, 10:46   #7
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

Цитата:
While s>-1 do
begin
DeleteFile(SourceDir+Arr_FileName[s]);//Incompatible types: 'String' and 'PAnsiChar'
dec(s);
end;
FindClose(SR);
напиши так

Код:
While s>-1 do
      begin
        DeleteFile(PAnsiChar(SourceDir+Arr_FileName[s]));
        dec(s);
      end;
    FindClose(SR);
Цитата:
if a>6 then
begin


While s>-1 do
begin
DeleteFile(SourceDir+Arr_FileName[s]);
dec(s);
end;
FindClose(SR);

end;

вынеси FindClose за цикл

Код:
if a>6 then
  begin


    While s>-1 do
      begin
        DeleteFile(SourceDir+Arr_FileName[s]);
        dec(s);
      end;
  end;
    FindClose(SR);
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 13.04.2010, 11:11   #8
D_A_akella
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 12
По умолчанию

от первой избавился!! СПасибо! осталось


Код:
 While s>-1 do
      begin
        DeleteFile(SourceDir+Arr_FileName[s]);
        dec(s);
      end;
    FindClose(SR);//[Error] CBackUP.dpr(144): Incompatible types: 'Cardinal' and 'TSearchRec'



спрс всем. прогу написал. сделал. ошибка была в
Sysutils.FindClose(SR);

Последний раз редактировалось D_A_akella; 13.04.2010 в 11:21.
D_A_akella вне форума Ответить с цитированием
Старый 23.04.2010, 16:41   #9
D_A_akella
Пользователь
 
Регистрация: 12.04.2010
Сообщений: 12
По умолчанию

тему моно закрывать. спс всем

Последний раз редактировалось D_A_akella; 23.04.2010 в 16:47.
D_A_akella вне форума Ответить с цитированием
Старый 23.04.2010, 16:48   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
begin
            a:=0;
            if FindFirst('D:\Backup\*', faDirectory, TSR) = 0 then
              Begin
                Repeat
                  if ((TSR.Attr and faDirectory) = faDirectory)and(TSR.Name='base1') then
                    begin
                      Arr_FileName[a]:=TSR.Name;
                      inc(a);
                    end;
                Until FindNext(TSR) <> 0;
                SysUtils.FindClose(TSR);
              end;
          end
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление старых файлов с компа Mike78 Помощь студентам 3 18.03.2010 15:08
Excel 2007 автоматическое удаление старых строк при потоковом поступлении новых Swindler_1 Microsoft Office Access 5 17.03.2010 21:30
Excel 2007 автоматическое удаление старых строк при потоковом поступлении новых Swindler_1 Microsoft Office Excel 35 15.03.2010 15:55
При запуске старых файлов ничего не происходит, даже форма с кнопками не появляется UserOK Общие вопросы Delphi 6 13.05.2008 12:30
Удаление файлов Amery Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.05.2008 14:46