Sub SyncFolder(localFolderPath As String, parentFolderId As String) As ResumableSub
' Get a list of all files in the local folder
Dim localFiles As List = File.ListFiles(localFolderPath)
Log("Parent Folder ID: " & parentFolderId)
' For each local file, check if it exists on OneDrive and upload it if necessary
For Each localFileName As String In localFiles
' Check if the file exists on OneDrive
Dim job As HttpJob
job.Initialize("", Me)
job.Download($"https://graph.microsoft.com/v1.0/me/drive/items/${parentFolderId}:/${localFileName}:"$)
job.GetRequest.SetHeader("Authorization", "Bearer " & token)
Wait For (job) JobDone(job As HttpJob)
If job.Success Then
' The file exists on OneDrive, check if the local file has been modified since it was last uploaded
Dim parser As JSONParser
parser.Initialize(job.GetString)
Dim oneDriveFile As Map = parser.NextObject
Dim oneDriveFileLastModified As Long = oneDriveFile.Get("lastModifiedDateTime")
Dim localFileLastModified As Long = File.LastModified(localFolderPath, localFileName)
If localFileLastModified > oneDriveFileLastModified Then
' The local file has been modified since it was last uploaded, upload it again
UploadFile(localFolderPath, localFileName, parentFolderId)
End If
Else
' The file does not exist on OneDrive, upload it
UploadFile(localFolderPath, localFileName, parentFolderId)
End If
job.Release
Next
End Sub
Sub UploadFile(localFolderPath As String, localFileName As String, parentFolderId As String) As ResumableSub
' Initialize OkHttpClient
Dim hc As OkHttpClient
hc.Initialize("hc")
' URL encode the file name
Dim su As StringUtils
Dim encodedFileName As String = su.EncodeUrl(localFileName, "UTF8")
encodedFileName = encodedFileName.Replace("+", "%20")
' Get the file's MIME type
Dim extension As String = localFileName.SubString(localFileName.LastIndexOf(".") + 1)
Dim mimeType As String = GetMimeType(extension)
' Log MIME Type and File Extension
Log("File Extension: " & extension)
Log("MIME Type: " & mimeType)
' Open the file as an InputStream
Dim InStream As InputStream
InStream = File.OpenInput(localFolderPath, localFileName)
' Log the InputStream
Log("Stream = " & InStream)
' Get the file length
Dim FileLength As Long
FileLength = File.Size(localFolderPath, localFileName)
' Log the File Length
Log("Length = " & FileLength)
' Initialize the POST request with InputStream
Dim endpoint As String = $"https://graph.microsoft.com/v1.0/me/drive/items/${parentFolderId}/${encodedFileName}:/content"$
Dim req As OkHttpRequest
req.InitializePost(endpoint, InStream, FileLength)
' Log the Endpoint
Log("Endpoint = " & endpoint)
' Set the request's Content-Type header
req.SetContentType(mimeType)
' Set the request's Authorization header
req.SetHeader("Authorization", "Bearer " & token)
' Log the Authorization Header
Log("Authorization Header: " & "Bearer " & token)
' Execute the request
hc.Execute(req, 1)
Wait For hc_ResponseSuccess(Response As OkHttpResponse, TaskId As Int)
If TaskId = 1 Then
If Response.StatusCode = 201 Then
Log($"Uploaded ${localFileName} to OneDrive"$)
Else
Log($"Failed to upload ${localFileName} to OneDrive: ${Response.StatusCode}"$)
End If
End If
InStream.Close ' Close the InputStream
End Sub