Jump to content

FileCopy $FC_NOOVERWRITE problem?


Recommended Posts

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:

  1. If there is nothing at destination => OK, copy  is done. Now destination has 300 files.
  2. If I erase at destination 10 files in the middle (explorer, shift del)  and then filecopy =>  the 10 deleted files are NOT copied !!
  3. 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 by joseLB
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by joseLB
Link to comment
Share on other sites

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. :lol:

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 graduated.gif

Correct answer, learn to walk before you take on that marathon.

Link to comment
Share on other sites

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. :lol:

.... how about showing your script?

Thanks 232showtime

First, let I explain in another way so you understand what is going on:

  1. I have a folder "orig" with about 300 files at this moment, that grows 50 files a day aprox.
  2. I have a "dest" folder, where I need to do the backup each day.
  3. The files are something like I0001.jpg ... I0300.jpg ,  I0300 being the newest included.
  4. The natural choice was FileCopy ($orig\*.* , $dest )    ***$orig= "C:\......\, the same for $dest,"C:\...."

To test:

  1. I did the first FileCopy, it was OK., the 300 files where copied to $dest
  2. So, I delete about 30 files at $dest, I0001.jpg to I0030.jpg
  3. again, FIleCopy -> it was OK, the 30 files "restored". Program working!!!!
  4. So, I deleted I0001...  I0010, and I0100 to I0120.
  5. FileCopy restored just 10 files !!! I0001 to I0010.. I become lost at beginning,
  6. 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 by joseLB
Link to comment
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
 Share

×
×
  • Create New...