Sample code for 30+ languages & platforms
Tcl Requires Chilkat v11.0.0+

SharePoint -- Download Newer Files

See more SharePoint Examples

Demonstrates how to download all files from a SharePoint folder that are newer than the local files.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

#  This requires the Chilkat API to have been previously unlocked.
#  See Global Unlock Sample for sample code.

#  -------------------------------------------------------------------------
#  The following comments apply to SharePoint Windows classic authentication.
#  -------------------------------------------------------------------------
#  For example, imagine our SharePoint endpoint is https://xyzoffice.mycompany.com/
#  The SHAREPOINT_NTLM_DOMAIN would be "mycompany.com"
#  The SHAREPOINT_HTTPS_DOMAIN would be "xyzoffice.mycompany.com"
#  Also, the SHAREPOINT_USERNAME would be just the name, not a full email address.
#  for example, "chilkat" instead of "chilkat@mycompany.com"

set http [new_CkHttp]

#  If SharePoint Windows classic authentication is used, then set the 
#  Login, Password, LoginDomain, and NtlmAuth properties.
CkHttp_put_Login $http "SHAREPOINT_USERNAME"
CkHttp_put_Password $http "SHAREPOINT_PASSWORD"
CkHttp_put_LoginDomain $http "SHAREPOINT_NTLM_DOMAIN"
CkHttp_put_NtlmAuth $http 1

#  -------------------------------------------------------------------------
#  The more common case is to use SharePoint Online authentication (via the SPOIDCRL cookie).
#  If so, do not set Login, Password, LoginDomain, and NtlmAuth, and instead
#  establish the cookie as shown at SharePoint Online Authentication
#  -------------------------------------------------------------------------

#  First we'll download a list of all the files in the /Documents folder.
#  This provides the names and last-modified date/times of the files located
#  on the SharePoint server.
CkHttp_put_Accept $http "application/json;odata=verbose"
CkHttp_put_AcceptCharset $http "utf-8"

set sbJson [new_CkStringBuilder]

set success [CkHttp_QuickGetSb $http "https://SHAREPOINT_HTTPS_DOMAIN/_api/web/GetFolderByServerRelativeUrl('/Documents')/Files" $sbJson]
if {$success == 0} then {
    puts [CkHttp_lastErrorText $http]
    delete_CkHttp $http
    delete_CkStringBuilder $sbJson
    exit
}

#  Before proceeding, make sure the local directory where we'll be downloading files exists.
set fac [new_CkFileAccess]

CkFileAccess_DirEnsureExists $fac "qa_output/sharepoint/Documents"

#  OK.. load the JSON and iterate over each file
set json [new_CkJsonObject]

CkJsonObject_LoadSb $json $sbJson

set numFiles [CkJsonObject_SizeOfArray $json "d.results"]
puts "Number of Files in the SharePoint /Documents folder = $numFiles"

set lastModRemote [new_CkDateTime]

set lastModLocal [new_CkDateTime]

set localPath [new_CkStringBuilder]

set fileUrl [new_CkStringBuilder]

set i 0
while {$i < $numFiles} {
    CkJsonObject_put_I $json $i

    set filename [CkJsonObject_stringOf $json "d.results[i].Name"]
    set sLastModified [CkJsonObject_stringOf $json "d.results[i].TimeLastModified"]

    puts [expr $i + 1]: $filename ($sLastModified)

    CkDateTime_SetFromTimestamp $lastModRemote $sLastModified

    set bDownload 0
    #  Check to see if the local file exists.  If not, then download.
    CkStringBuilder_SetString $localPath "qa_output/sharepoint/Documents/"
    CkStringBuilder_Append $localPath $filename
    if {[CkFileAccess_FileExists $fac [CkStringBuilder_getAsString $localPath]] != 1} then {
        puts "This file does not exist locally."
        set bDownload 1
    }     else {
        #  Get the local file's date time and compare with the remote file date/time.
        CkDateTime_SetFromTimestamp $lastModLocal [CkFileAccess_getFileTimeStr $fac [CkStringBuilder_getAsString $localPath] 0]

        #  Get the difference in seconds between the local and remote last-modified times.
        #  if the return value is negative, then the caller's time is 
        #  older than the argument.  (in this case, a negative return value means
        #  the local file is older than the remote file.

        #  Note: The DiffSeconds method was found to be missing in the Chilkat .NET build
        #  (and possibly in other builds). It will be present in the v9.5.0.67 release and later.
        set numSeconds [CkDateTime_DiffSeconds $lastModLocal $lastModRemote]
        if {$numSeconds < 0} then {
            puts "The local file is older than the remote file."
            set bDownload 1
        }

    }

    if {$bDownload == 1} then {
        CkStringBuilder_SetString $fileUrl "https://SHAREPOINT_HTTPS_DOMAIN/_api/web/GetFolderByServerRelativeUrl('/Documents')/Files('"
        CkStringBuilder_Append $fileUrl $filename
        CkStringBuilder_Append $fileUrl "')/$value"

        puts "Downloading $filename"

        set success [CkHttp_Download $http [CkStringBuilder_getAsString $fileUrl] [CkStringBuilder_getAsString $localPath]]
        if {$success == 0} then {
            puts [CkHttp_lastErrorText $http]
            delete_CkHttp $http
            delete_CkStringBuilder $sbJson
            delete_CkFileAccess $fac
            delete_CkJsonObject $json
            delete_CkDateTime $lastModRemote
            delete_CkDateTime $lastModLocal
            delete_CkStringBuilder $localPath
            delete_CkStringBuilder $fileUrl
            exit
        }

        #  Set the local file's last-modified date/time to that of the server's.
        CkFileAccess_SetLastModified $fac [CkStringBuilder_getAsString $localPath] $lastModRemote

    }

    set i [expr $i + 1]
}

puts "All finished."

delete_CkHttp $http
delete_CkStringBuilder $sbJson
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkDateTime $lastModRemote
delete_CkDateTime $lastModLocal
delete_CkStringBuilder $localPath
delete_CkStringBuilder $fileUrl