1 (изменено: Malcev, 2013-04-07 06:58:26)

Тема: AHK: Копирование новых либо измененных файлов и директорий

Есть такой код, но он, конечно же, не сохраняет структуру директорий.

CopySourcePattern = D:\1
CopyDest = D:\1_Archive
Loop, %CopySourcePattern%\*
{
   FileCopy, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%
   IfEqual, ErrorLevel, 0, Continue

   FileGetTime, Time, %CopyDest%\%A_LoopFileName%
   IfEqual, A_LoopFileTimeModified, %Time%, Continue

   FileCopy, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%, 1
   IfNotEqual, ErrorLevel, 0, MsgBox, Could not copy "%A_LoopFileFullPath%" to "%CopyDest%\%A_LoopFileName%".
}
Return

Ума не приложу, что в него добавить, чтобы
1) сохранялась структура директорий.
2) Новые директории тоже копировались.
Крутится в голове такой код, но не уверен, что он правильно работает

CopySourcePattern = D:\1
CopyDest = D:\1_Archive
Loop, %CopySourcePattern%\*
{
   FileCopy, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%
   IfEqual, ErrorLevel, 0, Continue

   FileGetTime, Time, %CopyDest%\%A_LoopFileName%
   IfEqual, A_LoopFileTimeModified, %Time%, Continue

   FileCopy, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%, 1
   IfNotEqual, ErrorLevel, 0, MsgBox, Could not copy "%A_LoopFileFullPath%" to "%CopyDest%\%A_LoopFileName%".
}
Loop, %CopySourcePattern%\*, 2
{
   FileCopyDir, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%
   IfEqual, ErrorLevel, 0, Continue

   FileGetTime, Time, %CopyDest%\%A_LoopFileName%
   IfEqual, A_LoopFileTimeModified, %Time%, Continue

   FileCopyDir, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%, 1
   IfNotEqual, ErrorLevel, 0, MsgBox, Could not copy "%A_LoopFileFullPath%" to "%CopyDest%\%A_LoopFileName%".
}
Return

2 (изменено: creature.ws, 2013-04-07 13:38:25)

Re: AHK: Копирование новых либо измененных файлов и директорий

copySourcePattern := "D:\1"
copyDest := "D:\1_Archive"

loop %copySourcePattern%\*,, 1
{
    StringReplace destDir, A_LoopFileDir, % copySourcePattern, % copyDest
    if FileExist(destDir) != "D"
        FileCreateDir % destDir
    dest := destDir . "\" . A_LoopFileName

    FileCopy, %A_LoopFileFullPath%, % dest
    if !ErrorLevel
        continue

    FileGetTime, time, % dest
    if (A_LoopFileTimeModified <= time)
        continue

    FileCopy, %A_LoopFileFullPath%, % dest, 1
    if ErrorLevel
        MsgBox, Could not copy "%A_LoopFileFullPath%" to "%dest%".
}

3

Re: AHK: Копирование новых либо измененных файлов и директорий

Как все логично.
Сам не догадался.
Спасибо!

4 (изменено: Malcev, 2013-04-07 13:19:43)

Re: AHK: Копирование новых либо измененных файлов и директорий

А что вы изменили?
Только это

if FileExist(destDir) != "D"    ; типа проверку на то, что директории такой не существует (при возможности существования файла с таким же названием?)

5 (изменено: creature.ws, 2013-04-07 13:39:08)

Re: AHK: Копирование новых либо измененных файлов и директорий

Теперь — еще что-то.

6

Re: AHK: Копирование новых либо измененных файлов и директорий

А вот последнее изменение не понял зачем?

7

Re: AHK: Копирование новых либо измененных файлов и директорий

зачем

Во имя добра и здравого смысла.

Использовать A_LoopFileFullPath нет необходимости, конкатенация лучше вызова SplitPath.

8

Re: AHK: Копирование новых либо измененных файлов и директорий

creature.ws, а как вы думаете, не стоит ли добавить проверку на размер?

    FileGetTime, time, % dest
    FileGetSize, size, % dest
    if (A_LoopFileTimeModified <= time) && (A_LoopFileSize = size)
        continue

9 (изменено: creature.ws, 2013-04-28 19:59:56)

Re: AHK: Копирование новых либо измененных файлов и директорий

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

10 (изменено: Malcev, 2013-04-28 20:23:55)

Re: AHK: Копирование новых либо измененных файлов и директорий

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

 FileGetTime, time, % dest
    if (A_LoopFileTimeModified <= time)
        continue

Но тут не учтен момент, что во время предыдущей архивации могло что-нибудь глюкануть и файл записался неполностью.
Поэтому я и решил добавить условие

    FileGetTime, time, % dest
    FileGetSize, size, % dest
    if (A_LoopFileTimeModified <= time) && (A_LoopFileSize = size)
        continue

Или я ошибаюсь?

11 (изменено: creature.ws, 2013-04-29 03:02:24)

Re: AHK: Копирование новых либо измененных файлов и директорий

Если дата исходного файла меньше, чем дата архивного файла, значит архивный файл новее

Интересно, почему это является возможным? Негоже редактировать файлы помещённые в «архив».

Вам виднее, сравнение размера выполняет поставленную задачу или решает возникшую проблему — используйте.

12

Re: AHK: Копирование новых либо измененных файлов и директорий

В общем получился такой скрипт, который определяет букву USB диска по лейблу, копирует измененные файлы и потом отрубает диск с помощью http://www.autohotkey.com/board/topic/8 … age-drive/

Z := GetDriveByLabel("USB_HDD")":"
n = 0
loop, 30
{
   if Z!=:
      break
   sleep, 1000
   n++
}
if n = 30
{
   MsgBox, 4096, USB_HDD, ERROR!
   ExitApp
}

copySourcePattern := "G:"
copyDest := Z

loop %copySourcePattern%\*,, 1
{
    StringReplace destDir, A_LoopFileDir, % copySourcePattern, % copyDest
    if FileExist(destDir) != "D"
        FileCreateDir % destDir
    dest := destDir . "\" . A_LoopFileName

    FileCopy, %A_LoopFileFullPath%, % dest
    if !ErrorLevel
        continue

    FileGetTime, time, % dest
    FileGetSize, size, % dest
    if (A_LoopFileTimeModified = time) && (A_LoopFileSize = size)
        continue

    FileCopy, %A_LoopFileFullPath%, % dest, 1
    if ErrorLevel
        MsgBox, Could not copy "%A_LoopFileFullPath%" to "%dest%".
}
sleep 5000
Run, D:\Abola\USB_HDD\RemUMS.exe %copyDest%
sleep 5000
MsgBox, 4096, USB_HDD, DONE!
ExitApp


GetDriveByLabel(pLabel)
{
  DriveGet, var, List
  Loop, Parse, var
  {
    DriveGet, var, Label, %A_LoopField%:
    If ( var = pLabel )
      Return A_LoopField  ;  if found, will return the drive's letter
  }
}

13

Re: AHK: Копирование новых либо измененных файлов и директорий

А не могли бы вы прокомментировать эту конструкцию:

loop, 30
{
   if Z!=:
      break
   sleep, 1000
   n++
}
if n = 30
{
   MsgBox, 4096, USB_HDD, ERROR!
   ExitApp
}

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14 (изменено: Malcev, 2013-04-29 06:25:22)

Re: AHK: Копирование новых либо измененных файлов и директорий

Z := GetDriveByLabel("USB_HDD")":"   ; Если диск с таким лейблом есть, то переменной присуждается буква с двоеточим.
loop, 30   ; даем 30 секунд на распознование диска
{
   if Z!=:   ; если буква есть, а не одно двоеточие
      break
   sleep, 1000
   n++
}
if n = 30    
{
   MsgBox, 4096, USB_HDD, ERROR!
   ExitApp
}

Хотя точно,  Z := GetDriveByLabel("USB_HDD")":" надо тоже в цикл всунуть, а n=0 можно вообще не прописывать.
Тогда так:


loop, 30
{
   Z := GetDriveByLabel("USB_HDD")":"
   if Z!=:
      break
   sleep, 1000
   n++
}
if n = 30
{
   MsgBox, 4096, USB_HDD, ERROR!
   ExitApp
}

copySourcePattern := "G:"
copyDest := Z

loop %copySourcePattern%\*,, 1
{
    StringReplace destDir, A_LoopFileDir, % copySourcePattern, % copyDest
    if FileExist(destDir) != "D"
        FileCreateDir % destDir
    dest := destDir . "\" . A_LoopFileName

    FileCopy, %A_LoopFileFullPath%, % dest
    if !ErrorLevel
        continue

    FileGetTime, time, % dest
    FileGetSize, size, % dest
    if (A_LoopFileTimeModified = time) && (A_LoopFileSize = size)
        continue

    FileCopy, %A_LoopFileFullPath%, % dest, 1
    if ErrorLevel
        MsgBox, Could not copy "%A_LoopFileFullPath%" to "%dest%".
}
sleep 5000
Run, D:\Abola\USB_HDD\RemUMS.exe %copyDest%
sleep 5000
MsgBox, 4096, USB_HDD, DONE!
ExitApp


GetDriveByLabel(pLabel)
{
  DriveGet, var, List
  Loop, Parse, var
  {
    DriveGet, var, Label, %A_LoopField%:
    If ( var = pLabel )
      Return A_LoopField  ;  if found, will return the drive's letter
  }
}

15 (изменено: serzh82saratov, 2013-04-29 07:27:18)

Re: AHK: Копирование новых либо измененных файлов и директорий

Ещё так можно:


copyDest := GetDriveByLabel("Флэшка 16G", 30) 
If ( copyDest = "" ) {
    MsgBox, 4096, USB_HDD, ERROR! 
    ExitApp
} 
copySourcePattern := "G:"  

 loop %copySourcePattern%\*,, 1
{
    StringReplace destDir, A_LoopFileDir, % copySourcePattern, % copyDest
    if FileExist(destDir) != "D"
        FileCreateDir % destDir
    dest := destDir . "\" . A_LoopFileName

    FileCopy, %A_LoopFileFullPath%, % dest
    if !ErrorLevel
        continue

    FileGetTime, time, % dest
    FileGetSize, size, % dest
    if (A_LoopFileTimeModified = time) && (A_LoopFileSize = size)
        continue

    FileCopy, %A_LoopFileFullPath%, % dest, 1
    if ErrorLevel
        MsgBox, Could not copy "%A_LoopFileFullPath%" to "%dest%".
}
sleep 5000
Run, D:\Abola\USB_HDD\RemUMS.exe %copyDest%
sleep 5000
MsgBox, 4096, USB_HDD, DONE!
ExitApp 

GetDriveByLabel(pLabel, Loop = 1) {  
    DriveGet, List, List
    Loop, Parse, List
    { 
        DriveGet, Label, Label, %A_LoopField%: 
        If ( Label = pLabel )
            Return A_LoopField ":" 
    }  
    If Loop = 1
        Return ""
    sleep, 1000
    GetDriveByLabel(pLabel, Loop-1)
}

И RemUMS.exe проверьте на код выхода через RunWait, может он что-то возвращает - для пущей уверенности, и упразднения пауз по 5 сек.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Копирование новых либо измененных файлов и директорий

Справка пишет:

В отличие от Run, RunWait будет ждать завершения запущенной программы, после чего в ErrorLevel будет сохранён код выхода программы (32-битное число со знаком). Некоторые программы возвращают этот код сразу же, несмотря на то, что продолжают выполняться; эти программы порождают другой процесс.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: serzh82saratov, 2013-04-29 07:30:14)

Re: AHK: Копирование новых либо измененных файлов и директорий

del http://xbmc.ru/forum/images/smilies/facepalm.gif

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: Копирование новых либо измененных файлов и директорий

Да, RunWait - работает.
Код стал намного причесаннее, без лишних "полуночных" присваиваний.
Спасибо!

19

Re: AHK: Копирование новых либо измененных файлов и директорий

Офф:

без лишних "полуночных" присваиваний.

loop, 30   ; даем 30 секунд на распознование диска
{
   if Z!=:   ; если буква есть, а не одно двоеточие
      break
   sleep, 1000
   n++
}

30 кратная проверка переменной которая всё равно не изменится, конечно доставила http://forum.ixbt.com/rotate.gif
без обид.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: Копирование новых либо измененных файлов и директорий

serzh82saratov, код из 15 сообщения работает неверно.
Запускал скрипт, потом подключал усб - в итоге получал ошибку.
Мой же из 14 сообщения работает корректно.

21

Re: AHK: Копирование новых либо измененных файлов и директорий

Malcev
Я в замешательстве.
Никак не могу понять почему в функции GetDriveByLabel на первой итерации оператор вызвавший функцию получает значение а в остальных итерациях остаётся пустым. Хотя при отладке внутри функции всё также верно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Копирование новых либо измененных файлов и директорий

Так я и непонял. Что-то связанное с рекурсией функции.
Так будет работать точно:


GetDriveByLabel(pLabel, Repeat = 1) {  
    Loop % Repeat
    {
        DriveGet, List, List
        Loop, Parse, List
        {  
            DriveGet, Label, Label, %A_LoopField%: 
            If ( Label = pLabel ) 
                Return A_LoopField ":"  
        }   
        sleep, 1000
    }
}  
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui