Jump to content
PINTO1927

Copy multi file with FileOpenDialog

Recommended Posts

PINTO1927

Hello guys,

I'm working on this script:

Case $BTN
   Global $URL = FileOpenDialog("IMPORT FILE", $DESKTOP, "ALL FORMAT (*)", 4)
   $DIR_DEST = "C:\DIR-WORK\list\IMPORT_DOC\"
   DirCreate($DIR_DEST)
   Local $LINE
   For $t = 1 To $URL[0]
      _FileReadToArray($URL[$t], $LINE)
      For $u = 1 To $LINE[0]
         FileCopy($URL[$u], $DIR_DEST)
      Next
   Next

the selected files via OpenFileDialog must be copied to the folder $DIR_DEST.

 

Share this post


Link to post
Share on other sites
Melba23

PINTO1927,

Read the Help file to see how the FileOpenDialog return is formatted (Hint: it is not an array):

Quote

Success:  the full path of the file(s) chosen. Results for multiple selections are "Directory|file1|file2|...".

So you need to do some work on the return before you use it in a loop.

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites
Skeletor

For those interested in the code, see below:

Local $sFileOpenDialog = FileOpenDialog($sMessage, @DesktopDir, "All Files (*.*)", $FD_FILEMUSTEXIST + $FD_MULTISELECT) ;Browse for files
$sFileOpenDialog = StringReplace($sFileOpenDialog, "|", @CRLF) ;Replace filter with break. See helpfile for more info
FileWrite($pathtofile, $sFileOpenDialog) ;Grab list to file
$openfile = FileOpen($pathtofile) ;Open the file
$FileRead = FileReadLine($pathtofile) ;Read each line from the file
FileCopy($FileRead, $pathtofile) ;Copy each file as you read the file line
FileClose($openfile) ;Close the file

My explanation is not the best however this should get you going...


Kind Regards
Skeletor

"I need coffee to turn me back to a human"

Microsoft Office Splash Screen | Basic Notepad Program (Beginner) | Wondering who uses AutoIt and what it can be used for ?

 

Share this post


Link to post
Share on other sites
Melba23

Skeletor,

Why on earth do you write the return to a file and then read it? Why not just convert the return directly to an array and loop through it?

#include <FileConstants.au3>
#include <MsgBoxConstants.au3>

; Browse for files
Local $sFileOpenDialog = FileOpenDialog($sMessage, @DesktopDir, "All Files (*.*)", BitOr($FD_FILEMUSTEXIST, $FD_MULTISELECT))
; Check what type of return we get from the function
If @error Then ; Complete fail
    MsgBox($MB_SYSTEMMODAL, "Error", "Selection failed")
Else ; Check for multiple return which will have delimiters
    If StringInStr($sFileOpenDialog, "|") Then
        ; Multiple files selected, so need to create an array
        $aFileSplit = StringSplit($sFileOpenDialog, "|")
        ; And then loop through the array
        For $i = 2 To $aFileSplit[0] ; Note starting at [2], because [0] is the count and [1] is the path
            ; You need to recreate the full path on each pass
            FileCopy($aFileSplit[1] & "\" & $aFileSplit[$i], $DIR_DEST)
        Next
    Else
        ; Only a single file selected, so copy immediately
        FileCopy($sFileOpenDialog, $DIR_DEST)
    EndIf
EndIf

M23

Edited by Melba23
Corrected style syntax

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • Tats
      By Tats
      Hi,
      Good Day!
      I have a problem and having difficulty implementing it. I want to copy the files in a certain folder, rename it, and when it exist in the destination folder it will add an index counter.
       
      Example source folder having files like:
      AA_123.TXT
      BB_123.TXT
      CC_123.TXT
      DD_123.TXT
       
      After file copy the target folder would be like this:
      123.TXT
      123_1.TXT
      123_2.TXT
      123_3.TXT
       
      How to achieve this?
      Thanks in advance
       
       
    • Gringo
      By Gringo
      Hi,
      I'm trying to:
      -Select a file in a folder (to store it to an ini file)
      -Write the file on an ini
      -Copy files to the folder selected by the user
      instead of using FileOpenDialog then FileSelectFolder, I was wondering if it was possible to do the whole thing only with FileOpenDialog spliting the value returned in 2 variables. I got something like that for the first part (select a file and store it to an ini file)
      Local $message = "Select your executable" Local $pathk = FileOpenDialog($message, "C:" & "", "Select the executable you want to terminate (*.exe)", 1 + 4) Local $path = "None" ;ici je dois copier les fichiers $split = StringSplit($pathk, "\") $tokill = $split[$split[0]] If @error Then MsgBox(4096, "", "No Executable chosen") Else MsgBox(4096, "", $pathk & " Will be terminated " & @LF & @LF & "Press OK to EXIT ") IniWrite(@ScriptDir & "\path.ini", "Torun", "path", $path) IniWrite(@ScriptDir & "\path.ini", "Tokill", "pathk", $tokill) EndIf As you can see I manage to split the value returned by FileOpenDialog to have only the exe but as a noob I can't manage to get the path to copy the files I need to the same path.
      Any idea? ^^
    • fopetesl
      By fopetesl
      Struggling to get Filecopy() working
      MsgBox(0,"Moving file: ", $fLine) ; C:\AlmeterS3\AI74_No2.csv FileCopy( $fLine, "C:\AlmeterS3\S3_Database\") ; FileCopy( $fLine, $BatchDir & "\S3_Database\") If @error Then MsgBox($MB_SYSTEMMODAL, "ERROR!", "database write error " & @error) EndIf FileDelete( $fLine) doesn't copy only creates a file "C:\AlmeterS3\S3_Database" (actually AI74_No2.csv)
      Again my typo I should have added
      $FC_OVERWRITE + $FC_CREATEPATH since folder didn't actually exist.
    • Simpel
      By Simpel
      Hi,
      I do recognize bad behaviour at this snippet:
      #include <AutoItConstants.au3> Global $g_sSD = @ScriptDir & "\" Global $g_sBurstPath = $g_sSD & "Burst\" DirCreate($g_sBurstPath) Local $sFileName = "Test_mit_3_Seiten.pdf" ; any PDF with more than 1 page inside @ScriptDir FileCopy($g_sSD & $sFileName, $g_sBurstPath & $sFileName, 1) ;~ Sleep(13000) Local $hTimer = TimerInit() ConsoleWrite("Start" & @CRLF) _Burst($g_sBurstPath & $sFileName) ; bursts PDF into single pages ;~ While _FileInUse($g_sBurstPath & $sFileName) ;~ WEnd ConsoleWrite("End: " & Round(TimerDiff($hTimer)) & "ms" & @CRLF) Exit Func _quotePath($sPath) ; because of possible "spaces" inside pathes $sPath = '"' & $sPath & '"' Return $sPath EndFunc Func _Burst($sFile) Local $sPDFtk = $g_sSD & "pdftk.exe" ; path to pdftk.exe (and libiconv2.dll) Local $sCurrWorkingDir = @WorkingDir FileChangeDir($g_sBurstPath) ; it has to change for reasons Local $iPID = Run(_quotePath($sPDFtk) & ' ' & _quotePath($sFile) & ' burst', "", @SW_SHOW, $STDOUT_CHILD + $STDERR_CHILD) ; @SW_SHOW just to see "PDFtk is working" Local $sOutput, $sError While 1 $sOutput &= StdoutRead($iPID) $sError &= StderrRead($iPID) If @error Then ExitLoop Sleep(10) WEnd FileChangeDir($sCurrWorkingDir) ; back to normal EndFunc Func _FileInUse($sFilename) ; by Siao Local $aRet, $hFile $aRet = DllCall("Kernel32.dll", "hwnd", "CreateFile", _ "str", $sFilename, _ ;lpFileName "dword", 0x80000000, _ ;dwDesiredAccess = GENERIC_READ "dword", 0, _ ;dwShareMode = DO NOT SHARE "dword", 0, _ ;lpSecurityAttributes = NULL "dword", 3, _ ;dwCreationDisposition = OPEN_EXISTING "dword", 128, _ ;dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL "hwnd", 0) ;hTemplateFile = NULL $hFile = $aRet[0] If $hFile = -1 Then ;INVALID_HANDLE_VALUE = -1 $aRet = DllCall("Kernel32.dll", "int", "GetLastError") SetError($aRet[0]) Return 1 ; file in use (@error contains system error code) Else ;close file handle DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $hFile) Return 0 ; file not in use EndIf EndFunc This bursting took about 15000ms. If I activate line 8 "Sleep(13000)" then the bursting itself never needed more than 1000ms. Round about 13000ms delay is needed until bursting is acting very fast, otherwise needing about 15000ms.
      Then I tested _FileInUse() instead of _Burst() w/o Sleep(13000). This runs in 3ms. It seemes to me that FileCopy() and Burst() are interacting in a way I can't see.
      Any ideas? Regards, Conrad
      P.S. You need pdftk.exe and libiconv2.dll at @ScriptDir. This you can get free here: https://www.pdflabs.com/tools/pdftk-server/ (I'm not sure whether I'm allowed to attach it here).
       
    • joseLB
      By joseLB
      Suppose you want from time to time to update a destination folder  with new files that where created at a origin folder.
      It´s a kind of synchronization, where new files in origin must be "added" to destination. No worry about files that changed, just the new ones.
      The natural way:   FileCopy  ($originFolder  &  "\*.*"   ,   $destinationFolder  , $FC_NOOVERWRITE)
      After many tests, where I have 300 .jpg files in origin and no subfolders:
      If there is nothing at destination => OK, copy  is done. Now destination has 300 files. If I erase at destination 10 files in the middle (explorer, shift del)  and then filecopy =>  the 10 deleted files are NOT copied !! If I erase at destination 10 files "at the beginning"* (explorer, shift del)  and then filecopy =>  the 10 deleted files are copied !! = OK !! * "at beginning" = sorted by name, ascending, erase the 10 first ones.
      ** I tried $originFolder  &  "\*.*" , $originFolder&"\"  ,  $originFolder , and many other variants. The same for destination.
      So, what´s seems to me is that  when FileCopy finds the first file from origin  that exists at destination it stops to search.  That´s expected behavior?
      Best Regards
      Jose
×