SyncScan Sample Codes - Sync Directories

Document Path: Home Page / Command Tools / SyncScan / Sample - Sync Directories  

This program compares directory A with directory B. If a file in A is more recent, copy it to B.

Required Command Line Arguments:

Part 1: The Command Line Arguments Parser

//Argument 1 - directory A
var dira=app.argv(0);
var fo=app.FindFile(dira);
while(fo.Valid? !fo.AttributeDirectory : true)
{
    dira=app.Input("Enter directory A: ");
    if(!dira) // If use just strikes enter, we quit.
    {
        app.Exit(-1);
    }
    fo=app.FindFile(dira);
}

//Argument 2 - directory B
var dirb=app.argv(1);
fo=app.FindFile(dirb);
while(fo.Valid? !fo.AttributeDirectory : true)
{
    dirb=app.Input("Enter directory B: ");
    if(!dirb) // If use just strikes enter, we quit.
    {
        app.Exit(-1);
    }
    fo=app.FindFile(dirb);
}


//Argument 3 - Sub-directories?
var yesno=app.argv(2).toLowerCase(); 
if(yesno!='y' && yesno!='n')
{
    app.Print("Scan sub-directories? (y/n)\n");
    while(yesno!='y' && yesno!='n')
    {
        yesno=app.getch(false).toLowerCase();
    }
}
subdir=(yesno=='y'? true:false);

//Variables used by the callback function:
var updateFileCount=0;
var updateDirCount=0;
var totalFileCount=0;


//We have all the required arguments now
//Prompt the user to press any key to continue. This gives the user a chance to terminate the program by Ctrl+C
app.Print("\nSync " + dira + " with " + dirb +  (subdir? ", including sub-directories." : ".") + "\n");
app.Print("Press any key to continue....\n");
app.getch();
app.CompareDirectory(dira, dirb, subdir, SyncCallback);
Part 2: The Callback Function
function SyncCallback(dirFlag, fo1, fo2)
{
    switch(dirFlag)
    {
    case 2:
        app.Print("Start sync \n");
        fo2.Property("Copy file count")=0;
        break;
    case -2:
        app.Print("\nSync Finished.\n");
        app.Print(updateFileCount+" files updated.\n"); 
        app.Print(updateDirCount+" directories updated.\n"); 
        break;
    case 0:
        //If fo2 does not exist or is older, update it with fo1
        if(fo2.Valid? fo1.LastWriteTime.Compare(fo2.LastWriteTime)>0 : true)
        {
            var count=fo2.Parent.Property("Copy file count")+1;
            fo2.Parent.Property("Copy file count")=count;
            totalFileCount++;
            app.Print(count + "(" + totalFileCount + "): Copy " + fo1.FullPath + " to " + fo2.FullPath + "\n");
            fo1.CopyFile(fo2.FullPath);
            updateFileCount++;
        }
        break;
    case 1:
        //We enter a sub-directory.
        app.Print("Begin of scanning sub-directory "+fo1.FullPath+"\n");
        if(!fo2.Valid)
        {
            //If fo2 does not exist, create it.
            fo2.CreateDirectory();
            fo2.Property("LW")=fo1.LastWriteTime;
            fo2.Property("NewDir")=true;
        }
        else
        {
            fo2.Property("LW")=fo2.LastWriteTime;
            fo2.Property("NewDir")=false;
        }
        fo2.Property("Copy file count")=0;
        break;
    case -1:
        //We leave a sub-directory. Update its last-write time if necessary.
        app.Print("End of scanning sub-directory"+fo1.FullPath+"\n");
        if(fo2.Property("NewDir"))
        {
            fo2.LastWriteTime=fo1.LastWriteTime
            updateDirCount++;
        }
        else
        {
            if(fo2.Property("Copy file count")>0)
            {
                var r=fo1.LastWriteTime.Compare(fo2.Property("LW"));
                if(r>0)
                {
                    fo2.LastWriteTime=fo1.LastWriteTime
                    updateDirCount++;
                }
            }
            else
            {
                if(fo2.LastWriteTime.Compare(fo2.Property("LW"))!=0)
                {
                    fo2.LastWriteTime=fo2.Property("LW");
                    updateDirCount++;
                }
            }
        }
        fo2.Property("LW")=null;
        fo2.Property("NewDir")=null;
        break;
    }

    if(app.kbhit())
    {
        var ch=app.getch(false);
        if(ch==27)
        {
            app.Print("*** Abort ***\n");
            return(-1);
        }
    }
}