/// <summary>
        /// Gets the folder shared link which can be used, for example,
        /// to download folder as .zip archive.
        /// </summary>
        /// <param name="svcUri">Dropbox folder URI</param>
        /// <returns>Folder shared link</returns>
        public async Task <string> GetFolderSharedLink(string svcUri)
        {
            try
            {
                dropboxApi.Sharing.ListSharedLinksResult result = null;

                using (var client = new dropboxApi.DropboxClient(AccessToken))
                {
                    result = await client.Sharing.ListSharedLinksAsync(svcUri, directOnly : true);

                    if (result.Links.Count == 0)
                    {
                        var sharedLinkMeta = await client.Sharing.CreateSharedLinkWithSettingsAsync(svcUri);

                        return(sharedLinkMeta.Url);
                    }
                }

                return(result.Links[0].Url);
            }
            catch (Exception)
            {
                return(null);
            }
        }
        /// <summary>
        /// Retrieves all the files that are within Dropbox folder by given URI.
        /// </summary>
        /// <param name="svcFolderUri">Dropbox folder URI</param>
        /// <returns>Result that contains list with file metadata</returns>
        public async Task <dropboxApi.Files.ListFolderResult> GetFilesInFolder(string svcFolderUri)
        {
            try
            {
                dropboxApi.Files.ListFolderResult result = null;

                using (var client = new dropboxApi.DropboxClient(AccessToken))
                {
                    result = await client.Files.ListFolderAsync(svcFolderUri);
                }

                return(result);
            }
            catch (Exception)
            {
                return(null);
            }
        }
        /// <summary>
        /// Gets file or folder metadata (file size, creation time, extension etc.).
        /// </summary>
        /// <param name="svcUri">Dropbox URI for the file or folder</param>
        /// <returns>File or folder metadata</returns>
        public async Task <dropboxApi.Files.Metadata> GetFileOrFolderMetadata(string svcUri)
        {
            try
            {
                dropboxApi.Files.Metadata result = null;

                using (var client = new dropboxApi.DropboxClient(AccessToken))
                {
                    result = await client.Files.GetMetadataAsync(svcUri);
                }

                return(result);
            }
            catch (Exception)
            {
                return(null);
            }
        }
        /// <summary>
        /// Renames file or folder.
        /// </summary>
        /// <param name="oldSvcUri">Dropbox URI for the file or folder to rename</param>
        /// <param name="newSvcUri">The Dropbox URI for new file or folder name</param>
        /// <returns>Renamed file or folder metadata</returns>
        public async Task <dropboxApi.Files.RelocationResult> RenameFileOrFolder(string oldSvcUri, string newSvcUri)
        {
            try
            {
                dropboxApi.Files.RelocationResult result = null;

                using (var client = new dropboxApi.DropboxClient(AccessToken))
                {
                    result = await client.Files.MoveV2Async(oldSvcUri, newSvcUri, autorename : false);
                }

                return(result);
            }
            catch (Exception)
            {
                return(null);
            }
        }
        /// <summary>
        /// Deletes file or folder by the specified Dropbox URI.
        /// </summary>
        /// <param name="svcUri">File or Folder URI</param>
        /// <returns>Deleted file or folder metadata</returns>
        public async Task <dropboxApi.Files.DeleteResult> DeleteFileOrFolder(string svcUri)
        {
            try
            {
                dropboxApi.Files.DeleteResult result = null;

                using (var client = new dropboxApi.DropboxClient(AccessToken))
                {
                    result = await client.Files.DeleteV2Async(svcUri);
                }

                return(result);
            }
            catch (Exception)
            {
                return(null);
            }
        }
        /// <summary>
        /// Downloads a file by given Dropbox source URI to local directory.
        /// </summary>
        /// <param name="svcFileUri">Dropbox file URI</param>
        /// <param name="localFilePath">Local directory where to download file</param>
        /// <returns>True if file download went successfully, else False</returns>
        public async Task <bool> DownloadFile(string svcFileUri, string localFilePath)
        {
            try
            {
                using (var client = new dropboxApi.DropboxClient(AccessToken))
                {
                    var result = await client.Files.DownloadAsync(svcFileUri);

                    using (Stream sourceStream = await result.GetContentAsStreamAsync())
                        using (FileStream source = File.Open(localFilePath, FileMode.Create))
                        {
                            await sourceStream.CopyToAsync(source);
                        }
                }

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
        /// <summary>
        /// Uploads the files from PC local directory to Dropbox folder.
        /// </summary>
        /// <remarks>
        /// When providing the 'filePaths' list where the file sub directory does not exist in Dropbox,
        /// new folder will be automatically created in Dropbox.
        /// </remarks>
        /// <param name="svcPath">Dropbox folder URI where to upload files (Example: /app/UploadFolder)</param>
        /// <param name="localDirPath">Path from where to upload files</param>
        /// <param name="filePaths">File URIs (Example: [ "/app/UploadFolder/file.jpg", "/app/UploadFolder/SubFolder/file2.jpg" ] etc.)</param>
        /// <returns>List with uploaded file metadata</returns>
        public async Task <List <dropboxApi.Files.FileMetadata> > UploadFiles(string svcPath, string localDirPath, List <string> filePaths)
        {
            var uploadResults = new List <dropboxApi.Files.FileMetadata>();

            try
            {
                if (filePaths == null || filePaths.Count() == 0)
                {
                    throw new ArgumentNullException("UploadFiles: files list was empty");
                }

                foreach (var relativePath in filePaths)
                {
                    string fullLocalDir = Path.Combine(localDirPath, relativePath);
                    string fullSvcUri   = svcPath.ToUri() + relativePath.ToUri();

                    if (File.Exists(fullLocalDir))
                    {
                        using (var client = new dropboxApi.DropboxClient(AccessToken))
                            using (Stream fileStream = File.OpenRead(fullLocalDir))
                            {
                                var result = await client.Files.UploadAsync(fullSvcUri, body : fileStream);

                                uploadResults.Add(result);
                            }
                    }
                    else
                    {
                        throw new FileNotFoundException($"DropboxManager: File with name: {relativePath} does not exists!");
                    }
                }

                return(uploadResults);
            }
            catch (Exception)
            {
                return(null);
            }
        }