satanico64

FileCopy works only with overwrite ? [SOLVED]

7 posts in this topic

#1 ·  Posted (edited)

Hi from Bordeaux, France ! how are you today ?

 

I had a problem with filecopy function.

I have a folder with my gifs on a network folder. At the start of my program, i want to make a copy on local pc. Not much complicated.

If i do :

FileCopy(SOURCE ,DESTINATION, $FC_CREATEPATH)

It does'nt work. My destination folder is not empty and contains file which are even present in the source. I would like that filecopy add new file from the source to the destination, without overwrite. But it does'nt work.

If i do:

FileCopy(SOURCE ,DESTINATION, $FC_OVERWRITE+  $FC_CREATEPATH)

This overwrite with all files.

So i do that, because it works...but if i only want to copy new file how can i do ?

Thanks

Nicolas.

CopierDossierImage()
Func CopierDossierImage()
    $DossierImagesReseau = "\\sw3308\IntranetSTC\Hors Web\Logiciels STC\Barre STC\images\"
    $DossierImagesLocal = $DossierBarreSTC & "\Images\"

    FileCopy($DossierImagesReseau & "*.*", $DossierImagesLocal, $FC_OVERWRITE+  $FC_CREATEPATH)
    
EndFunc   ;==>CopierDossierImage

 

Edited by satanico64
Add Solved to title.

Share this post


Link to post
Share on other sites



Morning, @satanico64 ... I don't know if you have subfolders or the type of image you have, but you can try something like this:

$remote = "C:\Remote" ; Your Remote Folder
$local = "C:\Temp" ; Your Local Folder
$ext = "*.gif"

$array = _FileListToArray($remote, $ext, $FLTA_FILES)
$count = 0
For $i = 1 To $array[0]
    $result = FileCopy($remote & "\" & $array[$i], $local)
    If $result = 1 Then $count +=1
Next

MsgBox(0, "Files Copy", "Total Copied: " & $count &" Files")

Works for me, your just need to adjust if you have subfolders or multiple extensions (see _FileListToArrayRec)

Share this post


Link to post
Share on other sites

thanks both for your answers.

I'll try that. (i don't want to copy all file whereas the folder has'nt been changed).

Meanwhile, it does'nt seems to be normal that the filecopy command does'nt copy file that does'nt exist in destination folder because there are file that exist and we don't want to overwrite them.

I have subfolder in both folder but it does'nt interest me. I know that files in subfolder are'nt treated.

Share this post


Link to post
Share on other sites

satanico64,

it does'nt seems to be normal that the filecopy command does'nt copy file that does'nt exist in destination folder because there are file that exist

We have discussed this before and I seem to  remember that this is standard Windows behaviour and nothing to do with AutoIt. If you copy files with a wildcard it will fail if there already are files with the same name and you do not specify that they should be overwritten. As AutoIt just uses the Windows API to do the job, it suffers from the same limitation.

I feel you will have to do as mikell has suggested and check each file before copying rather then using a wildcard.

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

#6 ·  Posted (edited)

Salut ami bordelais :)

You can also try this :

#include <WinAPIShellEx.au3>

_WinAPI_ShellFileOperation ( $DossierImagesReseau & "\*.*", $DossierImagesLocal, $FO_COPY, $FOF_SILENT)

Edit : the FileExists check is not needed because the default flag of FileCopy processes the check for you

Edited by jguinch

Share this post


Link to post
Share on other sites

this is standard Windows behaviour and nothing to do with AutoIt.

so it's true that, Windaws act like this, you're totally true ! ( But i use supercopier to replace Windows copy, since more than 10 years xD )

@jguinch with your command it does the same thing. So i did a copy for each file with nowrite option. Merci en tous cas pour cette autre approche ! 

 

We can close this post. 

Good job team !

 

 

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

    • 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
    • Xulong
      By Xulong
      I have a script which is copying one file (the latest file among a bunch of structured folders) from one network device to another network device.
      The weird thing is the file copied successfully to the destination folder right after the FileCopy command ran but the script is hanging for another few minutes until it return with exit code 0.
      Below is my script:
      #include <MsgBoxConstants.au3> #include <File.au3> #include <Array.au3> #include <FileConstants.au3> copyfile() Func copyfile() Local $testLogFile = FileOpen(@ScriptDir & "\CopyMSI", 1) Local $BuildArtifacts = "\\vm-build\BuildArtifacts" Local $dServer = "\\VM-DEV\c$\Users\Administrator\Desktop" Send("#r") WinWaitActive("Run") ControlSend("Run", "", 1001, $BuildArtifacts) ControlClick("Run", "OK", 1) _FileWriteLog($testLogFile, "Opened Builds folder") ;trying to get the latest build folder and grab the latest msi file for copying WinWaitActive("BuildArtifacts") Local $FolderList = _FileListToArray($BuildArtifacts, "Grand-4.*") _ArraySort($FolderList, 1) Local $latestSEbuild = $FolderList[0] Sleep (5000) WinClose("BuildArtifacts") Local $sServer = $BuildArtifacts & '\' & $latestSEbuild & '\G4.msi' ; start copying file from build to destination folder FileCopy($sServer, $dServer, $FC_OVERWRITE) _FileWriteLog($testLogFile, "Copied MSI") EndFunc  
    • PINTO1927
      By 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.