Сравнение даты изменения двух файлов с использованием edit

mx_sagat

Подскажите пожалуйста долгое время бьюсь над способом сравнения двух одинаковых файлов. в двух edit-ax указан путь к каталогам с файлами. Надо сравнить файлы из одного каталога с файлами из др каталога по дате последнего изменения и если в первом каталоге дата изм. более новая то копировать в др папку(копирование уже есть.)Очень нужна помощь)пробывал fileName := 'Edit1.text+\*.*' ; ток может я чтот не так написал но она не работает.
10 ответов

mx_sagat

Написал ты, конечно, не правильно. Если хочешь добавить текст из Edit нужно писать так:
fileName := Edit1.text+'\*.*' ;
Только нужно перебирать файлы в одном каталоге. Найдя какой-нибудь файл, к имени добавлять путь в другой каталог. Проверять наличие такого файла в другом каталоге. Ну а потом уже сравнивать времена изменения. У тебя уже есть наработки?


mx_sagat

наработки есть. копрование. а вот
Только нужно перебирать файлы в одном каталоге. Найдя какой-нибудь файл, к имени добавлять путь в другой каталог. Проверять наличие такого файла в другом каталоге. Ну а потом уже сравнивать времена изменения. У тебя уже есть наработки?
этого нет. так как я не представляю как это сделать. внете много чего перепробывал, но ничего. перебирать над через while ?


mx_sagat

На форуме полно тем с перебором файлов. Используется функция FindFirst и FindNext. Набери в поиске в разделе "FindFirst" и почитай.


mx_sagat

спасиб. с этим я думаю разберусь а как сравнивать времена изменения файлов в каталогах по указаному в едите пути к каталогам?


mx_sagat

Функция FindFirst даёт времена создания и последнего изменения найденных файлов. Там это есть в структуре переменной, в которой она выдаёт результат. В системном формате. А время последнего обновления файла из другого каталога можно получить с помощью функции: FileAge('Имя файла') тоже в системном формате или -1 - если файла не существует.Если не получится у тебя, могу завтра с утра сделать пример.


mx_sagat

пробывал простенько сделать . не совсем так как надо ...
procedure TForm1.Button2Click(Sender: TObject);
var  OpStruc: TSHFileOpStruct;
  frombuf, tobuf: Array [0..128] of Char;
  fileName   : string;
    fileName1   : string;
   fileDate   : Integer;
      fileDate1   : Integer;
begin
 
FillChar( frombuf, Sizeof(frombuf), 0 );
  FillChar( tobuf, Sizeof(tobuf), 0 );
 
 
 
StrPCopy( frombuf, Edit1.Text+'*.txt' ); // от куда
StrPCopy( tobuf, Edit2.Text+'*.txt' ); // куда
with OpStruc do begin Wnd := Handle; wFunc := FO_COPY;
pFrom := @frombuf; pTo := @tobuf;
 // Попытка открыть файл Unit1.DCU для текущего проекта
fileName := Edit1.text+'\*.txt'  ;
fileName1 := Edit2.text+'\*.txt'  ;
   fileDate := FileAge(fileName);
   fileDate1 := FileAge(fileName1);
 
  // Мы получали возраста файла?
   if fileDate > -1 then
      if fileDate1 > -1 then
                 if filedate >filedate1 then
 
fFlags := FOF_NOCONFIRMATION or FOF_WANTMAPPINGHANDLE ; //копирует и заменяет существующие
fAnyOperationsAborted := False; hNameMappings := Nil;
lpszProgressTitle := Nil; end; ShFileOperation( OpStruc );
end;
топишет ошибку невозможно скопировать. ошибка в имени файла имени папки или имени тома.ктонить может подсказать в чём тут ошибка?
Функция FindFirst даёт времена создания и последнего изменения найденных файлов. Там это есть в структуре переменной, в которой она выдаёт результат. В системном формате. А время последнего обновления файла из другого каталога можно получить с помощью функции: FileAge('Имя файла') тоже в системном формате или -1 - если файла не существует.Если не получится у тебя, могу завтра с утра сделать пример.
был бы очень благодарен.ошибку нашёл и исправил. но копирование всё равно не идёт.сделал вроде как над ток не могу вспомнить как прервать if так как если два одинаковых файла по дте изменения if filedate = filedate1 то ничего не делала ну прерывалась if


mx_sagat

Вот, кажется так:
procedure TForm1.Button1Click(Sender: TObject);
Var
  i : Integer;
  SR : TSearchRec;
  OpStruc: TSHFileOpStruct;
  frombuf, tobuf: Array [0..128] of Char;
begin
  FillChar( tobuf, Sizeof(tobuf), 0 );
  StrPCopy( tobuf, Edit2.Text ); // куда
  with OpStruc do
  begin
    Wnd := Handle; wFunc := FO_COPY;
    pFrom := @frombuf; pTo := @tobuf;
    fFlags := FOF_NOCONFIRMATION or FOF_WANTMAPPINGHANDLE ; //копирует и заменяет существующие
    fAnyOperationsAborted := False; hNameMappings := Nil;
    lpszProgressTitle := Nil;
  End;
 
  If FindFirst(Edit1.Text+'*.*',faAnyFile,SR)=0 Then
  Repeat
    If (Sr.name='.') Or (Sr.name='..') Then Continue; //Директория
    i:=FileAge(Edit2.Text+Sr.name);
    If i<>-1 Then
    If Sr.Time>i Then
    Begin
      ShFileOperation(OpStruc);
      FillChar( frombuf, Sizeof(frombuf), 0 );
      StrPCopy( frombuf, Edit1.Text+Sr.name ); // откуда
    End;
 
    Application.ProcessMessages;
  Until FindNext(SR)<>0;
  FindClose(SR);
end;
Это должно копировать по одному файлу. Каждому найденному, если дата больше. Но, судя по описанию функции, можно сразу все имена файлов, которые нужно копировать, сложить в frombuf и они скопируются все сразу. Но у меня уже нет времени разбираться дальше.


mx_sagat

спасибо большое. Очень помог.)а что тут над записать If (Sr.name='.') Or (Sr.name='..') Then Continue; //Директорияапробывал способ предложеный выше ошибок непоказывает но не копирует вообще ничего.


mx_sagat

Есть одна ошибочка. Нужно сначала заполнять frombuf а затем вызывать ShFileOperation(OpStruc);.
не копирует вообще ничего.
Копирует только если в папке назначения находит одноимённый копируемому файл старше по дате. Если нужно при отсутствии одноимённого файла в папке назначения скопировать файл, то убираем эту строчку If i<>-1 Then


mx_sagat

mx_sagat: В общем DaMortum нашел ошибки (читай предыдущий пост). И замени строки 23-29 на:
    If i<>-1 Then //Эту строку можно убрать (тогда будет копировать если в приёмной директории такого файла нет вообще)
    If Sr.Time>i Then
    Begin
      FillChar( frombuf, Sizeof(frombuf), 0 );
      StrPCopy( frombuf, Edit1.Text+Sr.name ); // откуда
      ShFileOperation(OpStruc);
    End;