好的,所以我有一个用户的请求,我想使用事件接收器来实现它。
基本上她想要的是有一个文档库,用户可以在其中上传文档。每个文档都有一个类似“UserA - Customization.docx”的文件名。现在您可以想象一个用户可以上传许多具有相同名称的文档,所以我们要做的是自动为文件编号。因此,如果 UserA 上传第一个文档,SharePoint 将在名称后添加一个数字,因此文件将被称为“UserA - Customization - 1.docx”,然后他上传第二个文档,它将被称为“UserA - Customization - 2 .docx”。
但是,现在如果 UserB 想要上传他的第一个文档,则必须将其编号为“UserB - Customization - 1.docx”,因此如果它是新文档,则基本上计数器需要重新启动,如果文档名称已经存在,则从最高编号继续。
所以基本上 SharePoint 需要检查当前文档的名称是否存在于列表中,如果它确实在其旁边添加了一个数字,但该数字必须比最高文档大 1,因此它只会增加。
有没有办法做到这一点?有任何想法吗?
到目前为止,这就是我想出的简单更改文件名的方法,将“-xx”添加到文件名中,但这不起作用。
public override void ItemAdded(SPItemEventProperties properties)
{
SPFile spf = properties.ListItem.File;
string url = properties.AfterUrl;
int positionOfSlash = url.LastIndexOf("/");
string pathBeforeFileName = url.Substring(0, positionOfSlash);
string newFileName = createNewFileName(url.Substring(positionOfSlash));
string myNewUrl = pathBeforeFileName + newFileName;
DisableEventFiring();
spf.MoveTo(myNewUrl);
spf.Update();
EnableEventFiring();
}
static string createNewFileName(string oldFileName)
{
int positionOfPeriod = oldFileName.LastIndexOf(".");
string fileName = oldFileName.Substring(0, positionOfPeriod);
string fileExtension = oldFileName.Substring(positionOfPeriod);
string newFileName = fileName + "-xx" + fileExtension;
return newFileName;
}
这段代码我哪里出错了?谢谢你的帮助!
编辑:这是我在 Visual Studio 的控制台应用程序中使用的代码,用于将 EventReceiver 附加到文档库。
using (SPSite site = new SPSite("http://servername:port/subsite1/subsite2/"))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["My Doc Library"];
SPEventReceiverDefinition def = list.EventReceivers.Add();
def.Assembly = "DocumentLibrary_ClassLib, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=611205b34d18f14d";
def.Class = "DocumentLibrary_ClassLib.EventReceiver";
def.Type = SPEventReceiverType.ItemAdded;
def.Update();
}
}
编辑#2:好的,这样的事情怎么样?
//this will get just the name of the file without the extension and I will send that to the
//query builder which will count how many files there are with that name and return
int positionOfPeriod = oldFileName.LastIndexOf(".");
string tempFileName = oldFileName.Substring(0, positionOfPeriod);
SPQuery query = BuildArbitraryQuery(properties.List, "Name", tempFileName, true);
但现在我不太了解 BuildArbitraryQuery 中的查询,我该如何更改它以提供所需的行为?(对不起,如果这是一个完全的菜鸟问题,但我以前从未处理过 C# 和 EventReceivers)
- 看了 BuildArbitraryQuery 一段时间后,我想我明白了,基本上我不需要改变任何东西?因为它接收文件名和列名作为参数,所以应该没问题吧?
此外,由于列表中的项目将类似于 ClientA Request - 3.docx 并且我将文件名发送到 BuildArbitraryQuery 将能够找到部分匹配而不是完整匹配。因此,例如,如果 BuildArbitraryQuery 接收到的文件名是 ClientA Request.docx,它是否能够找到来自该 ClientA 的所有其他请求?那么 ClientA Request - 1.docx、ClientA Request - 2.docx 是否都包含在计算中?