Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
        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());
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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()}");
            }
        }