joseLB

FileCopy $FC_NOOVERWRITE problem?

5 posts in this topic

#1 ·  Posted (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:

  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

Share this post


Link to post
Share on other sites



#2 ·  Posted

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.

1 person likes this

Share this post


Link to post
Share on other sites

#3 ·  Posted (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 by joseLB

Share this post


Link to post
Share on other sites

#4 ·  Posted

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.

Share this post


Link to post
Share on other sites

#5 ·  Posted (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. :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

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).
       
    • 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.
       
    • cheeroke
      By cheeroke
      OK, so i run out of ideas how to make this working. Basically my FIleCOpy statement doesn't do it job. I must be missing something. Here is my code:
      #RequireAdmin . . Local $fTasks = "C:\Drivers\Other\Tasks\" Local $fTasksSys = "C:\2\" . . . FileCopy(GUICtrlRead($fTasks) & "Win10_CNC_Setup", $fTasksSys, 8) MsgBox(0, "Boot Setting", "Copied Tasks." & $fTasks & "Win10_CNC_Setup" & @CR & "To " & $fTasksSys) FileDelete($fTasksSys & "ADxLR5_StartUp") MsgBox(0, "Boot Setting", "Deleted tasks.") while it is finally creating folder called "2" it does not want to copy files. Files are .xml but without extension one of the is called: "Win10_CNC_Setup".
      Another thing is I don't understand why this
      $FC_OVERWRITE + $FC_CREATEPATH doesn't work but if i replace it with this
      8 it does create folder.
      Main question is - how to make it copying files?
      Please help.