Копировать папки при копировании элементов списка из источника в место назначения - PullRequest
2 голосов
/ 25 марта 2010

Это мой код для копирования файлов в списке из источника в место назначения.Используя приведенный ниже код, я могу копировать только файлы, но не папки.Любые идеи о том, как я могу скопировать папки и файлы в этих папках?

Ответы [ 3 ]

5 голосов
/ 19 апреля 2010

Вот что у меня сработало. Мне пришлось переместить папки из spweb в другую.

private static void RecursiveCopy(SPList objSourceList, SPFolder objSourceFolder, SPFolder objDestinationFolder)
        {
            SPListItemCollection objItems = ((SPDocumentLibrary)objSourceList).GetItemsInFolder(objSourceList.DefaultView, objSourceFolder);

            foreach (SPListItem objItem in objItems)
            {
                //If it's a file copy it.
                if (objItem.FileSystemObjectType == SPFileSystemObjectType.File)
                {

                    byte[] fileBytes = objItem.File.OpenBinary();
                    string DestinationURL = string.Format(@"{0}/{1}", objDestinationFolder.Url, objItem.File.Name);

                    //Copy the file.
                    SPFile objDestinationFile = objDestinationFolder.Files.Add(DestinationURL, fileBytes, true);
                    objDestinationFile.Update();
                }
                else
                {
                    string dirURL = string.Format(@"{0}/{1}", objDestinationFolder.Url, objItem.Folder.Name);
                    SPFolder objNewFolder = objDestinationFolder.SubFolders.Add(dirURL);
                    objNewFolder.Update();

                    //Copy all the files in the sub folder
                    RecursiveCopy(objSourceList, objItem.Folder, objNewFolder);
                }
            }
        }

public static void CopyListItems(string SourceSiteURL, string DestinationSiteURL, string ListName)
        {
            string DestinationURL = string.Empty;

            using (SPSite SourceSite = new SPSite(SourceSiteURL))
            {
                using (SPWeb SourceWeb = SourceSite.OpenWeb())
                {
                    using (SPSite DestinationSite = new SPSite(DestinationSiteURL))
                    {
                        using (SPWeb DestinationWeb = DestinationSite.OpenWeb())
                        {
                            DestinationWeb.AllowUnsafeUpdates = true;

                            //Get the QA Forms Document libarary from the source web
                            SPList objSourceList = SourceWeb.Lists[ListName];

                            SPList objDestinationList = null;

                            try
                            {
                                objDestinationList = DestinationWeb.Lists[ListName];
                            }
                            catch
                            {
                                //Create a list in the destination web
                                DestinationWeb.Lists.Add(ListName, string.Empty, SPListTemplateType.DocumentLibrary);
                            }

                            objDestinationList = DestinationWeb.Lists[ListName];

                            //Recursively copy all the files and folders
                            RecursiveCopy(objSourceList, objSourceList.RootFolder, objDestinationList.RootFolder);



                            DestinationWeb.Update();
                            DestinationWeb.AllowUnsafeUpdates = false;
                        }
                    }
                }
            }
        }

рекурсивно копирует все файлы и папки.

Надеюсь, это кому-нибудь поможет.

1 голос
/ 26 марта 2010

Если вы копируете в место назначения, которое находится на том же SPWeb, вы можете попробовать следующее.

using (SPSite site = new SPSite("http://urltosite"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                //get the folder from the source library
                SPFolder sourceFolder = web.GetFolder("Documents/Folder 1");

                //get the folder to the destination
                SPFolder destinationFolder = web.GetFolder("New Library");

                sourceFolder.CopyTo(destinationFolder.ServerRelativeUrl + "/" + sourceFolder.Name);

            }
        }

К сожалению, я не думаю, что это работает при копировании папки на другой SPWeb или SPSite.

0 голосов
/ 01 апреля 2010

SPList.Items возвращает только непапличные элементы. Вы можете использовать SPList.Folders для перебора всех папок в списке. Так что, если вы сделали тот же цикл foreach, только используя:

foreach (SPListItem objSourceFolderItem in objSourceList.Folders)

Затем вы получите все папки. Чтобы правильно переместить папку и все ее содержимое, вы должны использовать objSourceFolderItem.Folder.CopyTo(ItemUrl).

Я попробовал это, используя список только с одним уровнем папок (соедините его с циклом foreach, чтобы получить все элементы в корневой папке), и он работал для меня в SP2007. Я полагаю, что SPList.Folders получает все папки во всем списке, а не только те, которые находятся в корневой папке, так что если вы в конечном итоге разбиваете список с помощью многоуровневой системы папок, то альтернативой может быть попытка: *

foreach (SPFolder objSourceFolderItem in objSourceList.RootFolder.SubFolders)

Поскольку это уже объекты SPFolder, вы можете просто использовать objSourceFolderItem.CopyTo(ItemUrl).

...