protected override void ExecuteCmdlet() { #pragma warning disable CS0618 // Type or member is obsolete SourceUrl = SourceUrl ?? ServerRelativeUrl; #pragma warning restore CS0618 // Type or member is obsolete var webServerRelativeUrl = SelectedWeb.EnsureProperty(w => w.ServerRelativeUrl); if (!SourceUrl.StartsWith("/")) { SourceUrl = UrlUtility.Combine(webServerRelativeUrl, SourceUrl); } if (!TargetUrl.StartsWith("/")) { TargetUrl = UrlUtility.Combine(webServerRelativeUrl, TargetUrl); } Uri currentContextUri = new Uri(ClientContext.Url); Uri sourceUri = new Uri(currentContextUri, SourceUrl); Uri sourceWebUri = Microsoft.SharePoint.Client.Web.WebUrlFromFolderUrlDirect(ClientContext, sourceUri); Uri targetUri = new Uri(currentContextUri, TargetUrl); Uri targetWebUri = Microsoft.SharePoint.Client.Web.WebUrlFromFolderUrlDirect(ClientContext, targetUri); _sourceContext = ClientContext; if (!currentContextUri.AbsoluteUri.Equals(sourceWebUri.AbsoluteUri, StringComparison.InvariantCultureIgnoreCase)) { _sourceContext = ClientContext.Clone(sourceWebUri); } bool isFile = true; bool srcIsFolder = false; File file = null; Folder folder = null; try { #if ONPREMISES file = _sourceContext.Web.GetFileByServerRelativeUrl(SourceUrl); #else file = _sourceContext.Web.GetFileByServerRelativePath(ResourcePath.FromDecodedUrl(SourceUrl)); #endif file.EnsureProperties(f => f.Name, f => f.Exists); isFile = file.Exists; } catch { isFile = false; } if (!isFile) { #if ONPREMISES folder = _sourceContext.Web.GetFolderByServerRelativeUrl(SourceUrl); #else folder = _sourceContext.Web.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(SourceUrl)); #endif #if !SP2013 folder.EnsureProperties(f => f.Name, f => f.Exists); srcIsFolder = folder.Exists; #else folder.EnsureProperties(f => f.Name); try { folder.EnsureProperties(f => f.ItemCount); //Using ItemCount as marker if this is a file or folder srcIsFolder = true; } catch { srcIsFolder = false; } #endif } if (Force || ShouldContinue(string.Format(Resources.CopyFile0To1, SourceUrl, TargetUrl), Resources.Confirm)) { var srcWeb = _sourceContext.Web; srcWeb.EnsureProperty(s => s.Url); _targetContext = ClientContext.Clone(targetWebUri.AbsoluteUri); var dstWeb = _targetContext.Web; dstWeb.EnsureProperties(s => s.Url, s => s.ServerRelativeUrl); if (srcWeb.Url == dstWeb.Url) { try { var targetFile = UrlUtility.Combine(TargetUrl, file?.Name); // If src/dst are on the same Web, then try using CopyTo - backwards compability #if ONPREMISES file?.CopyTo(targetFile, OverwriteIfAlreadyExists); #else file?.CopyToUsingPath(ResourcePath.FromDecodedUrl(targetFile), OverwriteIfAlreadyExists); #endif _sourceContext.ExecuteQueryRetry(); return; } catch { SkipSourceFolderName = true; // target folder exist //swallow exception, in case target was a lib/folder which exists } } //different site/site collection Folder targetFolder = null; string fileOrFolderName = null; bool targetFolderExists = false; try { #if ONPREMISES targetFolder = _targetContext.Web.GetFolderByServerRelativeUrl(TargetUrl); #else targetFolder = _targetContext.Web.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(TargetUrl)); #endif #if !SP2013 targetFolder.EnsureProperties(f => f.Name, f => f.Exists); if (!targetFolder.Exists) { throw new Exception("TargetUrl is an existing file, not folder"); } targetFolderExists = true; #else targetFolder.EnsureProperties(f => f.Name); try { targetFolder.EnsureProperties(f => f.ItemCount); //Using ItemCount as marker if this is a file or folder targetFolderExists = true; } catch { targetFolderExists = false; } if (!targetFolderExists) { throw new Exception("TargetUrl is an existing file, not folder"); } #endif } catch (Exception) { targetFolder = null; Expression <Func <List, object> > expressionRelativeUrl = l => l.RootFolder.ServerRelativeUrl; var query = _targetContext.Web.Lists.IncludeWithDefaultProperties(expressionRelativeUrl); var lists = _targetContext.LoadQuery(query); _targetContext.ExecuteQueryRetry(); lists = lists.OrderByDescending(l => l.RootFolder.ServerRelativeUrl); // order descending in case more lists start with the same foreach (List targetList in lists) { if (!TargetUrl.StartsWith(targetList.RootFolder.ServerRelativeUrl, StringComparison.InvariantCultureIgnoreCase)) { continue; } fileOrFolderName = Regex.Replace(TargetUrl, _targetContext.Web.ServerRelativeUrl, "", RegexOptions.IgnoreCase).Trim('/'); targetFolder = srcIsFolder ? _targetContext.Web.EnsureFolderPath(fileOrFolderName) : targetList.RootFolder; //fileOrFolderName = Regex.Replace(TargetUrl, targetList.RootFolder.ServerRelativeUrl, "", RegexOptions.IgnoreCase).Trim('/'); //targetFolder = srcIsFolder ? targetList.RootFolder.EnsureFolder(fileOrFolderName) : targetList.RootFolder; break; } } if (targetFolder == null) { throw new Exception("Target does not exist"); } if (srcIsFolder) { if (!SkipSourceFolderName && targetFolderExists) { targetFolder = targetFolder.EnsureFolder(folder.Name); } CopyFolder(folder, targetFolder); } else { UploadFile(file, targetFolder, fileOrFolderName); } } }
/// <summary> /// Allows copying to within the same site collection /// </summary> private void CopyWithinSameSiteCollection(Uri currentContextUri, Uri sourceWebUri, Uri targetWebUri) { _sourceContext = ClientContext; if (!currentContextUri.AbsoluteUri.Equals(sourceWebUri.AbsoluteUri, StringComparison.InvariantCultureIgnoreCase)) { _sourceContext = ClientContext.Clone(sourceWebUri); } bool isFile = true; bool srcIsFolder = false; File file = null; Folder folder = null; try { file = _sourceContext.Web.GetFileByServerRelativePath(ResourcePath.FromDecodedUrl(SourceUrl)); file.EnsureProperties(f => f.Name, f => f.Exists); isFile = file.Exists; } catch { isFile = false; } if (!isFile) { folder = _sourceContext.Web.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(SourceUrl)); folder.EnsureProperties(f => f.Name, f => f.Exists); srcIsFolder = folder.Exists; folder.EnsureProperties(f => f.Name); try { folder.EnsureProperties(f => f.ItemCount); //Using ItemCount as marker if this is a file or folder srcIsFolder = true; } catch { srcIsFolder = false; } } var srcWeb = _sourceContext.Web; srcWeb.EnsureProperty(s => s.Url); _targetContext = ClientContext.Clone(targetWebUri.AbsoluteUri); var dstWeb = _targetContext.Web; dstWeb.EnsureProperties(s => s.Url, s => s.ServerRelativeUrl); if (srcWeb.Url == dstWeb.Url) { try { var targetFile = UrlUtility.Combine(TargetUrl, file?.Name); // If src/dst are on the same Web, then try using CopyTo - backwards compability file?.CopyToUsingPath(ResourcePath.FromDecodedUrl(targetFile), OverwriteIfAlreadyExists); _sourceContext.ExecuteQueryRetry(); return; } catch { SkipSourceFolderName = true; // target folder exist //swallow exception, in case target was a lib/folder which exists } } //different site/site collection Folder targetFolder = null; string fileOrFolderName = null; bool targetFolderExists = false; try { targetFolder = _targetContext.Web.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(TargetUrl)); targetFolder.EnsureProperties(f => f.Name, f => f.Exists); if (!targetFolder.Exists) { throw new Exception("TargetUrl is an existing file, not folder"); } targetFolderExists = true; } catch (Exception) { targetFolder = null; Expression <Func <List, object> > expressionRelativeUrl = l => l.RootFolder.ServerRelativeUrl; var query = _targetContext.Web.Lists.IncludeWithDefaultProperties(expressionRelativeUrl); var lists = _targetContext.LoadQuery(query); _targetContext.ExecuteQueryRetry(); lists = lists.OrderByDescending(l => l.RootFolder.ServerRelativeUrl); // order descending in case more lists start with the same foreach (List targetList in lists) { if (!TargetUrl.StartsWith(targetList.RootFolder.ServerRelativeUrl, StringComparison.InvariantCultureIgnoreCase)) { continue; } fileOrFolderName = Regex.Replace(TargetUrl, _targetContext.Web.ServerRelativeUrl, "", RegexOptions.IgnoreCase).Trim('/'); targetFolder = srcIsFolder ? _targetContext.Web.EnsureFolderPath(fileOrFolderName) : targetList.RootFolder; break; } } if (targetFolder == null) { throw new Exception("Target does not exist"); } if (srcIsFolder) { if (!SkipSourceFolderName && targetFolderExists) { targetFolder = targetFolder.EnsureFolder(folder.Name); } CopyFolder(folder, targetFolder); } else { UploadFile(file, targetFolder, fileOrFolderName); } }