Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как сделать "кнопку добавления файла". (http://forum.oszone.net/showthread.php?t=175499)

Centrinar 12-05-2010 15:24 1411703

Как сделать "кнопку добавления файла".
 
Кнопка при нажатии на которую открывался бы проводник где надо указать файл. После чего данный файл копировался в нужную нам папку.

FlatX007 12-05-2010 16:09 1411722

Код:

#include <File.au3>

Global $sOut = "C:\" ; Папка назначения
Global $szDrive, $szDir, $szFName, $szExt, $Path

$sFileOpenDialog
= FileOpenDialog("Выберите файл", @ProgramFilesDir & "\", "Exe (*.exe)", 1 + 8 + 16)
If Not (@error) Then
    $aPath = _PathSplit($sFileOpenDialog, $szDrive, $szDir, $szFName, $szExt)
    If FileExists($sFileOpenDialog) And IsArray($aPath) Then FileCopy($sFileOpenDialog, $sOut & $aPath[3] & $aPath[4])
EndIf


Creat0R 12-05-2010 16:48 1411744

FlatX007, в этом случае имя файла указывать не обязательно:

Код:

Global $sOut = "C:\" ; Папка назначения

$sFile = FileOpenDialog("Выберите файл", @ProgramFilesDir, "Exe (*.exe)", 1 + 8 + 16)

If Not @error Then
    FileCopy($sFile, $sOut)
    ShellExecute($sOut)
EndIf


FlatX007 12-05-2010 16:57 1411753

Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <WinAPIEx.au3>
#include <Misc.au3>

Global $sOut = "C:\" ; Папка назначения
Global $szDrive, $szDir, $szFName, $szExt, $aPath
Global $hProgressProc = DllCallbackRegister('_ProgressProc', 'dword', 'uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;ptr')

$Form1 = GUICreate("", 248, 46)
$Button1 = GUICtrlCreateButton("Выбрать файл", 16, 8, 219, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Button1
            _FileCopy()
            Switch @error
                Case 0
                    MsgBox(64, "", "Файл скопирован")
                Case 1
                    MsgBox(48, "", "Файл НЕ скопирован!")
            EndSwitch
            _Exit()
    EndSwitch
WEnd

Func _FileCopy()

    $sFileOpenDialog = FileOpenDialog("Выберите файл", @ProgramFilesDir & "\", "File (*.*)", 1 + 8 + 16)
    If Not (@error) Then
        $aPath = _PathSplit($sFileOpenDialog, $szDrive, $szDir, $szFName, $szExt)
        If FileExists($sFileOpenDialog) And IsArray($aPath) Then
            ProgressOn('_WinAPI_CopyFileEx', 'Copying...', '', -1, -1, 2)
            _WinAPI_CopyFileEx($sFileOpenDialog, $sOut & $aPath[3] & $aPath[4], 0, DllCallbackGetPtr($hProgressProc))
            If Not @error Then
                Return SetError(0, 0, 0)
            Else
                _WinAPI_ShowLastError()
                Return SetError(1, 0, 0)
            EndIf
        EndIf
    EndIf

EndFunc  ;==>_FileCopy

Func _ProgressProc($iTotalFileSize, $iTotalBytesTransferred, $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $iData)

    Local $Percent = Round($iTotalBytesTransferred / $iTotalFileSize * 100)

    If $Percent = 100 Then
        ProgressSet($Percent, '', 'Complete')
    Else
        ProgressSet($Percent)
    EndIf
    If _IsPressed('1B') Then
        Return $PROGRESS_CANCEL
    Else
        Return $PROGRESS_CONTINUE
    EndIf

EndFunc  ;==>_ProgressProc

Func _Exit()
    DllCallbackFree($hProgressProc)
    ProgressOff()
EndFunc  ;==>_Exit

WinAPIEx.au3

Creat0R 12-05-2010 18:50 1411818

FlatX007, и что? зачем всё усложнять когда автор темы точно описал задачу?

FlatX007 13-05-2010 13:16 1412321

Конечно точно описал задачу ... а если файл 4 гига, солько ждать окончания копирования ?

Creat0R 13-05-2010 16:25 1412444

Цитата:

Цитата FlatX007
а если файл 4 гига, солько ждать окончания копирования ? »

В постановке задачи ничего не говорится о необходимости предусматривания данной ситуации.

Angelus 12-06-2010 17:21 1432851

а если файлов несколько?......как это проще сделать?

FlatX007 12-06-2010 18:59 1432899

Код:

; Папки не копируются, только файлы!

Global $OUT = 'C:\Out'
Global $iIncrease, $iProsent

DirCreate($OUT)

$sMultiOpenFiles = _FileOpenDialogEx("Выберите файлы для копирования", @ProgramFilesDir, "File (*.*)", 4, -1)

If Not (@error) Then
    $iIncrease = 100 / $sMultiOpenFiles[0]
    For $i = 1 To $sMultiOpenFiles[0]
        FileCopy($sMultiOpenFiles[$i], $OUT)
        $iProsent += $iIncrease
        ConsoleWrite(Round($iProsent) & ' %' & @CRLF)
    Next
EndIf

Func
_FileOpenDialogEx($sTitle, $sInitDir, $sFilter, $iOptions = 0, $iReturnMode = -1, $sDefaultName = '', $hWnd = 0)
    Local $sFOD_Ret = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName, $hWnd)
    If @error Then Return SetError(@error, @extended, $sFOD_Ret)

    Local $sRet = ''
    Local $aSplit_Str = StringSplit($sFOD_Ret, '|')

    If @error Or $aSplit_Str[0] < 2 Then
        If
$iReturnMode > 0 Then Return $sFOD_Ret
        Return $aSplit_Str
    EndIf

    Local
$sInit_Path = StringRegExpReplace($aSplit_Str[1], '([^\\])\\*$', '\1')

    For $i = 2 To $aSplit_Str[0]
        $sRet &= $sInit_Path & '\' & $aSplit_Str[$i] & '|'
    Next

    $sRet = StringRegExpReplace($sRet, '\|+$', '')
    If $iReturnMode > 0 Then Return $sRet

    Return StringSplit($sRet, '|')
EndFunc  ;==>_FileOpenDialogEx



Время: 06:10.

Время: 06:10.
© OSzone.net 2001-