joseLB Posted May 21, 2017 Posted May 21, 2017 (edited) 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 Edited May 21, 2017 by joseLB
LarsJ Posted May 22, 2017 Posted May 22, 2017 Check the returned value from FileCopy. Probably a file overwriting along with the $FC_NOOVERWRITE flag will cause the entire FileCopy command to fail (returns 0). If so, you'll have to copy the files one at a time in a loop so each file can fail without all the other files failing at the same time. joseLB 1 Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions
joseLB Posted May 22, 2017 Author Posted May 22, 2017 (edited) Thanks Lars, unfortunatedly was what I supposed. That is, when FileCopy with "*" finds that a file exists at both folders, it stops. This is a Win XP behavior, as in explorer in win7 .. we can tell "do not overwrite for the "n" next conflicts. Anyway I´m developing FileSync (origin , destination) UDF for this case, but very simple. There I will _FileListToArray origin and destination and I check for each file in origin if it exists on destination. If not, plain FileCopy this file to destination. When I finish it, I´m thinking into put it at scripts forum. Bu it will be very simple anyway. Jose Edited May 22, 2017 by joseLB
232showtime Posted May 22, 2017 Posted May 22, 2017 5 hours ago, joseLB said: as in explorer in win7 .. we can tell "do not overwrite for the "n" next conflicts. what are you talking about?, filecopy is working fine using $flag 0, even if i delete files in middle, or at the beginning or in the end. 5 hours ago, joseLB said: This is a Win XP behavior are you sure about this? how about showing your script? ill get to that... i still need to learn and understand a lot of codes Correct answer, learn to walk before you take on that marathon.
joseLB Posted May 23, 2017 Author Posted May 23, 2017 (edited) On 22/05/2017 at 6:21 AM, 232showtime said: what are you talking about?, filecopy is working fine using $flag 0, even if i delete files in middle, or at the beginning or in the end. .... how about showing your script? Thanks 232showtime First, let I explain in another way so you understand what is going on: I have a folder "orig" with about 300 files at this moment, that grows 50 files a day aprox. I have a "dest" folder, where I need to do the backup each day. The files are something like I0001.jpg ... I0300.jpg , I0300 being the newest included. The natural choice was FileCopy ($orig\*.* , $dest ) ***$orig= "C:\......\, the same for $dest,"C:\...." To test: I did the first FileCopy, it was OK., the 300 files where copied to $dest So, I delete about 30 files at $dest, I0001.jpg to I0030.jpg again, FIleCopy -> it was OK, the 30 files "restored". Program working!!!! So, I deleted I0001... I0010, and I0100 to I0120. FileCopy restored just 10 files !!! I0001 to I0010.. I become lost at beginning, To make short a long bunch of tests: My guess is that FileCopy copies files UP to find the first $orig <-> $dest match. And then stops. This happens as Windows folders are internally ordered by filename, ascending order. So, if in $dest are missing the the "first" files (2 and 3 above), it will copy. On my case, as daily files will be I0301.jpg and so on, it will not work at all. In fact the script does not exist anymore, I developed my own FileSync UDF, very very simple, as follows. Near future I will increment it with checks , etc. Func FileSync ($origin, $destination) Local $Drv, $Dir,$File,$Ext, $destDrv, $destDir,$destFile,$destExt _PathSplit($origin, $Drv, $Dir,$File,$Ext) $origFileList= _FileListToArray( $Drv&$Dir, $File&$Ext, $FLTA_FILES, False) _PathSplit($destination, $destDrv, $destDir,$destFile,$destExt) $destFileList= _FileListToArray( $destDrv&$destDir, "*", $FLTA_FILES, False) If @error Then FileCopy ($origin , $destDrv&$destDir ) Else For $K=1 To $origFileList[0] $arq= $origFileList[$K] $x= _ArrayBinarySearch( $destFileList, $arq, 1) If $x = -1 Then FileCopy( $Drv&$Dir&$arq , $destDrv&$destDir ) EndIf Next EndIf EndFunc Edited May 23, 2017 by joseLB
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now