ПО копирования и переноса дынных

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

ПО копирования и переноса дынных

Сообщение levchukvv » 16.05.2014 11:55:36

Хочу написать простенькую программу, с помощью которой можно было бы создавать задания, с указанием даты, времени и места куда и откуда копировать (или вырезать).
Пока накидал только формы.
Незнаю как именно реализовать, можно ли обойтись только этой программой или придется обращаться к штатным средствам ОС? (пишу под win server 2008, 2003)

Чтобы создать задание, пользователю предварительно предлагается выбрать требуемое действие: «копировать» или «переносить». При копировании создается точная копия исходных файлов, при выборе действия «переносить» так же создается точная копия исходных файлов, но после завершения копирования исходные файлы стираются из памяти. Дальнейшие параметры задания будут доступны, только при выборе требуемого действия («копировать» или «переносить»). Это сделано для того, чтобы пользователь по неосторожности не создал задания без этих параметров («копировать» или «переносить»), что было бы бессмысленно.
После выбора требуемого действия, пользователю открываются дальнейшие параметры:
• Путь до исходных файлов
• Путь до конечной директории
• Дата выполнения задания
• Время выполнения задания, с точностью до минут

После указания всех параметров, пользователь нажимает на кнопку «Создать задание».

У меня идея такая: при содании задания, программа создает батник или ини-файл, в котором прописаны все условия, и в определенный момент запускает этот батник или сама копирует, использую условия ини-файла.
Что думаете? Может кто уже сталкивался с таким?

Добавлено спустя 2 часа 39 минут 52 секунды:
Копировать файлы программу я научил, с помощью этой функции:

Код: Выделить всё
function CopyDirectory( StrFrom, StrTo : string) : Boolean;
var
  F : TShFileOpStruct;
begin
  F.wFunc:=FO_COPY;
  F.pFrom:=PChar(StrFrom + #0);
  F.pTo:=PChar(StrTo+#0);
  F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
  if ShFileOperation(F) = 0 then
    result:=False
  else
    result:=True;
end;               


Теперь при нажатии кнопки создать задание, вот что:

Код: Выделить всё
procedure TForm2.Button1Click(Sender: TObject);
begin

  CopyDirectory(directoryedit1.directory, directoryedit2.directory);

end; 



Теперь хотелось бы, чтобы в зависимости от того, какой radiobutton выбрал пользователь, программа удаляла исходные файлы или нет, представляю это примерно так:

Код: Выделить всё
procedure TForm2.Button1Click(Sender: TObject);
begin
  if radioRadioButton1.enabled: = true, then
  CopyDirectory(directoryedit1.directory, directoryedit2.directory);
  if radioRadioButton2.enabled: = true, then
  CopyDirectory(directoryedit1.directory, directoryedit2.directory); + ...(тут надо что то добавить для чистки исходящий директории)
end; 


Кто знает как это можно реализовать?

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

Добавлено спустя 3 часа 46 минут 59 секунд:
Научил программу удалять после копирования каталога, при выборе параметра "перенести":

Код: Выделить всё
procedure TForm2.Button1Click(Sender: TObject);
begin
  CopyDirectory(directoryedit1.directory, directoryedit2.directory);
  if RadioButton2.checked = true then
    DeleteDirectory(directoryedit1.directory, true);
end; 


Добавлено спустя 41 минуту 5 секунд:
В общем, что осталось сделать:
1. Научить программу выполнять задания в указанный срок
2. Научить программу показывать процесс выполнения задания на первой форме
3. научить программу копировать не только директории целиком, но и файлы по отдельности
ну и самому научиться все это делать:)

Пока не знаю как это сделать... :(
levchukvv
новенький
 
Сообщения: 11
Зарегистрирован: 15.05.2014 20:50:39

Re: ПО копирования и переноса дынных

Сообщение ssadragon » 17.05.2014 12:53:11

Перебор файлов в папке
Код: Выделить всё
Var
SR:TSearchRec;
FindRes: Integer;
FName: String;
...
FindRes := FindFirstUTF8("Нужная папка\" + '*', faAnyFile, SR); // Указываем в какой папке будем работать // faAnyFile - указываем что только файлы нам нужны(вложенные папки игнор)
While FindRes = 0 Do  // Цикл по указанной папки
Begin
   FName:=SR.Name;   // Берем имя файла
   //что-нибудь делаем с текущем файлом
   FindRes := FindNextUTF8(SR); // Переходим на следующий файл
End;
FindCloseUTF8(SR);


P.S. FindCloseUTF8, FindNextUTF8, FindFirstUTF8 в модуле FileUtil позволяют работать с файлами с русскими буквами
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: ПО копирования и переноса дынных

Сообщение levchukvv » 18.05.2014 17:07:00

ssadragon Непонял, что именно этот код делает?
levchukvv
новенький
 
Сообщения: 11
Зарегистрирован: 15.05.2014 20:50:39

Re: ПО копирования и переноса дынных

Сообщение Sharfik » 19.05.2014 04:50:21

levchukvv писал(а):ssadragon Непонял, что именно этот код делает?

По указанному для функции пути выдает список файлов. Плюс пример названий функций, которые позволяют работать с именами файлов на русском языке. В FPC штатный прикол с непониманием кодировки адреса файла, если там русские буквы есть.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: ПО копирования и переноса дынных

Сообщение levchukvv » 20.05.2014 23:06:02

Sharfik писал(а): FPC штатный прикол с непониманием кодировки адреса файла, если там русские буквы есть.


В последней версии lazarus с этим проблем не должно быть. вроде бы

Добавлено спустя 1 минуту 5 секунд:
Вот написал процедуру, при нажатии кнопки "Создать задание", выполняется это:

Код: Выделить всё
procedure TForm2.Button1Click(Sender: TObject);
var
    y: TextFile;
    a, b, c, h, m : string;
     d : TDateTime;
   begin
      if radiobutton1.Checked = true then a := 'copy';
      if radiobutton2.Checked = true then a := 'copy2';
      b:= directoryedit1.directory;
      c:= directoryedit2.directory;
      d:= dateedit1.Date;
      h:= edit1.text;
      m:= edit2.text;
     AssignFile(y, 'C:UsersВиталийDocumentstest1.txt');
     Rewrite(y);
     Writeln (a);
     Writeln (b);
     Writeln (c);
     Writeln (d);
     Writeln (h);
     Writeln (m);
     CloseFile(y);
   end;       


Но при выполнении программы появляется ошибка. Её содержание примерно такое: "Проект вызвал класс исключения 'RunError(3)' на строке 105.

Строка 105 содержит это: Writeln (a); То есть запись переменной в файл.

В чем дело не понимаю :(

Добавлено спустя 29 минут 45 секунд:
Разобрался почему... :oops:

Добавлено спустя 21 минуту 12 секунд:
Подсказал добрый человек пойти таким путем:

Код: Выделить всё
with TStringList.Create do
  try
    if radiobutton1.Checked = true then Add('copy');
    if radiobutton2.Checked = true then Add('copy2');
    Add(directoryedit1.directory);
    Add(directoryedit2.directory);
    Add(dateedit1.Date);
    Add(edit1.text);
    Add(edit2.text);
    SaveToFile('C:\Users\Виталий\Documents\test1.txt');
  finally
    Free;
  end;



Но вот незадача, ругается на дату :(
Код: Выделить всё
Add(dateedit1.Date);

Вот так:
unit2.pas(104,26) Error: Incompatible type for arg no. 1: Got "TDateTime", expected "AnsiString"
levchukvv
новенький
 
Сообщения: 11
Зарегистрирован: 15.05.2014 20:50:39

Re: ПО копирования и переноса дынных

Сообщение Vadim » 21.05.2014 03:44:01

Преобразуйте дату в строку.
Код: Выделить всё
Add(dateedit1.Text);
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: ПО копирования и переноса дынных

Сообщение levchukvv » 21.05.2014 09:51:09

Vadim писал(а):Преобразуйте дату в строку.


Помогло. А как мне теперь научить вот эту функцию:
Код: Выделить всё
function CopyDirectory( StrFrom, StrTo : string) : Boolean;
var
  F : TShFileOpStruct;
begin
  F.wFunc:=FO_COPY;
  F.pFrom:=PChar(StrFrom + #0);
  F.pTo:=PChar(StrTo+#0);
  F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
  if ShFileOperation(F) = 0 then
    result:=False
  else
    result:=True;
end;


Адреса директрий откуда и куда копировать брать из созданного текстовго файла?

Раньше она брала эту информацию прям из directoryedit1:
Код: Выделить всё
CopyDirectory(directoryedit1.directory, directoryedit2.directory


Добавлено спустя 1 час 2 минуты 18 секунд:
Подсказали таким методом пойти:

Код: Выделить всё
with TStringList.Create do
try
  LoadFromFile('C:\Users\Виталий\Documents\test1.txt');
  CopyDirectory(Strings[2], Strings[3]); // Передаст вторую и третью строки файла в качестве параметров
finally
  Free;
end;


Но как мне теперь запустить эту процедуру в дату и время указанные в этом же текстовом файле?
levchukvv
новенький
 
Сообщения: 11
Зарегистрирован: 15.05.2014 20:50:39

Re: ПО копирования и переноса дынных

Сообщение Vadim » 21.05.2014 15:29:30

levchukvv писал(а):Но как мне теперь запустить эту процедуру в дату и время указанные в этом же текстовом файле?

Команда AT предназначена для запуска команд и программ в указанное время
по определенным дням. Для использования команды AT необходимо, чтобы была
запущена служба расписаний.

AT [\\имя_компьютера] [ [ИД] [/DELETE] | /DELETE [/YES]]
AT [\\имя_компьютера] время [/INTERACTIVE]
[ /EVERY:день[,...] | /NEXT:день[,...]] "команда"

\\имя_компьютера Имя удаленного компьютера. Если этот параметр опущен,
используется локальный компьютер.
код Порядковый номер запланированной задачи.
/delete Отмена запланированной задачи. Если код задачи опущен,
отменяются все задачи, запланированные для указанного
компьютера.
/yes Отмена запроса на подтверждение при отмене всех
запланированных задач.
время Время запуска команды.
/interactive Разрешение взаимодействия задачи с пользователем,
работающим на компьютере во время запуска задачи.
/every:день[,...] Запуск задачи осуществляется по указанным дням недели или
месяца. Если дата опущена, используется текущий день
месяца.
/next:день[,...] Задача будет запущена в следующий указанный день недели
(например, в следующий четверг). Если дата опущена,
используется текущий день месяца.
"команда" Команда Windows NT или имя пакетного файла.

Либо вариант менее изящный - Вы оставляете свою программу запущенной и она морочит процессору голову, проверяя каждую минуту "сколько времени" и при совпадении текущего и указанного времени выполняет процедуру копирования.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: ПО копирования и переноса дынных

Сообщение levchukvv » 21.05.2014 16:34:16

Либо вариант менее изящный - Вы оставляете свою программу запущенной и она морочит процессору голову, проверяя каждую минуту "сколько времени" и при совпадении текущего и указанного времени выполняет процедуру копирования.


Мне пока этого бы хватило, но я незнаю как реализовать
levchukvv
новенький
 
Сообщения: 11
Зарегистрирован: 15.05.2014 20:50:39

Re: ПО копирования и переноса дынных

Сообщение Vadim » 22.05.2014 03:08:27

levchukvv
Как получить текущие дату и время знаете?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: ПО копирования и переноса дынных

Сообщение levchukvv » 22.05.2014 08:17:45

Vadim писал(а):levchukvv
Как получить текущие дату и время знаете?

GetLocalTime? Честно нет.
levchukvv
новенький
 
Сообщения: 11
Зарегистрирован: 15.05.2014 20:50:39

Re: ПО копирования и переноса дынных

Сообщение ssadragon » 22.05.2014 09:08:49

levchukvv писал(а):GetLocalTime? Честно нет.

Ну да в принципе НО!
Самый простой вариант
Код: Выделить всё
Var
CurrDateTime: TDateTime;
CurrTime: TTime;
CurrDate: TDate;
...
Begin
CurrDateTime := Now;
CurrTime := Time;
CurrDate := Date;
End;
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: ПО копирования и переноса дынных

Сообщение levchukvv » 22.05.2014 14:45:50

ssadragon писал(а):
levchukvv писал(а):GetLocalTime? Честно нет.

Ну да в принципе НО!
Самый простой вариант
Код: Выделить всё
Var
CurrDateTime: TDateTime;
CurrTime: TTime;
CurrDate: TDate;
...
Begin
CurrDateTime := Now;
CurrTime := Time;
CurrDate := Date;
End;


Так-с можно комментарии?
levchukvv
новенький
 
Сообщения: 11
Зарегистрирован: 15.05.2014 20:50:39

Re: ПО копирования и переноса дынных

Сообщение Vadim » 22.05.2014 15:02:19

levchukvv писал(а):Так-с можно комментарии?

А как у Вас с английским?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: ПО копирования и переноса дынных

Сообщение levchukvv » 23.05.2014 20:25:49

Vadim писал(а):А как у Вас с английским?


Не очень, но как переводится date и time я понимаю...
Не понимаю как мне реализовать процесс:
Программа смотрит в каталог, котором лежат текстовые файлы. Имя текстового файла содержит дату и время, когда надо выполнить задания, а параметры задания записаны в самих файлах. Создавать такие файлы я научил прогу. А мониторить каталог и сравнивать с текущей датой и временем имена файлов я незнаю как.
levchukvv
новенький
 
Сообщения: 11
Зарегистрирован: 15.05.2014 20:50:39

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 232

Рейтинг@Mail.ru