Sample code for 30+ languages & platforms
Lianja 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 Lianja Downloads

Lianja
llSuccess = .F.

//  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"

loHttp = createobject("CkHttp")

//  If SharePoint Windows classic authentication is used, then set the 
//  Login, Password, LoginDomain, and NtlmAuth properties.
loHttp.Login = "SHAREPOINT_USERNAME"
loHttp.Password = "SHAREPOINT_PASSWORD"
loHttp.LoginDomain = "SHAREPOINT_NTLM_DOMAIN"
loHttp.NtlmAuth = .T.

//  -------------------------------------------------------------------------
//  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.
loHttp.Accept = "application/json;odata=verbose"
loHttp.AcceptCharset = "utf-8"

loSbJson = createobject("CkStringBuilder")
llSuccess = loHttp.QuickGetSb("https://SHAREPOINT_HTTPS_DOMAIN/_api/web/GetFolderByServerRelativeUrl('/Documents')/Files",loSbJson)
if (llSuccess = .F.) then
    ? loHttp.LastErrorText
    release loHttp
    release loSbJson
    return
endif

//  Before proceeding, make sure the local directory where we'll be downloading files exists.
loFac = createobject("CkFileAccess")
loFac.DirEnsureExists("qa_output/sharepoint/Documents")

//  OK.. load the JSON and iterate over each file
loJson = createobject("CkJsonObject")
loJson.LoadSb(loSbJson)

lnNumFiles = loJson.SizeOfArray("d.results")
? "Number of Files in the SharePoint /Documents folder = " + str(lnNumFiles)

loLastModRemote = createobject("CkDateTime")
loLastModLocal = createobject("CkDateTime")

loLocalPath = createobject("CkStringBuilder")
loFileUrl = createobject("CkStringBuilder")

i = 0
do while i < lnNumFiles
    loJson.I = i

    lcFilename = loJson.StringOf("d.results[i].Name")
    lcSLastModified = loJson.StringOf("d.results[i].TimeLastModified")

    ? str(i + 1) + ": " + lcFilename + " (" + lcSLastModified + ")"

    loLastModRemote.SetFromTimestamp(lcSLastModified)

    llBDownload = .F.
    //  Check to see if the local file exists.  If not, then download.
    loLocalPath.SetString("qa_output/sharepoint/Documents/")
    loLocalPath.Append(lcFilename)
    if (loFac.FileExists(loLocalPath.GetAsString()) <> .T.) then
        ? "This file does not exist locally."
        llBDownload = .T.
    else
        //  Get the local file's date time and compare with the remote file date/time.
        loLastModLocal.SetFromTimestamp(loFac.GetFileTimeStr(loLocalPath.GetAsString(),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.
        lnNumSeconds = loLastModLocal.DiffSeconds(loLastModRemote)
        if (lnNumSeconds < 0) then
            ? "The local file is older than the remote file."
            llBDownload = .T.
        endif

    endif

    if (llBDownload = .T.) then
        loFileUrl.SetString("https://SHAREPOINT_HTTPS_DOMAIN/_api/web/GetFolderByServerRelativeUrl('/Documents')/Files('")
        loFileUrl.Append(lcFilename)
        loFileUrl.Append("')/$value")

        ? "Downloading " + lcFilename

        llSuccess = loHttp.Download(loFileUrl.GetAsString(),loLocalPath.GetAsString())
        if (llSuccess = .F.) then
            ? loHttp.LastErrorText
            release loHttp
            release loSbJson
            release loFac
            release loJson
            release loLastModRemote
            release loLastModLocal
            release loLocalPath
            release loFileUrl
            return
        endif

        //  Set the local file's last-modified date/time to that of the server's.
        loFac.SetLastModified(loLocalPath.GetAsString(),loLastModRemote)

    endif

    i = i + 1
enddo

? "All finished."


release loHttp
release loSbJson
release loFac
release loJson
release loLastModRemote
release loLastModLocal
release loLocalPath
release loFileUrl