Что нового

Определение выделенных файлов в папке.

saraconor

Новичок
Сообщения
404
Репутация
3
в папке есть несколько файлов и папок, часть из них выделена.

какие функции autoit отвечают за выделенные файлы? можно ли выделить их из общей массы файлов и папок в папке, чтобы потом работать только с выделенными, к примеру сосчитать их, взвесить, путь узнать итп?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
saraconor

Скрипт, который я выкладывал в этой теме
http://autoit-script.ru/index.php/topic,16080.0.html
получает массив со списком путей до выделенных файлов и папок.

Нужно только в цикле пробежаться по массиву, и произвести с путями нужные действия.

К сожалению, почему возникает ошибка, описаная в той теме, сказать не могу - не сталкивался.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
WSWR
у меня ошибки не вылетает, но скрипт нормально работает только при выделении файлов и папок в открытой папке. при выделении файлов и папок на рабочем столе получается только один файл в результате
ну и ярлыки он не угадывает
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
joiner сказал(а):
WSWR
у меня ошибки не вылетает, но скрипт нормально работает только при выделении файлов и папок в открытой папке. при выделении файлов и папок на рабочем столе получается только один файл в результате
ну и ярлыки он не угадывает
Рабочий стол - отдельный случай, как и еще несколько папок
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
WSWR сказал(а):
saraconor

Скрипт, который я выкладывал в этой теме
http://autoit-script.ru/index.php/topic,16080.0.html
получает массив со списком путей до выделенных файлов и папок.

Нужно только в цикле пробежаться по массиву, и произвести с путями нужные действия.

К сожалению, почему возникает ошибка, описаная в той теме, сказать не могу - не сталкивался.

Я не могу понять что делает ваш скрипт, вы можете на словах пересказать что делает ваш скрипт, и какую именно функцию использует? я попытаюсь через help выяснить остальное и составить свой скрипт, т.к. ошибка все портит конечно(
 

erlik

Продвинутый
Сообщения
317
Репутация
84
А не проще, например, таким вариантом пользоваться:
Код:
#include <Clipboard.au3>
#include <Array.au3>

; для теста выделяем файлы и жмем Ctrl+1

HotKeySet('^{1}','test') 
HotKeySet('{ESC}','_Exit')

Func test()
	$aRet = StringSplit(_GetListFilesFromSelection(),@LF)
	_ArrayDisplay($aRet)
EndFunc

While 1
   Sleep(10)
WEnd

Func _Exit()
	Exit
EndFunc

;возвращает строку со списком файлов, разделенных указанным сепаратором
Func _GetListFilesFromSelection($Delimiter=@LF)
    Send('^{INSERT}') ;  копириуем список выделенных файлов в буфер обмена
    Sleep(500)
    ;=========================================================
    Local $sFiles, $Return='', $tBuffer = DllStructCreate("char[256]")
    _ClipBoard_Open(0)
    Local $pData = _ClipBoard_GetDataEx($CF_HDROP)
    If Not @error Then
		$aRet = DllCall("shell32.dll", "int", "DragQueryFile", "ptr", $pData, "int", -1, "ptr", 0, "int", 0)
		For $i = 0 To $aRet[0] - 1
			DllCall("shell32.dll", "int", "DragQueryFile", "ptr", $pData, "int", $i, "ptr", DllStructGetPtr($tBuffer), "int", DllStructGetSize($tBuffer))
			$sFiles = DllStructGetData($tBuffer, 1)
			$Return&=$sFiles
			If $i<> $aRet[0] - 1 Then $Return&=$Delimiter
		Next
	    If $aRet[0]=0 Then $Return=-1
	Else
		$Return=-1
	EndIf
	$tBuffer = 0
    _ClipBoard_Empty()
    _ClipBoard_Close()
    Return $Return
EndFunc   ;==>_GetListFilesFromSelection

C рабочего стола также получает список (и ярлыков в том числе), но нельзя выделять ActiveX объекты типа корзины, Моего компьютера и т.д., иначе список файлов не будет возвращен.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
тогда может просто так?
Код:
#include <Array.au3>

; для теста выделяем файлы и жмем Ctrl+1

HotKeySet('^{1}','test')
HotKeySet('{ESC}','_Exit')

Func test()
       Send('^{INSERT}')
 		$clip_g = ClipGet()
		If $clip_g Then
			$split_clip = StringSplit($clip_g, @LF, 2)
			ClipPut('')
    _ArrayDisplay($split_clip)
	EndIf
EndFunc

While 1
   Sleep(10)
WEnd

Func _Exit()
    Exit
EndFunc
 

erlik

Продвинутый
Сообщения
317
Репутация
84
joiner
+1 :IL_AutoIt_1:
Я вообще упустил из виду, что ClipGet и сама умеет список файлов возвращать.
Вот только декстоп этот вариант не берет. Ошибся -берет, у меня там просто чего то зависло.
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
erlik сказал(а):
А не проще, например, таким вариантом пользоваться:
Код:
#include <Clipboard.au3>
#include <Array.au3>

; для теста выделяем файлы и жмем Ctrl+1

HotKeySet('^{1}','test') 
HotKeySet('{ESC}','_Exit')

Func test()
	$aRet = StringSplit(_GetListFilesFromSelection(),@LF)
	_ArrayDisplay($aRet)
EndFunc

While 1
   Sleep(10)
WEnd

Func _Exit()
	Exit
EndFunc

;возвращает строку со списком файлов, разделенных указанным сепаратором
Func _GetListFilesFromSelection($Delimiter=@LF)
    Send('^{INSERT}') ;  копириуем список выделенных файлов в буфер обмена
    Sleep(500)
    ;=========================================================
    Local $sFiles, $Return='', $tBuffer = DllStructCreate("char[256]")
    _ClipBoard_Open(0)
    Local $pData = _ClipBoard_GetDataEx($CF_HDROP)
    If Not @error Then
		$aRet = DllCall("shell32.dll", "int", "DragQueryFile", "ptr", $pData, "int", -1, "ptr", 0, "int", 0)
		For $i = 0 To $aRet[0] - 1
			DllCall("shell32.dll", "int", "DragQueryFile", "ptr", $pData, "int", $i, "ptr", DllStructGetPtr($tBuffer), "int", DllStructGetSize($tBuffer))
			$sFiles = DllStructGetData($tBuffer, 1)
			$Return&=$sFiles
			If $i<> $aRet[0] - 1 Then $Return&=$Delimiter
		Next
	    If $aRet[0]=0 Then $Return=-1
	Else
		$Return=-1
	EndIf
	$tBuffer = 0
    _ClipBoard_Empty()
    _ClipBoard_Close()
    Return $Return
EndFunc   ;==>_GetListFilesFromSelection

C рабочего стола также получает список (и ярлыков в том числе), но нельзя выделять ActiveX объекты типа корзины, Моего компьютера и т.д., иначе список файлов не будет возвращен.

Ого, как элегантно...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
saraconor,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 
Верх