|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.12.2016, 17:40 | #1 |
Пользователь
Регистрация: 24.08.2015
Сообщений: 46
|
Осуществить копирование файлов без замены существующих через функцию SHFileOperation
Здравствуйте. Программа осуществляет копирование всех файлов и папок из одной указанной директории в другую. Копирование осуществляется посредством функции SHFileOperation:
function TMainForm.CopyF(fromDir, toDir: string): boolean; var fos: TSHFileOpStruct; todir2: string; begin todir2:=todir; ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_COPY; //fFlags := FOF_FILESONLY; fFlags:= FOF_SIMPLEPROGRESS; //Показывать диалог с индикатором прогресса, но не показывать имен файлов fflags:= fflags or FOF_NOCONFIRMATION; //Отвечает "yes to all" на все запросы в ходе опеации fflags:= fflags or FOF_SILENT; //Не показывать диалог с индикатором прогресса pFrom := PChar(fromDir + #0); pTo := PChar(toDir2); end; Result := (0 = ShFileOperation(fos)); end; Пример использования CopyF(PChar (RootFolder.FromLabel.Caption), PChar (RootFolder.InLabel.Caption)); Если файл существует, то он будет заменен автоматически. Но мне этого не надо, так как копирование будет происходить автоматически через таймер, и массив файлов со временем будет увеличиваться. Как сделать так, чтобы, если файлы уже существует, то копирование не происходило. Смотрел информацию по fFlags, но нужного не нашел, есть только FOF_RENAMEONCOLLISION - присваивает файлу новое имя при операциях копирования, перемещения или переименования, если файл с указанным именем уже существует, но мне нужно, чтобы он просто не копировался. |
18.12.2016, 17:45 | #2 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Проверку нужно делать If FileExists(файл) then
|
18.12.2016, 17:49 | #3 |
Пользователь
Регистрация: 24.08.2015
Сообщений: 46
|
Там будет куча вложенных папок и файлов. В папку откуда копироваться каждый день будет создаваться папка с текущей датой, а в эту папку будут падать в течении суток файлы. Получается, что по истечению 10 дней программа будет перекопировать все папки с файлами за 10 дней, а это не нужно.
Последний раз редактировалось Maxjuvefan; 18.12.2016 в 17:52. |
18.12.2016, 19:02 | #4 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Лови функцию которая копирует все что в папке с проверкой на существующую папку или файл
Код:
Последний раз редактировалось Aliens_wolfs; 19.12.2016 в 07:35. |
18.12.2016, 19:26 | #5 |
Участник клуба
Регистрация: 12.09.2012
Сообщений: 1,030
|
А копировать папку только с нужной датой религия не позволяет? Просто задать в запись для функции в параметре From путь к этой папке. Система по идеи должна откопировать папку вместе с её содержимым.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби. |
18.12.2016, 19:35 | #6 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Видимо он хочет чтобы не было постоянного копирования файлов которые уже есть.
Еще можно сверять по дате и времени создания файла и размеру, тогда точнее будет, даже с разными именами не будет копировать так как он уже есть, но будет дольше по времени копировать, так как по всем файлам каждый файл проверяеться Последний раз редактировалось Aliens_wolfs; 18.12.2016 в 19:44. |
18.12.2016, 21:08 | #7 | |
Участник клуба
Регистрация: 12.09.2012
Сообщений: 1,030
|
Цитата:
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби. |
|
19.12.2016, 01:37 | #8 | |
Пользователь
Регистрация: 24.08.2015
Сообщений: 46
|
Цитата:
|
|
19.12.2016, 01:38 | #9 |
Пользователь
Регистрация: 24.08.2015
Сообщений: 46
|
Данную задачу я реализовал следующим способом:
Код:
|
19.12.2016, 07:59 | #10 | |
Участник клуба
Регистрация: 12.09.2012
Сообщений: 1,030
|
Цитата:
Открытие файла-синхронизатора. Запись файла с данными лога текущего момента времени. Запись строки в файл-синхронизатор. (Дата, время + Имя записанного файла + возможно какие-либо ещё данные). Закрытие файла-синхронизации. При синхронизации запрашиваем именно этот файл(данные из него или сам файл, без разницы). Считываем в нём данные и копируем только те, которые в нём указаны. Очищаем файл. Если файл не очищать(например, за сессию или за день), то копировать надо только те файлы, которые после времени начала последней синхронизации). Закрываем файл-синхронизатор. Если синхронизация идет на сервер в сети или в сетевой базе данных, то проще дать автоматике команду автоматической отправки логов на сервер. Тут ещё надо сделать временную запись лога в память, если они идут в потоке, чтобы не вызвать Access Violition при попытке доступа к файлу-синхронизатору, если вдруг он занят синхронизацией(вероятность такого довольно мала, ~1-2%, но не далеко нулевая). Последние нужно, если запись идет чисто на жесткий диск. Принять данное или нет - решать вам. Но предложенный метод требует на 50-60% меньше вычислительных команд, а следовательно времени, для вашей задачи.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Можно ли в Эксель вставлять данные без замены уже существующих? | TemaZosin | Microsoft Office Excel | 12 | 07.10.2012 23:14 |
Копирование с SHFileOperation | Makin_tosh | C++ Builder | 0 | 27.04.2012 04:23 |
Total Commander копирование файлов без уведомления | Ecosasha | Софт | 2 | 28.04.2011 20:44 |
Скоростное копирование файлов через RAM | 3D Hunter | Общие вопросы Delphi | 9 | 03.07.2009 19:41 |
Копирование файлов без чтения строк. | Alex Cones | Общие вопросы Delphi | 6 | 18.04.2009 11:07 |