public async Task <IEnumerable <OnedriveItem> > GetOnedriveItemChildren(OnedriveItem item) { if (string.IsNullOrEmpty(item.Id)) { throw new ArgumentException($"{nameof(item)} has no Id set."); } if (!item.IsDirectory) { _logger.Debug($"{item} is a directory."); return(new List <OnedriveItem>()); } _logger.Debug("Populating {0}", item.Name); var children = await _graphServiceClient.Me.Drive.Items[item.Id].Children.Request().GetAsync(); var onedriveChildren = new List <OnedriveItem>(); foreach (var child in children) { var pathFromRoot = Path.Combine(item.PathFromRoot, child.Name); var onedriveChild = new OnedriveItem( child.Id, (child.Folder != null), child.Name, pathFromRoot, child.LastModifiedDateTime ); onedriveChildren.Add(onedriveChild); _logger.Debug($"Populated child node: {onedriveChild.ToString()}"); } return(onedriveChildren); }
public async Task DownloadItemRecursive(OnedriveItem item, string rootPath) { if (!item.IsDirectory) { return; } _logger.Debug($"Downloading directory {item.ToString()}"); var children = await _apiClient.GetOnedriveItemChildren(item); foreach (var child in children) { await DownloadItem(child, rootPath); } var tasks = new List <Task>(); foreach (var child in children) { tasks.Add( Task.Run(() => DownloadItemRecursive(child, rootPath)) ); } Task.WaitAll(tasks.ToArray()); }
public async Task <Stream> GetFileStream(OnedriveItem item) { if (string.IsNullOrEmpty(item.Id)) { throw new ArgumentException($"{nameof(item)} has no Id set."); } if (item.IsDirectory) { _logger.Debug($"{item} is a directory."); } return(await _graphServiceClient.Me.Drive.Items[item.Id].Content.Request().GetAsync()); }
public async Task <OnedriveItem> GetOnedriveRoot() { var root = await _graphServiceClient.Me.Drive.Root.Request().GetAsync(); var onedriveRoot = new OnedriveItem( root.Id, (root.Folder != null), root.Name, "", root.LastModifiedDateTime ); _logger.Debug($"Onedrive root: {onedriveRoot.ToString()}"); return(onedriveRoot); }
public async Task DownloadItem(OnedriveItem item, string rootPath) { if (item.IsDirectory) { return; } var filePath = Path.Combine(rootPath, item.PathFromRoot); if (File.Exists(filePath)) { var localModifiedTime = File.GetLastWriteTimeUtc(filePath); var remoteModifiedTime = item.LastModifiedDateTime; _logger.Debug($"{item.ToString()}: {localModifiedTime} (local) {remoteModifiedTime} (remote)"); if (localModifiedTime > remoteModifiedTime) { _logger.Debug($"{item.ToString()}: Not downloading because local is newer"); return; } } _logger.Debug($"Downloading item {item.ToString()} to {filePath}"); try { var stream = await _apiClient.GetFileStream(item); var path = Path.GetDirectoryName(filePath); Directory.CreateDirectory(path); using (var fileStream = File.Create(filePath)) { await stream.CopyToAsync(fileStream); } } catch (Exception e) { _logger.Error(e, $"Error downloading item {item.ToString()}"); } }