Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        /// <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);
            }
        }