Что нового

[Файловая система] Копирование файла в предопределённую папку.

Roman Naz-ko

Новичок
Сообщения
4
Репутация
0
Версия AutoIt: 3.

Описание: Добрый день! Возникла идея программки, которая упростит рутину для домашнего медиацентра\качалки.
Пример гуи приложил. Смысл программки - ассоциировать с ней расширение .torrent, далее в GUI нажатием по названию категории, файл .torrent перемещается в одну из предопределённых локальных папок. Например: скачали .torrent файл сериала. Двойным кликом по нему открывается диалог нашей программки (мы заранее настроили ассоциацию), кликаем на кнопочку "Сериал", файл перемещается в D:\Torrent\TV_Shows, где его уже подхватывает торрент клиент.
Думаю, многим программа может оказаться полезной.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Roman Naz-ko

Код:
#include <GUIConstants.au3>

Global $sFile

If UBound($CmdLine) > 1 Then
	$sFile = $CmdLine[1]
Else
	Exit
EndIf

$Form1 = GUICreate('Form1', 222, 380, -1, -1)
$Button1 = GUICtrlCreateButton('Фильм', 60, 44, 101, 45, 0)
$Button2 = GUICtrlCreateButton('Сериал', 60, 105, 101, 45, 0)
$Button3 = GUICtrlCreateButton('Музыка', 60, 165, 101, 45, 0)
$Button4 = GUICtrlCreateButton('Игра', 60, 226, 101, 45, 0)
$Button5 = GUICtrlCreateButton('Разное', 62, 287, 101, 45, 0)
$Label1 = GUICtrlCreateLabel('Категория', 76, 16, 72, 20)
GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			_Copir(1)
		Case $Button2
			_Copir(2)
		Case $Button3
			_Copir(3)
		Case $Button4
			_Copir(4)
		Case $Button5
			_Copir(5)
	EndSwitch
WEnd

Func _Copir($iV)
	$aPath = _PathSplitByRegExp($sFile)
	Switch $iV
		Case 1
			FileMove($sFile, 'C:\Фильм\' & $aPath[5], 1)
		Case 2
			FileMove($sFile, 'C:\Сериал\' & $aPath[5], 1)
		Case 3
			FileMove($sFile, 'C:\Музыка\' & $aPath[5], 1)
		Case 4
			FileMove($sFile, 'C:\Игра\' & $aPath[5], 1)
		Case 5
			FileMove($sFile, 'C:\Разное\' & $aPath[5], 1)
	EndSwitch
EndFunc   ;==>_Copir

Func _PathSplitByRegExp($sPath)
	If $sPath = '' Or(StringInStr($sPath, "\") And StringInStr($sPath, "/")) Then Return SetError(1, 0, -1)
	Local $aRetArray[8], $pDelim = ""
	If StringRegExp($sPath, '^(?i)([A-Z]:|\\)(\\[^\\]+)+$') Then $pDelim = "\"
	If StringRegExp($sPath, '(?i)(^.*:/)(/[^/]+)+$') Then $pDelim = "//"
	If $pDelim = "" Then $pDelim = "/"
	If Not StringInStr($sPath, $pDelim) Then Return $sPath
	If $pDelim = "\" Then $pDelim &= "\"
	$aRetArray[0] = $sPath ;Full path
	$aRetArray[1] = StringRegExpReplace($sPath, $pDelim & '.*', $pDelim) ;Drive letter
	$aRetArray[2] = StringRegExpReplace($sPath, $pDelim & '[^' & $pDelim & ']*$', '') ;Path without FileName and extension
	$aRetArray[3] = StringRegExpReplace($sPath, '\.[^.]*$', '') ;Full path without File Extension
	$aRetArray[4] = StringRegExpReplace($sPath, '(?i)([A-Z]:' & $pDelim & ')', '') ;Full path without drive letter
	$aRetArray[5] = StringRegExpReplace($sPath, '^.*' & $pDelim, '') ;FileName and extension
	$aRetArray[6] = StringRegExpReplace($sPath, '.*' & $pDelim & '|\.[^.]*$', '') ;Just Filename
	$aRetArray[7] = StringRegExpReplace($sPath, '^.*\.', '') ;Just Extension of a file
	Return $aRetArray
EndFunc   ;==>_PathSplitByRegExp


Компилируешь этот код в exe и устанавливаешь ассоциацию с этим exe.
 
Автор
Roman Naz-ko

Roman Naz-ko

Новичок
Сообщения
4
Репутация
0
Просто шикарно. Отлично работает, то что надо.
 
Автор
Roman Naz-ko

Roman Naz-ko

Новичок
Сообщения
4
Репутация
0
Ещё одно маленькое дополнение: как в вышеприведённом коде сделать так, что бы GUI закрывался после удачного завершения перемещения файла?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Roman Naz-ko
А нужно, чтобы сама программа выгружалась или нет?

Вообще достаточно изменить функцию _Copir :

Код:
Func _Copir($iV)
    $aPath = _PathSplitByRegExp($sFile)
    Switch $iV
        Case 1
            $f = FileMove($sFile, 'C:\Фильм\' & $aPath[5], 1)
        Case 2
            $f = FileMove($sFile, 'C:\Сериал\' & $aPath[5], 1)
        Case 3
            $f = FileMove($sFile, 'C:\Музыка\' & $aPath[5], 1)
        Case 4
            $f = FileMove($sFile, 'C:\Игра\' & $aPath[5], 1)
        Case 5
            $f = FileMove($sFile, 'C:\Разное\' & $aPath[5], 1)
	EndSwitch
	If $f = 1 Then Exit	
EndFunc   ;==>_Copir
 
Автор
Roman Naz-ko

Roman Naz-ko

Новичок
Сообщения
4
Репутация
0
If $f = 1 Then Exit
Отлично, именно так и задумывалось. Спасибо!
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Roman Naz-ko

Изменил немного само окно и координаты появления:

Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

If UBound($CmdLine) > 1 Then
   Global $sFile = $CmdLine[1]
Else
    Exit
EndIf

If WinExists('Form1#!*', '') Then Exit

$aXY = MouseGetPos()

$hTrayWnd= WinGetPos('[CLASS:Shell_TrayWnd]') 
$hProgman  = WinGetPos('[CLASS:Progman]') 
$w = $hProgman[2]
$h = $hProgman[3]- $hTrayWnd[3]

If $aXY[1] + 320 > $h Then $aXY[1] = $aXY[1] + ($h - $aXY[1] - 320)

If $aXY[0] + 140 > $w Then $aXY[0] = $aXY[0] + ($w - $aXY[0] - 300)

$Form1 = GUICreate('Form1#!*', 140, 320, $aXY[0] + 20, $aXY[1], BitOR($WS_POPUP, $WS_BORDER))

$nClose_Button = GUICtrlCreateButton('X', 121, 1, 18, 18)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0xFF0000)
GUICtrlCreateLabel('', 0, 0, 140, 20, $WS_CLIPSIBLINGS, BitOR($WS_EX_DLGMODALFRAME, $GUI_WS_EX_PARENTDRAG))

$Button1 = GUICtrlCreateButton('Фильм', 20, 25, 101, 45, 0)
$Button2 = GUICtrlCreateButton('Сериал', 20, 85, 101, 45, 0)
$Button3 = GUICtrlCreateButton('Музыка', 20, 145, 101, 45, 0)
$Button4 = GUICtrlCreateButton('Игра', 20, 205, 101, 45, 0)
$Button5 = GUICtrlCreateButton('Разное', 20, 265, 101, 45, 0)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $nClose_Button
            Exit
        Case $Button1
            _Copir(1)
        Case $Button2
            _Copir(2)
        Case $Button3
            _Copir(3)
        Case $Button4
            _Copir(4)
        Case $Button5
            _Copir(5)
    EndSwitch
WEnd

Func _Copir($iV)
      $aPath = _PathSplitByRegExp($sFile)
    Switch $iV
        Case 1
            $f = FileMove($sFile, 'C:\Фильм\' & $aPath[5], 1)
        Case 2
            $f = FileMove($sFile, 'C:\Сериал\' & $aPath[5], 1)
        Case 3
            $f = FileMove($sFile, 'C:\Музыка\' & $aPath[5], 1)
        Case 4
            $f = FileMove($sFile, 'C:\Игра\' & $aPath[5], 1)
        Case 5
            $f = FileMove($sFile, 'C:\Разное\' & $aPath[5], 1)
    EndSwitch
    If $f = 1 Then Exit 
EndFunc   ;==>_Copir

Func _PathSplitByRegExp($sPath)
    If $sPath = '' Or(StringInStr($sPath, "\") And StringInStr($sPath, "/")) Then Return SetError(1, 0, -1)
    Local $aRetArray[8], $pDelim = ""
    If StringRegExp($sPath, '^(?i)([A-Z]:|\\)(\\[^\\]+)+$') Then $pDelim = "\"
    If StringRegExp($sPath, '(?i)(^.*:/)(/[^/]+)+$') Then $pDelim = "//"
    If $pDelim = "" Then $pDelim = "/"
    If Not StringInStr($sPath, $pDelim) Then Return $sPath
    If $pDelim = "\" Then $pDelim &= "\"
    $aRetArray[0] = $sPath ;Full path
    $aRetArray[1] = StringRegExpReplace($sPath, $pDelim & '.*', $pDelim) ;Drive letter
    $aRetArray[2] = StringRegExpReplace($sPath, $pDelim & '[^' & $pDelim & ']*$', '') ;Path without FileName and extension
    $aRetArray[3] = StringRegExpReplace($sPath, '\.[^.]*$', '') ;Full path without File Extension
    $aRetArray[4] = StringRegExpReplace($sPath, '(?i)([A-Z]:' & $pDelim & ')', '') ;Full path without drive letter
    $aRetArray[5] = StringRegExpReplace($sPath, '^.*' & $pDelim, '') ;FileName and extension
    $aRetArray[6] = StringRegExpReplace($sPath, '.*' & $pDelim & '|\.[^.]*$', '') ;Just Filename
    $aRetArray[7] = StringRegExpReplace($sPath, '^.*\.', '') ;Just Extension of a file
    Return $aRetArray
EndFunc   ;==>_PathSplitByRegExp



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


Еще кое-что исправил
 
Верх