public IEnumerable<FileSystemChange> DetermineChangesToSource(IEnumerable<FileSystemEntry> sourceEntries, IEnumerable<FileSystemEntry> destinationEntries, ConflictBehavior conflictBehavior) { List<FileSystemChange> result = new List<FileSystemChange>(); var sourceDictionary = sourceEntries.ToDictionary(p => p.RelativePath.ToLower()); foreach (var destEntry in destinationEntries) { FileSystemEntry matchingSource = null; if (sourceDictionary.TryGetValue(destEntry.RelativePath.ToLower(), out matchingSource)) { // exists on source // determine if we have a conflict if (destEntry.IsInConflictWith(matchingSource)) { if (conflictBehavior == ConflictBehavior.Skip) continue; if (conflictBehavior == ConflictBehavior.TakeDestination) result.Add(FileSystemChange.ForOverwrite(destEntry)); if (conflictBehavior == ConflictBehavior.TakeNewest && destEntry.Created != null && matchingSource.Created != null && destEntry.Created.Value > matchingSource.Created.Value) { result.Add(FileSystemChange.ForOverwrite(destEntry)); continue; } if (conflictBehavior == ConflictBehavior.TakeNewest && destEntry.Modified != null && matchingSource.Modified != null && destEntry.Modified.Value > matchingSource.Modified.Value) { result.Add(FileSystemChange.ForOverwrite(destEntry)); continue; } } } else { // does not exist on source result.Add(FileSystemChange.ForCreate(destEntry)); } } return result; }
/// <summary> /// if controller is null, use CreatorController. /// </summary> /// <param name="folder"></param> /// <param name="newFolderName"></param> /// <param name="conflict"></param> /// <param name="controller"></param> /// <param name="pageSize">default value was 200, max value was 1000 ( test on 2015-07-27 ).</param> /// <returns></returns> public async static Task<WebResult<Item>> CreateFolderAsync(this IRoot folder, string newFolderName, ConflictBehavior conflict = ConflictBehavior.Fail, OneDriveWebController controller = null) { var entity = new CreateFolderEntity() { Name = newFolderName, Folder = new EmptyEntity(), NameconflictBehavior = conflict.GetValue() }; var json = entity.ObjectToJson(); Debug.WriteLine(json); return await (controller ?? folder.CreatorController) .WrapRequestAsync<Item>($"drive/items/{folder.Id}/children", HttpWebRequestResourceString.Method.Post, json.GetBytes()); }