2010-03-24 3 views
2

이것은 소스에서 대상으로 목록의 파일을 복사하는 코드입니다. 아래 코드를 사용하여 파일 만 복사 할 수 있지만 폴더는 복사 할 수 없습니다. 해당 폴더 내의 폴더와 파일을 어떻게 복사 할 수 있습니까? 같은 SPWeb 내에 위치한 대상에 복사하는 경우목록 항목을 원본에서 대상으로 복사 할 때 폴더 복사

using (SPSite objSite = new SPSite(URL)) 
      { 
       using (SPWeb objWeb = objSite.OpenWeb()) 
       { 
        SPList objSourceList = null; 
        SPList objDestinationList = null; 

        try 
        { 
         objSourceList = objWeb.Lists["Source"]; 
        } 
        catch(Exception ex) 
        { 
         Console.WriteLine("Error opening source list"); 
         Console.WriteLine(ex.Message); 
        } 

        try 
        { 
         objDestinationList = objWeb.Lists["Destination"]; 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine("Error opening destination list"); 
         Console.WriteLine(ex.Message); 
        } 

        string ItemURL = string.Empty; 
        if (objSourceList != null && objDestinationList != null) 
        { 
         foreach (SPListItem objSourceItem in objSourceList.Items) 
         { 
          ItemURL = string.Format(@"{0}/Destination/{1}", objDestinationList.ParentWeb.Url, objSourceItem.Name); 
          objSourceItem.CopyTo(ItemURL); 
          objSourceItem.UnlinkFromCopySource(); 
         } 
        } 
       } 
      } 

감사

답변

5

이것이 저에게 효과적입니다. 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

, 당신은 다음을 시도 할 수 있습니다.

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

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) 만 사용할 수 있습니다.

관련 문제