Что нового

[Сеть, интернет] GUI скрипт для копирования файлов на сервер

millgan

Новичок
Сообщения
42
Репутация
2
Версия AutoIt: v3.3.6.1

Описание: нужно GUI, которай бы позволял выбрать файлы и заслать их на сервак в папку

Примечания: Нужно это для того что в папке уже несколько тысяч файлов и папка открывается в тотале очень долго, структурировать папку невозможно так как 1с не сможет читать тогда) Сервак AD локальный
 

sss

Продвинутый
Сообщения
332
Репутация
96
Re: [Сеть, интернет] Гуишка для копирования на сервер

А какой сервак? Сайт (то бишь веб-хранилище), FTP, или какой-то другой? Или вообще Samba-server (то есть просто локалка между компами)? Поконкретнее, пожалуйста.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Re: [Сеть, интернет] Гуишка для копирования на сервер

millgan
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, Модератор форума.





millgan [?]
= GUI

Пожалуйста, исправте.
 
Автор
M

millgan

Новичок
Сообщения
42
Репутация
2
Re: [Сеть, интернет] Гуишка для копирования на сервер

Исправил! Сервак AD локальный \\10.12.3.51\files_server\1c_foto к примеру так
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Не знаю, то или не то:
Код:
$FilePath = FileOpenDialog("ВЫБЕРИТЕ ФАЙЛ ДЛЯ ОТПРАВКИ", "", "All (*.*)" )
FileCopy($FilePath, "\\10.12.3.51\files_server\1c_foto", 9)

Открывает диалог для выбора файла и потом копирует на сервак. Если файл уже существует, то перезаписывает.
 

sss

Продвинутый
Сообщения
332
Репутация
96
kzru_hunter сказал(а):
Не знаю, то или не то:
То же самое, только с GUI и известием о успехе\ошибке
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1_1 = GUICreate("Copy Master", 258, 216)
$Label1 = GUICtrlCreateLabel("Введите путь до файла", 8, 8, 121, 17)
$file_input = GUICtrlCreateInput("", 8, 24, 209, 21)
$Button1 = GUICtrlCreateButton("...", 224, 22, 27, 25, $WS_GROUP)
$Label3 = GUICtrlCreateLabel("Путь до файла на сервере", 8, 48, 138, 17)
$file_out = GUICtrlCreateInput("", 8, 64, 240, 21)
GUICtrlCreateLabel("Данная прога просто выполняет копирование", 8, 96, 240, 17)
GUICtrlCreateLabel("в шару сервера 10.12.3.51", 8, 112, 137, 17)
GUICtrlCreateLabel("Если путь до файла на сервере будет sss.exe", 8, 128, 233, 17)
GUICtrlCreateLabel("путь копирования будет таким:", 8, 144, 163, 17)
GUICtrlCreateLabel("\\10.12.3.51\files_server\sss.exe", 8, 160, 163, 17)
$Button3 = GUICtrlCreateButton("Скопировать!", 8, 184, 243, 25, $WS_GROUP)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		case $Button1
			$def_dir=@DesktopCommonDir
			$temp=FileOpenDialog('Выбери файл',$def_dir,'ALL (*.*)')
			GUICtrlSetData($file_input,$temp)
		case $Button3
			$file_in=GUICtrlRead($file_input)
			if $file_in='' Then
				MsgBox(0,'Copy Master','Файл-то укажи!')
				ContinueLoop
			EndIf
			$file_out=GUICtrlRead($file_out)
			if $file_in='' Then
				MsgBox(0,'Copy Master','Файл-то укажи!')
				ContinueLoop
			EndIf
			WinSetState($Form1_1,'',@SW_HIDE)
			TrayTip('Copy Master','Подождите, копирую! Может потребоваться много времени!',10)
			$result=FileCopy($file_in,'\\10.12.3.51\files_server\' & $file_out,9) ; тут если что замени папку files_server на любую другую
			WinSetState($Form1_1,'',@SW_SHOW)
			If $result=1 Then
				TrayTip('Copy Master','Успешно скопировано!',10)
				MsgBox(0,'Copy Master','Успешно скопировано!')
			Else
				TrayTip('Copy Master','НЕ скопировано!',10)
				MsgBox(16,'Copy Master','НЕ скопировано!')
			EndIf

	EndSwitch
WEnd

P.S. для этого нужна расшаренная папка files_server. Иначе - правка кода там де комент
P.P.S. у меня все работает (есс-но менял IP и папку, ставил D$)
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
А FileCopy лучше заменить на:
Код:
Run(@ComSpec & ' /c ' & 'copy /y /n "' & $sFileFromFullPath & '" "' & $sFileToFullPath & '"', '', @SW_HIDE)

В этом случае, пока происходит копирование, скрипт, а именно GUI, не будет "висеть".

Пример моего варианта.
 
Автор
M

millgan

Новичок
Сообщения
42
Репутация
2
Спасибо за ответы) Если не сложно то подправьте вот что:
-Выбрать нужно много файлов а не по одному
-Путь до сервера нужно не прописывать, лучше если их можно будет выбирать из трех
-И если возможно прикрутите прогресс бар
 

sss

Продвинутый
Сообщения
332
Репутация
96
Можно сделать вариант, который использует UDF библиотеку Yashied - Copy. Тогда и скрипт висеть не будет, и прогресс-бар будет. Выбор сервера сделать тоже нетрудно. Сейчас немного занят, вечером займусь.
 

sss

Продвинутый
Сообщения
332
Репутация
96
Вот что получилось. http://narod.ru/disk/5309712001/copy%20master.zip.html. Dll должна лежать вместе с прогой, как и файл servers.txt - в нем пропиши свои сервера - на каждую строчку по одному.
Пример адресации:
если путь до файла C:\sss.exe, путь на сервере - sss.exe, сам сервер - 192.168.0.1\files_server -- то файл скопирутся в \\192.168.0.1\files_server\sss.exe. Слеш в servers.txt не ставь. В процессе будет появляться файл copy.exe - не обращай внимания или просто удаляй после копирования.
Проблему с выбором нескольких файлов решил так просто копируй из основного окна файлы, будут появляться новые окошки с прогресс-баром (это и есть copy.exe, получивший пути). У меня все работает.
P.S. права залить на этот сервер файлов больше 600кб не могу, поэтому Я.Народ)
 
Автор
M

millgan

Новичок
Сообщения
42
Репутация
2
Выложи исходник плиз! Просто нужно поменять параметр

FileOpenDialog("ВЫБЕРИТЕ ФАЙЛ ДЛЯ ОТПРАВКИ", "", "All (*.*)",1 + 4 )

1 = File Must Exist (if user types a filename)
2 = Path Must Exist (if user types a path, ending with a backslash)
4 = Allow MultiSelect


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

И что обозначает строка "путь до файла на сервере"?
 

sss

Продвинутый
Сообщения
332
Репутация
96
вот исходники.
не брал в расчет это - забыл.....
путь до файла на сервере - это путь после сервера и слеша. То есть, если в эту строчку введешь Games\CS\patch.exe, то путь для копирования (как в тотале) будет \\сервер\Games\CS\patch.exe. Сегодня часа в 4 настрою скрипт по твоему примеру - для мультивыбора.
вот первый файл, назови его как угодно

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
Global $servers_array
_FileReadToArray(@ScriptDir & '\servers.txt',$servers_array)
$Form1_1 = GUICreate("Copy Master", 259, 179, 192, 125)
$Label1 = GUICtrlCreateLabel("Введите путь до файла", 8, 8, 121, 17)
$file_input = GUICtrlCreateInput("", 8, 24, 209, 21)
$Button1 = GUICtrlCreateButton("...", 224, 22, 27, 25, $WS_GROUP)
$Label3 = GUICtrlCreateLabel("Путь до файла на сервере", 8, 48, 138, 17)
$file_out = GUICtrlCreateInput("", 8, 64, 240, 21)
$Button3 = GUICtrlCreateButton("Скопировать!", 8, 144, 243, 25, $WS_GROUP)
$server_gui = GUICtrlCreateCombo("", 8, 112, 241, 25)
GUICtrlCreateLabel("Сервер:", 8, 92, 44, 17)
GUISetState(@SW_SHOW)
$i=1
$temp=''
While 1
	$temp=$temp & '|' & $servers_array[$i]
	$i=$i+1
	if $i=$servers_array[0]+1 then ExitLoop
WEnd
$temp=StringTrimLeft($temp,1)
GUICtrlSetData($server_gui,$temp)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		case $server_gui
			$server=GUICtrlRead($server_gui)
        case $Button1
            $def_dir=@DesktopCommonDir
            $temp=FileOpenDialog('Выбери файл',$def_dir,'ALL (*.*)')
            GUICtrlSetData($file_input,$temp)
        case $Button3
            $file_in=GUICtrlRead($file_input)
            if $file_in='' Then
                MsgBox(0,'Copy Master','Файл-то укажи!')
                ContinueLoop
            EndIf
            $file_out=GUICtrlRead($file_out)
            if $file_in='' Then
                MsgBox(0,'Copy Master','Файл-то укажи!')
                ContinueLoop
            EndIf
			FileDelete(@ScriptDir & '\copy.ini')
			FileWriteLine(@ScriptDir & '\copy.ini','[File]')
			FileWriteLine(@ScriptDir & '\copy.ini','file_in=' & $file_in)
			FileWriteLine(@ScriptDir & '\copy.ini','file_out=' & $file_out)
			FileWriteLine(@ScriptDir & '\copy.ini','server_ip=' & $server)
            FileInstall('copy.exe',@ScriptDir & '\copy.exe')
			Run(@ScriptDir & '\copy.exe')

    EndSwitch
WEnd
вот второй файл, назови его copy.au3 и не запуская скомпилируй, и оставь его в той же папке что и первый файл. Это сам процесс копирования, выведенный в отдельный процесс.
Код:
Global $Percent, $file_in, $file_out
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Copy.au3>

	If Not _Copy_OpenDll() Then
	    MsgBox(16, 'Copy Master', 'Copy.dll не найден!')
	    Exit
    EndIf
	$file_in=IniRead(@ScriptDir & '\copy.ini','File','file_in','')
	$file_out=IniRead(@ScriptDir & '\copy.ini','File','file_out','')
	$server=IniRead(@ScriptDir & '\copy.ini','File','server_ip','')
	$file_out='\\' & $server & '\' & $file_out
	FileDelete(@ScriptDir & '\copy.ini')

$copy_gui = GUICreate('Копирование...', 360, 150)
GUICtrlCreateLabel('Откуда:', 14, 23, 78, 14)
$file_in_gui = GUICtrlCreateInput('', 74, 20, 268, 19)
GuictrlSetState(-1,$GUI_DISABLE)
GUICtrlCreateLabel('Куда:', 14, 55, 78, 14)
$file_out_gui = GUICtrlCreateInput('', 74, 52, 268, 19)
GuictrlSetState(-1,$GUI_DISABLE)
$Progress = GUICtrlCreateProgress(14, 94, 332, 30)
GUICtrlSetData($file_in_gui,$file_in)
GUICtrlSetData($file_out_gui,$file_out)
GUISetState()

If FileExists($file_out) Then
	If MsgBox(52, '','Такой файл уже есть на сервере.' & @CR & @CR & 'Заменить?', 0, $copy_gui) <> 6 Then
		Exit
	EndIf
EndIf
$Size = FileGetSize($file_in)
_Copy_CopyFile($file_in, $file_out)
While 1
	$State = _Copy_GetState()
	If $State[0] Then
		$Data = Round($State[1] / $Size * 100)
		If $Data <> $Percent Then
			GUICtrlSetData($Progress, $Data)
			$Percent = $Data
		EndIf
	Else
		Switch $State[2]
			Case 0
				GUICtrlSetData($Progress, 100)
				MsgBox(64, '', 'Файл успешно скопирован.', 0, $copy_gui)
			Case 1235 ; ERROR_REQUEST_ABORTED
				MsgBox(16, '', 'Отмена копирования.', 0, $copy_gui)
			Case Else
				MsgBox(16, '', 'Файл не скопирован.',0, $copy_gui)
		EndSwitch
		_Copy_Abort()
		Exit
	EndIf
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			_Copy_Abort()
			Exit
	EndSwitch
WEnd
также в директории проги должны быть:
1) servers.txt - обычный текстовый файл с серверами в каждой строке
2) copy.dll - dll из верхнего архива, также пригалаю во вложении
рабочий файл - первый. не запускай не скомпилировав, а как скомпилировал, весь набор перееси в новую папку, в том числе servers.txt и copy.dll. На всякий случай)
 
Автор
M

millgan

Новичок
Сообщения
42
Репутация
2
Первый файл не компилируется) Матюкается на
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>

Eror:# include depth exceeded. Make sure there are no recursive includes
 

sss

Продвинутый
Сообщения
332
Репутация
96
Извини, что долго не отвечал - комп умер. Дурацкий Neshta.b, етить ее...(модераторы простите :smile:)
Не знаю почему не компилится. Попробуй убрать Include StaticConstatns.au3, проверь наличие. Удали неиспользующиеся. Ничего не добавлял\стирал в коде?
 

sss

Продвинутый
Сообщения
332
Репутация
96
Я дурак. Только щас обратил внимание. Сначала надо скомпилировать второй файл и назвать его Copy.exe. Для его компиляции необходима библиотека copy.au3, которую надо скачать с файлового хранилища этого форума и поместить в папку с инклюдами (по умолчанию - C:\Program Files\Autoit3\include). потом скомпилить первый файл и скопировать его в новую или другую папку.
 

djasup

Новичок
Сообщения
64
Репутация
1
Ребят а как копировать файлы на сервер Samba если стоит аутенфикация ?
 
Верх