Что нового

Выбор нескольких файлов

Сообщения
60
Репутация
-2
Привет. Почему у меня не получается переместить/копировать несколько файлов?
Когда один файл выбран, то нормально, а когда выбрано более, то ни один не обрабатывается

Код:
$file=FileOpenDialog("Select Files", "", "All Files (*.*)", 4)
$dir=FileSelectFolder("Select Folder", "", 2)
FileCopy($file, $dir)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Parazit
Почему у меня не получается
В справке сказано:
[box]Возвращаемое значение
Успех: Возвращает полный путь и имена выбранных файлов. Результат для нескольких объектов: "Каталог|Файл1|Файл2|..."
[/box]
Если вам сложно понять смысл написанного, то можно разобрать пример в той же справке. В противном случае результат работы функции при выборе нескольких файлов можно просто посмотреть
Код:
$file=FileOpenDialog("Select Files", "", "All Files (*.*)", 4)
MsgBox(0, "", $file)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
чуть было не выложил готовый вариант :smile:
Parazit
ничего оскорбительного в словах InnI нет. всегда найдется что-то, что трудно понять. я сам много не понимаю. стараюсь экспериментировать с чужими примерами чтобы добиться нужного результата. но я признаю, что не понимаю. и не даун
у тебя не получается скопировать, потому что нужно формировать пути. ты этого не понял. вот тебя и подтолкнули к размышлению.
ты сейчас в роли спрашивающего, так будь благодарен за любой совет. иначе тебе больше никто здесь помогать не будет. это факт
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
Parazit
Ещё одно оскорбление и я выпишу вам бан на недельку, чтобы вы подумали.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
примерный пример :smile:
Код:
Local $title = "Удерживайте клавиши Ctrl или Shift, чтобы выбрать несколько файлов."
Local $var = FileOpenDialog($title, @ScriptDir, "Все файлы (*)", 1 + 4)
If @error Then
	MsgBox(4096, "", "Не выбрано ни одного файла")
Else
	Local $sPath
	Local $sDest = FileSelectFolder('Выбор папки назначения', @ScriptDir, 7)
	If @error Then Exit
	$var = StringSplit($var, "|")
	$sPath = $var[1] & '\'
	$sDest = $sDest & '\'
	For $i = 2 To $var[0]
		FileCopy($sPath & $var[$i], $sDest & $var[$i], 9)
	Next
EndIf
 
Автор
Parazit
Сообщения
60
Репутация
-2
Спасибо


Добавлено:
Сообщение автоматически объединено:

joiner, а как мне проверять на наличие файлов в каталоге назначения, и в случае их присутствия,
добавлять к копируемым именам файлов счётчик?
 
Сообщения
137
Репутация
-2
Parazit сказал(а):
Извиняюсь, я погорячился

Я потратил 2 часа времени, разбирая твой вопрос и комментарий от InnI. Перепробовал много вариантов, начитался справки, MsgBox выдаёт результат в виде: "Каталог|Файл1|Файл2|..." Но у меня также не копировалось несколько файлов, добавил функцию StringReplace , везде проставил "|", пробовал с @CRLF - файлы не копируются. Сижу сам тут как тот идиот и жду продолжения твоего диалога с InnI для дальнейших пояснений. А теперь, из-за тебя горячего, я не узнаю к какому пути решения тебя подталкивали.
 
Автор
Parazit
Сообщения
60
Репутация
-2
Dessan, вон же joiner уже дал рабочий скрипт. Осталось выяснить, как добавлять счётчик
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Parazit
типа файл_копия_1, файл_копия_2 и так далее?


Добавлено:
Сообщение автоматически объединено:

если я правильно понял, то можно так

Код:
Local $title = "Удерживайте клавиши Ctrl или Shift, чтобы выбрать несколько файлов."
Local $var = FileOpenDialog($title, @ScriptDir, "Все файлы (*)", 1 + 4)
If @error Then
	MsgBox(4096, "", "Не выбрано ни одного файла")
Else
	Local $sPath, $iC, $extn
	Local $sDest = FileSelectFolder('Выбор папки назначения', @ScriptDir, 7)
	If @error Then Exit
	$var = StringSplit($var, "|")
	$sPath = $var[1] & '\'
	$sDest = $sDest & '\'
	For $i = 2 To $var[0]
		If FileExists($sDest & $var[$i]) Then
			$extn = _div($var[$i])
			Do
				$iC += 1
			Until Not FileExists($sDest & $extn[0] & '(' & $iC & ')' & $extn[1])
			FileCopy($sPath & $var[$i], $sDest & $extn[0] & '(' & $iC & ')' & $extn[1])
			$iC = 0
		Else
			FileCopy($sPath & $var[$i], $sDest & $var[$i])
		EndIf
	Next
EndIf

Func _div($sString)
	Local $div[2]
	Local $ip = StringInStr($sString, '.', 0, -1)
	Local $name = StringLeft($sString, $ip - 1)
	Local $ext = StringTrimLeft($sString, $ip - 1)
	$div[0] = $name
	$div[1] = $ext
	Return $div
EndFunc   ;==>_div
 
Автор
Parazit
Сообщения
60
Репутация
-2
joiner, да, можно "файл_копия_1", а можно просто "name-1", "name-2", и т.д.
Ваш скрипт не совсем правильно работает.
Он работает, когда выбрано несколько файлов, но когда выбран только один, то файл не копируется
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Тогда так

Код:
Local $title = "Удерживайте клавиши Ctrl или Shift, чтобы выбрать несколько файлов."
Local $var = FileOpenDialog($title, @ScriptDir, "Все файлы (*)", 1 + 4)
If @error Then
	MsgBox(4096, "", "Не выбрано ни одного файла")
Else
	Local $sPath, $iC, $extn
	Local $sDest = FileSelectFolder('Выбор папки назначения', @ScriptDir, 7)
	If @error Then Exit
	$sDest = $sDest & '\'
	$var = StringSplit($var, "|")
	If UBound($var) = 2 Then
		Local $gtn = StringRegExpReplace($var[1], '.*\\', '')
		If FileExists($sDest & $gtn) Then
			$extn = _div($gtn)
			Do
				$iC += 1
			Until Not FileExists($sDest & $extn[0] & '-' & $iC & $extn[1])
			FileCopy($var[1], $sDest & $extn[0] & '-' & $iC & $extn[1])
		Else
			FileCopy($var[1], $sDest & $gtn)
		EndIf
	Else
		$sPath = $var[1] & '\'
		For $i = 2 To $var[0]
			If FileExists($sDest & $var[$i]) Then
				$extn = _div($var[$i])
				Do
					$iC += 1
				Until Not FileExists($sDest & $extn[0] & '-' & $iC & $extn[1])
				FileCopy($sPath & $var[$i], $sDest & $extn[0] & '-' & $iC & $extn[1])
				$iC = 0
			Else
				FileCopy($sPath & $var[$i], $sDest & $var[$i])
			EndIf
		Next
	EndIf
EndIf

Func _div($sString)
	Local $div[2]
	Local $ip = StringInStr($sString, '.', 0, -1)
	Local $name = StringLeft($sString, $ip - 1)
	Local $ext = StringTrimLeft($sString, $ip - 1)
	$div[0] = $name
	$div[1] = $ext
	Return $div
EndFunc   ;==>_div
 
Автор
Parazit
Сообщения
60
Репутация
-2
joiner, гениально. Спасибо

joiner, задача чуть изменилась. Сам я это не осилю.
Я передаю выделенные в Total Commander файлы через параметр %P%S.
Т.е., мне не надо уже использовать FileOpenDialog. Как мне правильно это организовать?

Код:
$sDest = FileSelectFolder('Select Folder', '', 7)
For $i=1 To $CmdLine[0]
;If FileExists($sDest & $CmdLine[$i]) Then
        ;FileCopy($CmdLine[$i] + 'sss', $sDest)
;EndIf
;Next

;
;
;Local $title = "Удерживайте клавиши Ctrl или Shift, чтобы выбрать несколько файлов."
;Local $var = FileOpenDialog($title, @ScriptDir, "Все файлы (*)", 1 + 4)
;If @error Then
    ;MsgBox(4096, "", "Не выбрано ни одного файла")
;Else
    ;Local $sPath, $iC, $extn
;    
    ;$var = 
;    Local $sDest = FileSelectFolder('Выбор папки назначения', @ScriptDir, 7)
    ;If @error Then Exit
    $sDest = $sDest & '\'
    $CmdLine = StringSplit($CmdLine, "|")
    If UBound($CmdLine) = 2 Then
        Local $gtn = StringRegExpReplace($CmdLine[1], '.*\\', '')
        If FileExists($sDest & $gtn) Then
            $extn = _div($gtn)
            Do
                $iC += 1
            Until Not FileExists($sDest & $extn[0] & '-' & $iC & $extn[1])
            FileCopy($CmdLine[1], $sDest & $extn[0] & '-' & $iC & $extn[1])
        Else
            FileCopy($CmdLine[1], $sDest & $gtn)
        EndIf
    Else
        $sPath = $CmdLine[1] & '\'
        For $i = 2 To $CmdLine[0]
            If FileExists($sDest & $CmdLine[$i]) Then
                $extn = _div($CmdLine[$i])
                Do
                    $iC += 1
                Until Not FileExists($sDest & $extn[0] & '-' & $iC & $extn[1])
                FileCopy($sPath & $CmdLine[$i], $sDest & $extn[0] & '-' & $iC & $extn[1])
                $iC = 0
            Else
                FileCopy($sPath & $CmdLine[$i], $sDest & $CmdLine[$i])
            EndIf
        Next
    EndIf
        Next
;EndIf

Func _div($sString)
    Local $div[2]
    Local $ip = StringInStr($sString, '.', 0, -1)
    Local $name = StringLeft($sString, $ip - 1)
    Local $ext = StringTrimLeft($sString, $ip - 1)
    $div[0] = $name
    $div[1] = $ext
    Return $div
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
в каком виде передается строка в $CmdLine ?
 
Автор
Parazit
Сообщения
60
Репутация
-2
Выделенные файлы с полным путём.
Как обычные аргументы, переданные скрипту, начиная с нулевого.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Parazit
пример приведи. я не пользуюсь ТС
 
Автор
Parazit
Сообщения
60
Репутация
-2
Это то же самое, как ввести в окне cmd.exe.

"C:\FileCopy.au3" "C:\111.txt" "C:\222.txt"
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
собери нижеприведенный скрипт в экзешник и перетащи мышкой на него файлы
Код:
Local $iC, $extn, $gtn
Local $sDest = FileSelectFolder('Выбор папки назначения', @ScriptDir, 7)
If @error Then Exit
$sDest = $sDest & '\'
For $i = 1 To $cmdline[0]
	$gtn = StringRegExpReplace($cmdline[$i], '.*\\', '')
	If FileExists($sDest & $gtn) Then
		$extn = _div($gtn)
		Do
			$iC += 1
		Until Not FileExists($sDest & $extn[0] & '-' & $iC & $extn[1])
		FileCopy($cmdline[$i], $sDest & $extn[0] & '-' & $iC & $extn[1])
		$iC = 0
	Else
		FileCopy($cmdline[$i], $sDest & $gtn)
	EndIf
Next

Func _div($sString)
	Local $div[2]
	Local $ip = StringInStr($sString, '.', 0, -1)
	Local $name = StringLeft($sString, $ip - 1)
	Local $ext = StringTrimLeft($sString, $ip - 1)
	$div[0] = $name
	$div[1] = $ext
	Return $div
EndFunc   ;==>_div
 
Автор
Parazit
Сообщения
60
Репутация
-2
Спасибо, это то, что доктор прописал.
 
Верх