2010-03-24 105 views
2

這是我的代碼,用於將源列表中的文件複製到目標。使用下面的代碼,我只能複製文件,但不能複製文件夾。關於如何複製這些文件夾中的文件夾和文件的任何想法?複製從源到目標的列表項時的文件夾

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

如果複製到位於相同的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

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)

相關問題