<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: FileCopyDir + Progress bar]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8919&amp;type=atom" />
	<updated>2013-11-25T10:34:11Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=8919</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77534#p77534" />
			<content type="html"><![CDATA[<p><strong>serzh82saratov</strong>, большущее благодарю за проделанную работу! Все прекрасно работает! Много забугорных форумов перекопал, но ничего не нашел, чтобы хорошо работало!</p><p><strong>Русские программеры - The BEST!</strong>&nbsp; <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />&nbsp; Спасибо!</p>]]></content>
			<author>
				<name><![CDATA[Dr.Jekyll]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30028</uri>
			</author>
			<updated>2013-11-25T10:34:11Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77534#p77534</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77443#p77443" />
			<content type="html"><![CDATA[<p>Так я вижу решение:<br /></p><div class="codebox"><pre><code>
#SingleInstance Force
#Persistent   
#MaxMem 4095
SetBatchLines -1 

Source =  
Dest =  
ProgressStep := 1000
 
Gui, Add, Text, y+10 vText -Wrap r2 w555
Gui, Add, Progress, vProgress wp Range1-%ProgressStep%
Gui, Show 

FileCopyDir( Source, Dest, 1, 1) 
Return

 ; rewrite - Переписывать файлы
 ; recurse - Рекурсия в папки, т.е. всё содержимое. Иначе только файлы из корня.
 
FileCopyDir( Source, Dest, rewrite := 0, recurse := 0)  { 
    Global ProgressStep
    
    FileCreateDir, %Dest%
    DelSource := StrLen(Source) + 1, AllSize := 0
    
    Loop, %Source%\*.*, , %recurse%
    {
        If (!rewrite)
        { 
            RASHNDOCT := FileExist( Dest . SubStr( A_LoopFileLongPath, DelSource))
            
            If (RASHNDOCT != &quot;&quot; &amp;&amp; !InStr( RASHNDOCT, &quot;D&quot;))
                Continue 
        }
        
        list .= A_LoopFileLongPath &quot;`n&quot;
        AllSize += A_LoopFileSize
    }

    list := SubStr(list, 1, -1)
    ByteStep := Ceil(AllSize / ProgressStep), IndexByteStep := 0          
    
    Loop, parse, list, `n
    {
        GuiControl, , Text, % &quot;Сейчас копируется:`n&quot; A_LoopField 
        DestFileName := Dest . SubStr(A_LoopField, DelSource)  
        
        If recurse
        {
            IsDestDir := SubStr(DestFileName, 1, InStr(DestFileName, &quot;\&quot;, , -1))
            RASHNDOCT := FileExist(IsDestDir)
            
            If (RASHNDOCT = &quot;&quot; || !InStr( RASHNDOCT, &quot;D&quot;))
                FileCreateDir, %IsDestDir%
        }
        
        DestFile := FileOpen(DestFileName, &quot;w&quot;)
        
        If rewrite
            DestFile.Length := 0
         
        File := FileOpen(A_LoopField, &quot;r&quot;) 
        FileSize := File.Length 
        Seek := 0
        
        Loop
        {  
            If restBytes
            {
                End := bufSize := restBytes, restBytes := 0
                
                If (End &gt; FileSize)
                    restBytes := End - FileSize, bufSize := FileSize
            }
            Else
            {
                bufSize := ByteStep, End := Seek + ByteStep
            
                If (End &gt; FileSize)
                    restBytes := End - FileSize, bufSize := ByteStep - restBytes, Seek := FileSize - bufSize
            }
            
            File.Pos := Seek, DestFile.Pos := Seek  
            VarSetCapacity(buf, bufSize, 0) 
            File.RawRead(&amp;buf, bufSize)
            DestFile.RawWrite(&amp;buf, bufSize)  

            If restBytes
                Break
         
            GuiControl, , Progress, % ++IndexByteStep 
            Seek := End  
        }    
    } 
    GuiControl, , Text, Готово
    GuiControl, , Progress, % ProgressStep
    DestFile := &quot;&quot;, File := &quot;&quot;, VarSetCapacity(buf, 0) 
}
 
GuiClose:
GuiEscape:
    ExitApp 
</code></pre></div><p> </p><p>Можете ещё прикрутить примерное оставшееся время и размер, а также скорость копирования. Возможно также отмену копирования на каждом (в данном примере - тысячном) этапе. <br />По скорости примерно на 3 - 5 % быстрее чем метод windows.</p><p>---</p><p>ап: <br />Поправил для учёта в прогрессе файлов которые не надо переписывать.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2013-11-20T19:12:08Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77443#p77443</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77431#p77431" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>ComObjCreate(&quot;Shell.Application&quot;).NameSpace(DestDir).CopyHere(SourceDir &quot;\*&quot;)</code></pre></div><p>Вот так копируется только содержимое SourceDir, но тогда прогресс появляется только на копировании директории большого объема ....</p><p>Конечно, больше интересует сделать свой прогресс ...</p>]]></content>
			<author>
				<name><![CDATA[Dr.Jekyll]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30028</uri>
			</author>
			<updated>2013-11-20T02:41:07Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77431#p77431</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77426#p77426" />
			<content type="html"><![CDATA[<p>4096 = тот же результат.</p><p>CopyHere - &quot;... Вызов метода приводит к тому же эффекту, что и перетаскивание файлов в проводнике.&quot;</p><br /><div class="codebox"><pre><code>ComObjCreate(&quot;Shell.Application&quot;).NameSpace(DestFolder).CopyHere(Source)</code></pre></div><p> - полное копирование всей директории с вложенными файлами и папками. ... Надо подумать, как копировать содержимое директории ...</p>]]></content>
			<author>
				<name><![CDATA[Dr.Jekyll]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30028</uri>
			</author>
			<updated>2013-11-19T16:24:04Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77426#p77426</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77423#p77423" />
			<content type="html"><![CDATA[<p>Вот параметры: <a href="http://www.script-coding.com/WSH/Shell.html#4.3.2.">CopyHere</a><br />Я так понял что нужно 4096, но что-то идёт не так:<br /></p><div class="codebox"><pre><code>ComObjCreate(&quot;Shell.Application&quot;).NameSpace(DestFolder).CopyHere(Source, 4096) </code></pre></div>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2013-11-19T15:04:42Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77423#p77423</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77422#p77422" />
			<content type="html"><![CDATA[<p>Пока все это сложно для меня ... в процессе изучения <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>Кстати, довольно интересная функция ComObjCreate ! Я не знал об этом. Пользовался только русским справочником, а там этого нет. Сейчас посмотрел в родном, английском там есть - это более полный справочник, надо на него переходить ...</p><p> </p><div class="codebox"><pre><code>Source = D:\Programms\=Other ; Что будем копировать 

DestFolder = C:\Users\sergey\Desktop ; Куда будем копировать
 
ComObjCreate(&quot;Shell.Application&quot;).NameSpace(DestFolder).CopyHere(Source) 
return</code></pre></div><p>А как можно сделать, чтобы в директорию назначения &quot;DestDir&quot; (DestFolder) копировалось только содержимое &quot;SourceDir&quot; (Source), а не вся директория с исходным именем?</p>]]></content>
			<author>
				<name><![CDATA[Dr.Jekyll]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30028</uri>
			</author>
			<updated>2013-11-19T14:37:53Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77422#p77422</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77421#p77421" />
			<content type="html"><![CDATA[<p>Хотя есть вариант взять все файлы в папке, если прогресс нужен с диапазоном 1000, то читать в буфер равный 1000-й части общего объёма и записать в целевой, обновить прогресс.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2013-11-19T14:01:44Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77421#p77421</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77420#p77420" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Только заметил, что на копировании больших файлов происходит резкий скачек прогресса</p></blockquote></div><p>Тут не знаю чем помочь, я почему-то думал, что размер целевой папки должен постепенно увеличиваться в процессе копирования большого файла, но это оказалось не так.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2013-11-19T13:48:43Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77420#p77420</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77419#p77419" />
			<content type="html"><![CDATA[<p>Большущее спасибо за пример! Все отлично работает. Только заметил, что на копировании больших файлов происходит резкий скачек прогресса, а затем прогресс &quot;замерзает&quot;. ... В принципе, я не планирую копирование больших файлов этим скриптом, но, все же ... Может есть другие несложные схемы, чтобы избежать этого?</p><p>Благодарю за помощь!</p>]]></content>
			<author>
				<name><![CDATA[Dr.Jekyll]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30028</uri>
			</author>
			<updated>2013-11-19T12:59:49Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77419#p77419</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77385#p77385" />
			<content type="html"><![CDATA[<p>Пока такой пример с запуском 2 процесса. Пример простой, сработает только при копировании в пустую или несуществующую папку:<br /></p><div class="codebox"><pre><code>
SetBatchLines -1  
 
Source = D:\Programms\=Other 
DestFolder = C:\Users\sergey\Desktop\=Other
   
AHKcode =
(
#NoTrayIcon    
FileDelete, `%A_ScriptFullPath`%
FileCopyDir, %Source%, %DestFolder%, 1
    MsgBox FileCopyDir ExitApp
ExitApp
) 
 
FileAppend, %AHKcode%, %A_ScriptDir%\FileCopyDir.ahk
Run %A_ScriptDir%\FileCopyDir.ahk

SourceSize := FolderSize(Source)
Gui, Add, Progress, h20 w200 vProgress Border Range0-%SourceSize% 
Gui, Show
 
Loop   {
    DestSize := FolderSize(DestFolder) 
    GuiControl,, Progress, %DestSize%
    If DestSize &gt;= SourceSize
        ExitApp
    Sleep 100
} 
 
FolderSize(Folder, FolderSize := 0)  {
    Loop, %Folder%\*.*, , 1
        FolderSize += %A_LoopFileSizeKB%  
    return FolderSize
}
</code></pre></div><p>Представив дальнейшую отладку для отмены копирования, связи между двумя скриптами и.т.п. хочется отказатся от этой идеи. Есть мысль создать вместо Progress, контрол ActiveX HTMLFile, и в коде JScript прописать проверку папки, я так понял он выполняется &quot;своим&quot;&nbsp; потоком (на примере с <a href="http://forum.script-coding.com/viewtopic.php?pid=75636#p75636">бегущей строкой</a>) но тут я не могу помочь. Но опять же проверка целевой папки на размер не лучший способ, т.к. паралельно может производится другое изменение файлов в папках.<br />Так что наверное всё-таки проще и точнее обновлять Progress после копирования каждого файла. Но если в папке например один большой файл, то толку от этого тоже нет.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2013-11-17T20:44:15Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77385#p77385</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77383#p77383" />
			<content type="html"><![CDATA[<p>Большое благодарю за ответ, serzh82saratov ! Я только недавно начал изучать AHK, потому не очень разбираюсь в нюансах. Конечно, хотелось бы сделать свой прогресс, со своим интерфейсом. Я предполагал, что здесь надо задействовать &quot;FileGetSize&quot; или &quot;A_LoopFileSize&quot;, если я не ошибаюсь. Вероятно, такой подход к вопросу весьма затормозит сам процесс копирования? Но дело не в том. Меня уже заинтересовало, как это реализовать (принципа ради, но не кОрысти для! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />&nbsp; ). Если можно, напишите рабочий скрипт с Gui - мне легче будет разобраться в вопросе на наглядном примере .....</p>]]></content>
			<author>
				<name><![CDATA[Dr.Jekyll]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30028</uri>
			</author>
			<updated>2013-11-17T19:33:42Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77383#p77383</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77382#p77382" />
			<content type="html"><![CDATA[<p>Если интересует вызов стандартного диалога копирования с прогрессом, то:<br /></p><div class="codebox"><pre><code>
Source = D:\Programms\=Other ; Что будем копировать 

DestFolder = C:\Users\sergey\Desktop ; Куда будем копировать
 
ComObjCreate(&quot;Shell.Application&quot;).NameSpace(DestFolder).CopyHere(Source) 
return
</code></pre></div><p>Если нужен свой прогресс, то в файловом цикле копировать поштучно файлы, и после каждого копирования проверять например размер папки приёмника, в случае с переписыванием файлов чуть сложнее. В любом случае надо учитывать перед копированием есть-ли одинаковые по имени файлы в приёмнике и источнике. Минус тут - обновление только после копирования каждого файла. Обойти это можно запустив отдельным потоком (можно и не AutoHotkey) копирование папки, и уже с нужным интервалом делать проверку размера папки.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2013-11-17T18:45:54Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77382#p77382</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: FileCopyDir + Progress bar]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77374#p77374" />
			<content type="html"><![CDATA[<p>Добрый день всем!</p><p>Возник вопрос, который не удалось решить самому и не смог найти на форумах:</p><p>Как прикрутить прогресс бар к копированию директорий ( именно - директорий, а не файлов ), чтобы шкала прогресса всякий раз доходила до конца независимо от размера копируемой директории и прогресс бар выключался по завершении копирования?</p><p>Удалось ли это кому-нибудь сделать и как? Если возможно, напишите работающий пример, пожалуйста.</p><p>Типа:</p><div class="codebox"><pre><code>FileSelectFolder, CopyFrom, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}, 2, Что будем копировать?
FileSelectFolder, CopyTo, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}, 3, Куда будем копировать?
FileCopyDir, %CopyFrom%, %CopyTo%, 1

Progress, ................

Progress, Off
MsgBox, Копирование %CopyFrom% завершено.
ExitApp
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Dr.Jekyll]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30028</uri>
			</author>
			<updated>2013-11-17T12:00:23Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77374#p77374</id>
		</entry>
</feed>
