Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.95.38] |
|
Сообщ.
#1
,
|
|
|
Пишу программу (Дельфи 6) нужно чтоб она в фоновом режиме копировала файлы из одной папки в другую, по таймеру.... И желательно чтоб в трее висела... Я вообще-то админ а не программер, но шэф требует..... Так что понятия не имею как это делать(((((( Может подскажете.... У меня Винда 2000, а работать это всё должно на 98, тоже блин гемор((((
Заранее спасибо!!! |
Сообщ.
#2
,
|
|
|
Из win32.hlp:
BOOL CopyFile( LPCTSTR lpExistingFileName, // pointer to name of an existing file LPCTSTR lpNewFileName, // pointer to filename to copy to BOOL bFailIfExists // flag for operation if file exists ); Что касается Tray, зайди на torry.ru и залей оттуда SysTray сомпоненту - вот тебе и иконка. Кинь на форму таймер и пропиши туда (Timer1.OnTimer) свои операции копирования. Нажми Project->View source и напиши: Application.ShowMainForm := False; SysTray1.Visible := True; Form1.Timer1.Active := True; ... Ну вот и всё! |
Сообщ.
#3
,
|
|
|
Спасибо за совет!!! Но с таймером у меня вообще глюки копирование я сделал через function MoveFiles(WndHandle: HWND; From, To_: String; FilesOnly, Moving: Boolean): Integer;
var OpStruc: TSHFileOpStruct; frombuf, tobuf: Array [0..MAX_PATH] of Char; begin FillChar(frombuf, Sizeof(frombuf), 0); FillChar(tobuf, Sizeof(tobuf), 0); StrPCopy(frombuf, From); StrPCopy(tobuf, To_); with OpStruc do begin Wnd := WndHandle; if Moving then wFunc:= FO_MOVE else wFunc:= FO_COPY; pFrom := @frombuf; pTo := @tobuf; if FilesOnly then fFlags := FOF_NOERRORUI + FOF_NOCONFIRMATION + FOF_FILESONLY else fFlags := FOF_NOERRORUI + FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR; hNameMappings:= Nil; lpszProgressTitle:= Nil; end; Result := ShFileOperation(OpStruc) end; Мне посоветовали а я уж в принципе ночью доразбирался сам. А вот с таймером у меня сплошные заморочки...... В трэй он кидает по 2 -3-4 иконки программы, причём одна висит даже в design-time????? А с тай |
Сообщ.
#4
,
|
|
|
Блин не то нажал(((( А с таймером мне никак не разобраться...... Хелпов не установлено.... а сам никак не пойму как он работает..... Моно мне плиз кусок кода примерного события по таймеру - раз в пять мин....... ну только такого для даунов ( для меня то бишь) ;) Заранее огромное спасибо, и ещё вышеприведённый кусок работает под Вин20000 будет ли он работать на Вин98-Ме????
Очень благодарен..... |
Сообщ.
#5
,
|
|
|
работать то оно... хотя применять API SHFileOperation есть смысл когда у тебя группа файлов или ты хочешь видеть процесс копирования, запросы на перизапись и все такое в стиле виндовс....
а для одного файла достаточно copyFile и moveFile а какие проблемы с таймером непонятно в дизайн-мод ставишь timerInterval на 300000 (это 5*60*1000) и потом на закладке events делаешь обработчик события onTimer - и в этой процедуре пишешь свое копирование ну или вызываешь уже готовую p.s. вот только таймер вещь не совсем точная.... |
Сообщ.
#6
,
|
|
|
Ну мне надо копировать группу файлов, только вот как прогресс бар туда запихать не в курсе. Вернее из папки надо считать объём файлов, и знать объём каждого скопированного файла.... а вот как это вычисляется.....??????? А запросов на перезапись и в помине не нужно, наоборот, всё должно быть от юзера скрыто......
|
Сообщ.
#7
,
|
|
|
если ты собрался копировать SHFileOperation то там ты уже получишь прогрессбар от виндовс...
ну а если ты хочешь узнать что же тебе там скопировалось, то надо использовать хендл который функция вернет в hNameMappings из передаваемой ей структуры.... готовый пример дать ен могу..... у меня тут D3 на win2k, а это дело не работает под NT (но в D6 платформа любая, я думаю ) эта штука даст тебе доступ к массиву из элементов типа tSHNAMEMAPPING typedef struct _SHNAMEMAPPING { // shnm LPSTR pszOldPath; // address of old path name LPSTR pszNewPath; // pointer to new path name int cchOldPath; // number of characters in old path name int cchNewPath; // number of characters in new path name } SHNAMEMAPPING, FAR *LPSHNAMEMAPPING; ну тебе просто надо все их просмотреть и узнать размеры файлов примерно это будет так var fo:tSHFILEOPSTRUCT; nm:tSHNAMEMAPPING; begin .... SHFileOperation(fo) .... for i:=0 to SHGetNameMappingCount(fo.hNameMappings)-1 do begin nm:=SHGetNameMappingPtr(fo.hNameMappings,i); // смотрим размер файла string(nm.pszNewPath) // и записываем его в лог или т.п. end; SHFreeNameMappings(fo.hNameMappings); .... end; .. но я могу и ошибаться......... ну а внешний вид диалога копирования можно натроить.....чеоез fFlags |
Сообщ.
#8
,
|
|
|
Но блин проблема с доступом, если файл из папки для копирования открыт Аксцессом, то ни один вобще не копируется, системные предупреждения отключены..... Что делать..........???? Там где это будет стоять все файлы будут открыты, и что всё зря в итоге или моно обойти в виндах занятость файла?????
|
Сообщ.
#9
,
|
|
|
Можно прочитать в TMemoryStream() а оттуда сохранить куда нужно. Это один из малочисленных способов открыть какой-либо файл, который уже открыт.
Заметьте, что переместить его нельзя, только скопировать. |
Сообщ.
#10
,
|
|
|
Не работает(((( С акцессом (((((
|