Pantas & Mudah: Namakan semula Fail naik Menggunakan SharePoint Objek Model Via satu Penerima Acara

UPDATE: Ini kerja-kerja tetapi terdapat limitasi penting yang dihuraikan dalam komen. Ini mungkin berguna dalam sesetengah cirumstances.

UPDATE 2: Dalam projek semasa saya, pengguna sentiasa muat naik dokumen. Hasilnya, Saya tidak menghadapi masalah di mana MS Word berjalan dan berfikir bahawa fail yang dinamakan di atasnya. Saya pula menghadapi masalah, "fail telah diubahsuai oleh orang lain" dan diselesaikan ini melalui jenis bendera semafor mudah. Pengguna perlu menukar bidang data meta dari nilai lalai kepada sesuatu yang lain. Itemupdated yang() penerima mencari nilai yang sah ada sebelum benar-benar melaksanakan menamakan semula dan sejak itu, Saya tidak mempunyai sebarang masalah. Perbatuan anda mungkin berbeza-beza.

Saya mempunyai pelanggan keperluan untuk menukar nama fail yang dimuat naik ke sebuah perpustakaan dokumen tertentu untuk mematuhi konvensyen penamaan yang tertentu. API tidak menyediakan sebuah "Namakan semula()" kaedah. Sebaliknya, kita gunakan "MoveTo(…)". Berikut adalah sedikit rendah kod untuk mencapai matlamat ini:

 awam mengatasi membatalkan ItemAdded(SPItemEventProperties hartanah)
        {
            SPFile f = properties.ListItem.File;

            f.MoveTo(properties.ListItem.ParentList.RootFolder.Url + "/xyzzy.doc");
            f.Update();

        }

Bit hanya rumit adalah sebagai "hartanah. ListItem.ParentList.RootFolder.Url". MoveTo yang() Kaedah memerlukan URL. Yang mashed rentetan tempat saya ke folder akar Perpustakaan dokumen saya semasa. Ini membolehkan saya untuk mengelakkan mana-mana coding yang keras pada saya sekiranya penerima.

Ini adalah versi yang lebih berguna yang melakukan perkara yang sama, tetapi menguntukkan nama fail itu kepada "Tajuk":

 awam mengatasi membatalkan ItemAdded(SPItemEventProperties hartanah)
        {
            DisableEventFiring();

            // Berikan tajuk item ini untuk nama fail sendiri.
 // NOTA: Tugasan ini mesti berlaku sebelum kita mengubah suai fail itu sendiri.
 // Panggilan update() pada SPFile nampaknya membatalkan hartanah di
 // erti kata lain.  Pengemaskinian untuk "tajuk" gagal sehingga perubahan yang (dan kemas kini() memanggil)
 // dipindahkan di hadapan perubahan kepada nama fail.
            properties.ListItem["Tajuk"] = Properties.ListItem.File.Name;

            properties.ListItem.Update();

            SPFile f = properties.ListItem.File;

            // Dapatkan lanjutan fail.  Kita perlu yang kemudiannya.
 rentetan spfileExt = baru Fileinfo(f.Name).Tambahan;

            // Menamakan semula fail ke ID item senarai dan menggunakan sambungan fail untuk menyimpan
 // bahawa sebahagian daripada ia tidak terjejas.
            f.MoveTo(properties.ListItem.ParentList.RootFolder.Url +
                "/" + properties.ListItem["ID"] + spfileExt);

            // Melakukan langkah.
            f.Update();

            EnableEventFiring();
        }

4 pemikiran untuk "Pantas & Mudah: Namakan semula Fail naik Menggunakan SharePoint Objek Model Via satu Penerima Acara

  1. Tiada nama
    Juga, Jika anda melakukan ini dari dalam Word, ia akan kembali kesilapan dan mengatakan fail yang tidak wujud. Ia tidak diberitahu mengenai URL baru. Saya masih belum menemui jalan sekitar ini.
    Balas
  2. Paul Galvin
    Terima kasih kerana menunjuk itu. Saya tidak tahu jawapan kepada yang sama … akan menjadi menarik untuk melihat bagaimana untuk menguruskannya.
    RE: Async & redirection
    Saya tertanya-tanya jika memindahkannya ke ItemAdding yang akan menyelesaikan ia. Itulah sebuah lubang besar.
    Terima kasih!
    –Paul
    Balas
  3. Nadeem Mitha
    Kerana fail mendapat berpindah asynchronously, terdapat kemungkinan yang dibawa ke EditForm.aspx sebelum langkah itu dilakukan (dan yang buruk). Anda akan melihat bahawa ini akan berlaku jika anda membuat kod tidur sebelum garisan MoveTo. Aku masih belum tahu apa yang boleh dilakukan mengenai masalah itu selain daripada menggunakan borang tersuai edit.
    Balas

Tinggalkan Jawapan

alamat e-mel anda tidak akan diterbitkan. Ruangan yang diperlukan ditanda *