2009-06-29 7 views
10

J'ai une bibliothèque de documents dans SharePoint. Quand un nouveau fichier est téléchargé dans cette bibliothèque, je veux qu'il soit automatiquement copié dans une autre bibliothèque de documents. Comment puis-je faire ceci?Copier des fichiers dans la bibliothèque de documents dans SharePoint

+0

Dans le contexte des balises C# et SharePoint, cette question est tout à fait logique: le vote est rouvert. –

Répondre

14

Utilisez un récepteur d'événement d'élément et remplacez l'événement ItemAdded. SPItemEventProperties vous donnera une référence à l'élément de liste via la propriété ListItem.

Il existe deux méthodes pour cela (grâce à votre découverte de CopyTo).

Méthode 1: Utilisez CopyTo

Cette méthode copie tout d'élément de liste avec son fichier associé et propriétés à un endroit dans la même collection de sites (éventuellement d'autres applications web aussi bien mais je ne l'ai pas testé). SharePoint conserve automatiquement le lien vers l'élément source si vous affichez les propriétés de l'élément ou utilisez son menu déroulant. Ce lien peut être supprimé avec UnlinkFromCopySource.

La seule astuce à CopyTo est qu'une URL complète est requise pour l'emplacement de destination.

public class EventReceiverTest : SPItemEventReceiver 
{ 
    public override void ItemAdded(SPItemEventProperties properties) 
    { 
     properties.ListItem.CopyTo(
      properties.WebUrl + "/Destination/" + properties.ListItem.File.Name); 
    } 
} 

Méthode 2: copie Stream, propriétés définies manuellement

Cette méthode serait nécessaire que si vous avez besoin de plus de contrôle sur les propriétés de l'élément sont copiés ou si le contenu du fichier doivent être modifiés.

public class EventReceiverTest : SPItemEventReceiver 
{ 
    public override void ItemAdded(SPItemEventProperties properties) 
    { 
     SPFile sourceFile = properties.ListItem.File; 
     SPFile destFile; 

     // Copy file from source library to destination 
     using (Stream stream = sourceFile.OpenBinaryStream()) 
     { 
      SPDocumentLibrary destLib = 
       (SPDocumentLibrary) properties.ListItem.Web.Lists["Destination"]; 
      destFile = destLib.RootFolder.Files.Add(sourceFile.Name, stream); 
      stream.Close(); 
     } 

     // Update item properties 
     SPListItem destItem = destFile.Item; 
     SPListItem sourceItem = sourceFile.Item; 
     destItem["Title"] = sourceItem["Title"]; 
     //... 
     //... destItem["FieldX"] = sourceItem["FieldX"]; 
     //... 
     destItem.UpdateOverwriteVersion(); 
    } 
} 

déploiement

Vous avez différentes possibilités de déploiement ainsi. Vous pouvez associer des récepteurs d'événements à une fonctionnalité connectée à un type ou une liste de contenu et les ajouter par programme. Voir this article at SharePointDevWiki pour plus de détails.

+0

Assurez-vous de ne pas oublier de copier les métadonnées aussi! – Colin

+0

Merci, j'ai maintenant ajouté ça! –

+0

Salut Alex, j'ai remarqué une méthode CopyTo associée à l'objet SPFile. puis-je faire usage de cela? – raklos

Questions connexes