2009-06-29 21 views
10

Ho una raccolta documenti in SharePoint. Quando un nuovo file viene caricato in quella libreria, voglio che venga automaticamente copiato in un'altra libreria di documenti. Come posso fare questo?Copia file nella libreria documenti in SharePoint

+0

All'interno del contesto dei tag C# e SharePoint questa domanda ha perfettamente senso: il voto per riaprire. –

risposta

14

Utilizzare un ricevitore evento oggetto e ignorare l'evento ItemAdded. SPItemEventProperties fornirà un riferimento alla voce di elenco tramite la proprietà ListItem.

Ci sono due metodi per farlo (grazie alla scoperta di CopyTo).

Metodo 1: Utilizzare CopyTo

Questo metodo copia ogni elemento lista con il suo file e le proprietà associate a qualsiasi posizione all'interno della stessa raccolta siti (possibilmente altre applicazioni web come pure, ma non ho ancora testato). SharePoint mantiene automaticamente il collegamento all'elemento di origine anche se si visualizzano le proprietà dell'elemento o si utilizza il relativo menu a discesa. Questo collegamento può essere rimosso con UnlinkFromCopySource.

L'unico trucco per CopyTo è che per il percorso di destinazione è necessario un URL completo.

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

Metodo 2: copia Stream, impostare manualmente le proprietà

Questo metodo sarebbe solo necessario se avete bisogno di più controllo su quali proprietà degli elementi vengono copiati o se il contenuto del file devono essere modificate.

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(); 
    } 
} 

Deployment

Sono disponibili varie opzioni per la distribuzione pure. È possibile associare i ricevitori di eventi a una funzione collegata a un tipo di contenuto o a un elenco e aggiungerli a livello di programmazione. Vedi this article at SharePointDevWiki per maggiori dettagli.

+0

Assicurati di non dimenticare di copiare anche i metadati !! – Colin

+0

Grazie, l'ho aggiunto ora! –

+0

Ciao Alex, ho notato un metodo CopyTo associato all'oggetto SPFile. posso usare questo? – raklos

Problemi correlati