<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Копирование файлов из одной папки в другую и обратно]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=12628</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=12628&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Копирование файлов из одной папки в другую и обратно».]]></description>
		<lastBuildDate>Wed, 19 Apr 2017 23:14:43 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Копирование файлов из одной папки в другую и обратно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=115202#p115202</link>
			<description><![CDATA[<p>Такой небольшой пример может оказаться интересным, для использования массивов с ListView:<br /></p><div class="codebox"><pre><code>
#SingleInstance, Force
#NoEnv
SetWorkingDir, A_ScriptDir
SetBatchLines, -1

; &gt;&gt;--++--&lt;&lt;  &gt;&gt;--++--&lt;&lt; 
	tableNames:=[&quot;Содержимое&quot;]
; &gt;&gt;--++--&lt;&lt;  &gt;&gt;--++--&lt;&lt; 

Gui, 1:Add,ListView,w760 h300 NoSort vLVval +LV0x00010000 +HwndLV_H
Gui, 1:Add,Button,xm y+10 gGetFiles,Получить файлы из папки
Gui, 1:Show,,Список
Menu,MyContextMenu,Add,Получить выбранные строки,GetRows	; Заполняет массив selectedRowsArr выделенными строками
Menu,MyContextMenu,Add,Получить выбранную строку,GetItem	; Возвращает значение из исходного массива, расположение которого
															; получается по клику в координатах вызова контекстного меню 
return

; &gt;&gt;--++--&lt;&lt; SUB &gt;&gt;--++--&lt;&lt; 

GuiClose:
	ExitApp
GetFiles:
	InputBox,myPath,Выбор,Указать полный путь к папке.,,,,,,,,%A_MyDocuments%
	if (ErrorLevel==1)
		return
	filesArr:=[]							; очистить переменную
	mask:=% RTrim(myPath,&quot;\&quot;) &quot;\*.*&quot;
	Loop,%mask%,,1
	{
		tmpArr:=[]
		tmpArr:=[A_LoopFileFullPath]
		filesArr.Push(tmpArr)
	}
	tmpTable:=[],tmpTable.Push(tableNames,filesArr*)
	ReCreateTable(tmpTable)
return
GetRows:
	loopStartAt:=0
	selectedRowsArr:=[]						; массив выделенных строк
	if (newRowNmbr-selectedRows&gt;0)
		loopStartAt:=newRowNmbr-selectedRows
	Loop {
		loopStartAt:=LV_GetNext(loopStartAt)
		if (!loopStartAt)
			break
		LV_GetText(Text,loopStartAt)
		selectedRowsArr.Push(Text)
	}
	MsgBox,,Результат,% Format(&quot;Выделено строк -&gt; {1}.`nПервая содержит путь:`n{2}.`n`nПоследняя содержит путь:`n{3}&quot;,i:=selectedRowsArr.Length(),selectedRowsArr[1],selectedRowsArr[i])
return
GetItem:
	MsgBox,,Результат,% LV_Item
return
GuiContextMenu:
	if (A_GuiControl!=&quot;LVval&quot;)
		return
	newRowNmbr:=A_EventInfo										; Номер строки в которую был совершён клик
	selectedRows:=LV_GetCount(&quot;S&quot;)
	if (newRowNmbr&gt;0) {
		LV_Item:=tmpTable[newRowNmbr+1][LV_GetColNmbr(LV_H)]	; Получать элементы можно так же из массива, а не только из таблицы.
																; Поскольку первый элемент это имена для столбцов, основное
																; содержимое начинается со второго элемента, поэтому номер строки
																; указывается как newRowNmbr+1
		Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
	}
return
; &gt;&gt;--++--&lt;&lt; FUNC &gt;&gt;--++--&lt;&lt; 

; #========================================================================================#
;	ReCreateTable(tableArr) - Перезаполняет ListView новыми данными.
;								 Принимает массив массивов, где первым его элементом должен
;								 быть массив, содержащий имена для столбцов. Количество
;								 элементов в содержащихся массивах должно быть одинаковым.
; #========================================================================================#
ReCreateTable(tableArr) {					; пересоздаёт ListView из полученного массива
	Global
	GuiControl, -ReDraw, LVval
	LV_Delete()								; удалить содержимое ListView
	Loop, % LV_GetCount(&quot;Column&quot;)
		LV_DeleteCol(1)
	Loop,% tableArr[1].Length()			; задать имена колонкам, содержащиеся в первом массиве
		LV_InsertCol(A_Index,&quot;&quot;, tableArr[1][A_Index])
	Loop,% tableArr.Length()-1 {			; распихать содержимое остальных массивов по колонкам в новой строке для каждого
		rNmbr := LV_Add(&quot;&quot;, &quot;&quot;)
		Loop,% tableArr[rNmbr+1].Length()
			LV_Modify(rNmbr, &quot;Col&quot; . A_Index, tableArr[rNmbr+1][A_Index])
	}
	Loop, % tableArr[1].Length()
		LV_ModifyCol(A_Index, &quot;AutoHdr&quot;)
	GuiControl, +ReDraw, LVval
}
LV_GetColNmbr(HLV) {						; возвращает номер колонки, в которую был совершён клик
	Static LVM_SUBITEMHITTEST := 0x1039
	VarSetCapacity(POINT, 8, 0)
	DllCall(&quot;User32.dll\GetCursorPos&quot;, &quot;Ptr&quot;, &amp;POINT)
	DllCall(&quot;User32.dll\ScreenToClient&quot;, &quot;Ptr&quot;, HLV, &quot;Ptr&quot;, &amp;POINT)
	VarSetCapacity(LVHITTESTINFO, 24, 0)
	NumPut(NumGet(POINT, 0, &quot;Int&quot;), LVHITTESTINFO, 0, &quot;Int&quot;)
	NumPut(NumGet(POINT, 4, &quot;Int&quot;), LVHITTESTINFO, 4, &quot;Int&quot;)
	SendMessage, LVM_SUBITEMHITTEST, 0, &amp;LVHITTESTINFO, , ahk_id %HLV%
	If (ErrorLevel = -1)
		Return 0
	Subitem := NumGet(LVHITTESTINFO, 16, &quot;Int&quot;) + 1
		Return Subitem
}
</code></pre></div><p>При желании можно дополнить нужным функционалом, таким как удаление строк из ListView и содержащего их же массива, файлы которых были перемещены и возвращение их обратно, в случае, если их было решено вернуть.</p>]]></description>
			<author><![CDATA[null@example.com (KusochekDobra)]]></author>
			<pubDate>Wed, 19 Apr 2017 23:14:43 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=115202#p115202</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Копирование файлов из одной папки в другую и обратно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=115196#p115196</link>
			<description><![CDATA[<p>Справился, спасибо:</p><div class="codebox"><pre><code>copyout:
loop
{
if i&lt;1
break
g:=m%i%
filecopy, %tofolder%\%g%, %folder%, 1
i:=i-1
}
return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Oomniq)]]></author>
			<pubDate>Wed, 19 Apr 2017 21:02:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=115196#p115196</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Копирование файлов из одной папки в другую и обратно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=115192#p115192</link>
			<description><![CDATA[<p>Посмотрите в англоязычной справке про массивы. Проще всего начать с псевдомассивов (Pseudo-Arrays):<br /></p><div class="codebox"><pre><code>Array%j% := A_LoopField</code></pre></div><p> То есть сохраняете содержимое ячеек в переменные с похожими названиями, плюс ещё одна переменная, хранящая их количество.</p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Wed, 19 Apr 2017 19:12:44 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=115192#p115192</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Копирование файлов из одной папки в другую и обратно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=115188#p115188</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p><span class="bbu">Пробовал</span> запоминать в массиве (не самый привлекательный метод) и через ввод дополнительных переменных, <span class="bbu">но не удалось</span>.</p></blockquote></div><div class="codebox"><pre><code>
copyto:
i = 0
RowNumber = 0
Loop
{
RowNumber := LV_GetNext(RowNumber)
	if not RowNumber
		break
i:=i+1
LV_GetText(folder, RowNumber, 2)
LV_GetText(filename, RowNumber, 1)
filecopy, %folder%\%filename%, %tofolder%, 1
m%i%:=filename
}
return

copyout:
loop
{
if i&lt;1
break
filecopy, %tofolder%\m%i%, %folder%, 1 				;	?
i:=i-1
}
return
</code></pre></div><p>Такой вариант, разумеется, не прокатил. Были и другие, но всё равно не справился. Какой тут правильный синтаксис? Или всё-таки реализуется иначе?</p>]]></description>
			<author><![CDATA[null@example.com (Oomniq)]]></author>
			<pubDate>Wed, 19 Apr 2017 17:59:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=115188#p115188</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Копирование файлов из одной папки в другую и обратно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=115187#p115187</link>
			<description><![CDATA[<div class="quotebox"><cite>Oomniq пишет:</cite><blockquote><p>Таким образом совершаем нечто вроде резервного копирования. Как лучше организовать возможность конкретно эти же файлы потом из &quot;tofolder&quot; в &quot;folder&quot; копировать, вне зависимости от выделенных на данный момент строк?</p></blockquote></div><p> Ну раз выделение было снято, значит нужно как-то запоминать последнее резервное копирование. В файл сохранять или в переменную. Массив - вполне вариант.</p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Wed, 19 Apr 2017 16:37:10 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=115187#p115187</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Копирование файлов из одной папки в другую и обратно]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=115181#p115181</link>
			<description><![CDATA[<p>Здравствуйте. Бьюсь и всё не могу толкового ничего придумать:</p><div class="codebox"><pre><code>copyto:
RowNumber = 0
Loop
{
RowNumber := LV_GetNext(RowNumber)
	if not RowNumber
		break
LV_GetText(folder, RowNumber, 2)
LV_GetText(filename, RowNumber, 1)
filecopy, %folder%\%filename%, %tofolder%, 1
}
return</code></pre></div><p>Эта функция берёт из listview сведения (путь и имя) файлов выделенных пользователем и копирует в заранее указанную папку. Обычно, это от одного до десятка файлов. Таким образом совершаем нечто вроде резервного копирования. Как лучше организовать возможность конкретно эти же файлы потом из &quot;tofolder&quot; в &quot;folder&quot; копировать, вне зависимости от выделенных на данный момент строк?</p><p>Пример:<br />1) Выделяем в listview три файла, жмём горячую клавишу - функция выполняется, мы скопировали три файла в папку назначения.<br />2) Выделяем два других файла, жмём горячую клавишу - докопировались ещё два файла.<br />3) Выделяем какие-нибудь другие файлы, сворачиваем программу, открываем сторонний процесс или просто бездействуем.<br />4) Жмём другую горячую клавишу - два последних скопированных файла скопировались обратно из папки назначения в папку-источник.</p><p>Есть же какое-то простое решение и я вроде бы его даже знал, но оно никак не смогло вновь нарисоваться в воображении. Пробовал запоминать в массиве (не самый привлекательный метод) и через ввод дополнительных переменных, но не удалось.<br />Помогите, пожалуйста.</p>]]></description>
			<author><![CDATA[null@example.com (Oomniq)]]></author>
			<pubDate>Wed, 19 Apr 2017 15:51:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=115181#p115181</guid>
		</item>
	</channel>
</rss>
