Sharepoint: Ottenere l’ID di un file pubblicato in una document library
Attraverso CAML possiamo fare tutta una serie di query che vanno ad interrogare il contenuto di una document library. Per esempio, se volessimo aggiornare i metadati di un file pubblicato in una document library dobbiamo prima averne l’ID univoco. Questo lo abbiamo visto precedentemente, quando abbiamo ottenuto l’ID dell’ultimo file uploadato.
Quale CAML dobbiamo scrivere per sapere l’ID di un qualsiasi file?
E’ molto semplice:
<Where> <Eq> <FieldRef Name="FileLeafRef" /> <Value Type="Text">{0}</Value> </Eq> </Where>
Se usiamo questo CAML in un metodo GetIDFromFilename, il risultato è servito:
1 public int GetIDFromFilename(string listName, string folder, string fileName) 2 { 3 Lists l = new Lists(); 4 l.Credentials = new NetworkCredential(this.Username, this.Password, this.Domain); 5 6 XmlDocument doc = new XmlDocument(); 7 XmlNode query = doc.CreateNode(XmlNodeType.Element, "Query", string.Empty); 8 XmlNode options = doc.CreateNode(XmlNodeType.Element, "QueryOptions", string.Empty); 9 10 if(!string.IsNullOrEmpty(folder)) 11 options.InnerXml = string.Format("<Folder>{0}</Folder>", folder); 12 13 string xml = ResourceHelper.GetResourceContent("UploaderMOSS.XML.GetIDFromFilenameQuery.xml"); 14 query.InnerXml = string.Format(xml, fileName); 15 16 XmlNode node = l.GetListItems(listName, null, query, null, "1", options, null); 17 18 node = node.FirstChild.NextSibling.FirstChild.NextSibling; 19 20 if (node != null) 21 { 22 int idFile = Int32.Parse(node.Attributes["ows_ID"].Value); 23 this.CacheFilesID.Add(fileName, idFile); 24 return idFile; 25 } 26 else 27 return 0; 28 }
I parametri richiesti in input dal metodo sono, nell’ordine: il nome della lista, il path ed il nome del file. Il risultato è un banale int, che può valere 0 (zero) nel caso in cui chiediamo l’ID di un file che non esiste. Se il file è alla root della document library, il parametro folder può essere string.Empty. La query CAML che abbiamo visto prima viene utilizzata alle righe 13 e 14.
Se il file si trova annidato in diversi subfolders della document library, dobbiamo utilizzare – come già ho detto prima – il parametro folder. Internamente, il metodo costruisce un blocco <QueryOptions><Folder>{0}</Folder></QueryOptions>, dove viene iniettato il path (es: “Folder1/Folder2/Folder”, escludendo il nome del file). Questo blocco <QueryOptions> viene passato al metodo GetListItems del web-service di cui vi ho parlato nei post precedenti.
Conclusione
Detto questo, possiamo scrivere un metodo Main come questo:
static void Main(string[] args) { ConnectorWSS wss = new ConnectorWSS(); wss.UploadDocument("D:\Documenti\test_uploading.txt", "igordamiani/Documenti/test_uploading.txt"); int idFile = wss.GetIDFromFilename("Documenti", string.Empty, "test_uploading.txt"); Dictionary<string, string> values = new Dictionary<string, string>(); values.Add("Note", "Upload di test!"); wss.UpdateDocumentMetadata("Documenti", idFile, values); }
Con poche righe di codice, pubblico un file sulla document library di Sharepoint, ne ottengo l’ID e salvo i metadati costruendo prima un Dictionary<string, string> appositamente.
Technorati Tags: .NET Framework SharePoint CAML query document library