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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2014, 23:10   #1
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию Копирование только самых новых файлов

здравствуйте!

подскажите как сделать копирование только самых новых файлов.
backUp

скажем скопировал первый старт C:\files\ в D:\files\30.08.2014
изменился через пару часов, дней без разницы. файл внутри папки скажем sys.dll и уже 31.08.2014
AppData вне форума Ответить с цитированием
Старый 30.08.2014, 23:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Можно через FindFirst() сделать поиск. Он возвращает описание файла (ну всмысле проход в цикле) в котором присутствует дата создания или дата модификации файла. Если допустим сравнивать ее с некой заранее запомненной где-то скажем в INI файле датой то можно отсеивать файлы по дате, и принимать только те у кого дата больше.
Умеешь пользоваться этой функцией?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.08.2014, 23:23   #3
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию

Stilet, я был бы счастлив получить пример на то что сейчас было написано! + а если список большой. форматов и файлов

Код:
var
  Form1: TForm1;
  a1: TDateTime;
 
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
Var SR:TSearchRec;
    FindRes:Integer;
begin
ListBox1.Clear;
 a1 := StrToDate('01.08.2012');
 
FindRes:=FindFirst('D:\backup\*.*',faAnyFile,SR);
While FindRes=0 do
   begin
      if ((SR.Attr and faDirectory)=faDirectory) and
      ((SR.Name='.')or(SR.Name='..')) then
         begin
            FindRes:=FindNext(SR);
            Continue;
         end;
      if FileDateToDateTime(SR.Time)=a1 then // если у файла (каталога) дата создания равна a1
         begin
            FindRes:=FindNext(SR); // продолжить поиск
            Continue; // продолжить цикл
         end;
 
      ListBox1.Items.Add(SR.Name);
      FindRes:=FindNext(SR);
   end;
FindClose(SR);
end;

Последний раз редактировалось AppData; 30.08.2014 в 23:30.
AppData вне форума Ответить с цитированием
Старый 31.08.2014, 00:19   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Проще мониторить папку на наличие изменений. Не помню как называется, вроде DirectoryChangeNotification, как-то так
Человек_Борща вне форума Ответить с цитированием
Старый 02.09.2014, 11:17   #5
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию

Действие: Изменение атрибутов файла. выводит 2 раза. можно как то укоротить в 1 раз?!

уважаемые программисты, подскажите или наведите на мысль. как лучше сделать! хочу сделать резерв. копирование данных.
и пока не запутался. подскажите как лучше сделать. вот приблизительная мысль на листе бумаги в Paint ))
Изображения
Тип файла: jpg backup.jpg (85.2 Кб, 115 просмотров)
Вложения
Тип файла: zip monitor.zip (8.1 Кб, 4 просмотров)

Последний раз редактировалось Stilet; 02.09.2014 в 20:35.
AppData вне форума Ответить с цитированием
Старый 02.09.2014, 20:42   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
я был бы счастлив получить пример
Значит подскажу на твоем примере:
Код:
Var SR:TSearchRec;
    FindRes:Integer; PathFrom:String;
begin
ListBox1.Clear;
 a1 := StrToDate('01.08.2012');
 PathFrom:='Где искать файлы для бэкапирования';

FindRes:=FindFirst(PathFrom+'*.*',faAnyFile,SR);
While FindRes=0 do
   begin
      if ((SR.Attr and faDirectory)<>faDirectory) and
      ((SR.Name<>'.')and(SR.Name<>'..')) then
         begin
           windows.CopyFile(PChar(PathFrom+sr.name),PChar('D:\backup\'+sr.name),true);
         end;
      FindRes:=FindNext(SR);
   end;
FindClose(SR);
end;
И все. windows.CopyFile сама определит нужно ли копировать файл. Если такой существует - он перезаписываться не будет. Т.е. в бэкап-каталог будут попадать только файлы, которых там еще нет.

Цитата:
подскажите или наведите на мысль. как лучше сделать!
%
I'm learning to live...

Последний раз редактировалось Stilet; 02.09.2014 в 20:45.
Stilet вне форума Ответить с цитированием
Старый 03.09.2014, 10:43   #7
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию

тогда уж лучше так..

Код:
function FullDirectoryCopy(SourceDir, TargetDir: string; StopIfNotAllCopied,
  OverWriteFiles: Boolean): Boolean;
var
  SR: TSearchRec;
  I: Integer;
begin
  Result := False;
  SourceDir := IncludeTrailingBackslash(SourceDir);
  TargetDir := IncludeTrailingBackslash(TargetDir);
  if not DirectoryExists(SourceDir) then
    Exit;
  if not ForceDirectories(TargetDir) then
    Exit;
  I := FindFirst(SourceDir + '*', faAnyFile, SR);
  try
    while I = 0 do
    begin
      if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
      begin
        if SR.Attr = faDirectory then
          Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME,
            StopIfNotAllCopied, OverWriteFiles)
        else if not (not OverWriteFiles and FileExists(TargetDir + SR.Name))
          then
          Result := CopyFile(Pchar(SourceDir + SR.Name), Pchar(TargetDir +
            SR.Name), False)
        else
          Result := True;
        if not Result and StopIfNotAllCopied then
          exit;
      end;
      I := FindNext(SR);
    end;
  finally
    SysUtils.FindClose(SR);
  end;
end;
вопрос, как сделать так чтобы он копировал измененные?! только новые. не старые. пусть это будет начиная от txt кончая exe
AppData вне форума Ответить с цитированием
Старый 03.09.2014, 10:46   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
как сделать так чтобы он копировал измененные?
Можно нескромный вопрос? А чем предложение с архиватором не устраивает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.09.2014, 10:53   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Как вариант
FileAge - получить время последнего изменения файлов как в источнике, так и в приемнике. Сравнить (можно преобразуя в нормальный TDateTime с помощью FileDateToDateTime) и копировать если в источнике больше чем в приемнике
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.09.2014, 11:01   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Предлагаю разбить задачу на 2 подзадачи.

1. Составление в памяти полного списка копируемых файлов с путями, размерами, атрибутами и временем последнего изменения. Пригодится также для вывода индикатора прогресса.

2. В цикле проверяем, есть ли файл с таким именем в месте, куда копируем, если нету, то просто сливаем туда копию (создав предварительно каталог, если требуется, функцией ForceDirectories()); если есть, то читаем время dest-файла с диска и сравниваем с временем source-файла, которое прицеплено к имени в списке в памяти, если dest-файл старше, переписываем его поверх файлом из списка, иначе - переходим к следующему файлу в списке.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сбор только новых из разных папок strannick Microsoft Office Excel 2 20.12.2012 22:50
Создание новых дат и копирование строк Alex20010 Microsoft Office Excel 3 14.06.2012 03:08
Запрос на выборку 5 самых самых chircov090993 Microsoft Office Access 7 01.06.2012 21:56
Одни из jpg файлов реальные JPEG а другие только название. как загрузиь только картинки? AgressiveBehavior Общие вопросы Delphi 1 16.09.2009 09:39
ПОСТРОИТЬ ГРАФИК - ТОЛЬКО ДЛЯ САМЫХ УМНЫХ xsexrexga Общие вопросы Delphi 4 03.02.2007 12:22