【问题标题】:How to efficiently delete all files in a document library?如何有效地删除文档库中的所有文件?
【发布时间】:2008-10-31 20:41:54
【问题描述】:

我正在寻找一个清晰、完整的示例,该示例通过 Sharepoint 对象模型以编程方式从特定文档库中删除所有文档。 doclib 不包含文件夹。我希望完全删除这些文档(即我不希望它们在回收站中)。

我知道 SPWeb.ProcessBatchData,但不知何故它似乎对我不起作用。

谢谢!

【问题讨论】:

  • 您可以访问 WSS 或 MOSS 环境吗?我认为添加的 PowerShell 脚本要么运行一次,要么作为计划任务添加,这将使您受益。
  • 这适用于 WSS。我不认为 PowerShell 脚本可以完成这项工作,因为我必须从事件接收器中执行删除。
  • 您在 ProcessBatchData 中面临什么问题?让我们知道这将是最简单的选择。

标签: sharepoint document-library


【解决方案1】:

我会坚持使用 ProcessBatchData 方法,也许这会有所帮助:

Vincent Rothwell 已经报道了这个 最好的: http://blog.thekid.me.uk/archive/2007/02/24/deleting-a-considerable-number-of-items-from-a-list-in-sharepoint.aspx

否则我不确定其他建议是否有效,因为 Foreach 循环不喜欢集合中的项目数随着每次删除而改变。

你可能最适合做一个反向 for 循环(我没有测试这段代码,只是一个例子):

for (int i = SPItems.Length - 1; i >= 0; i--)
{
    SPListItem item = SPItems[i];
    item.File.Delete();
}

【讨论】:

  • while(list.Items.Count>0){list.Items[list.Items.Count-1].File.Delete();}
  • ProcessBatchData() 方法快了几个数量级。
  • 我从来没有让 ProcessBatchData 正常工作。
  • 博文的链接已损坏。
【解决方案2】:

这不是删除项目的正确方法。 关注这里的帖子 http://praveenbattula.blogspot.com/2009/05/deleting-list-items-at-time-from-list.html

【讨论】:

    【解决方案3】:

    您只需浏览文档库中的所有文件。

    foreach(SPListItem item in SPContext.Current.Web.Lists["YourDocLibName"].Items)
    {
        //TODO: Verify that the file is not checked-out before deleting
        item.File.Delete();
    }
    

    从 API 对文件调用 delete 方法不会使用回收站。这是直接删除。您仍然需要验证该文件是否未被签出。

    这里有一些参考:

    【讨论】:

    • 太慢了。使用 ProcessBatchData()
    【解决方案4】:

    Powershell方式:

    function ProcessFolder {
        param($folderUrl)
        $folder = $web.GetFolder($folderUrl)
        foreach ($file in $folder.Files) {
            #Ensure destination directory
            $destinationfolder = $destination + "/" + $folder.Url 
            if (!(Test-Path -path $destinationfolder))
            {
                $dest = New-Item $destinationfolder -type directory 
            }
             #Delete file by deleting parent SPListItem
            $list.Items.DeleteItemById($file.Item.Id)
        }
    }
    
    #Delete root Files
    ProcessFolder($list.RootFolder.Url)
    
    #Delete files from Folders or Document Sets
    foreach ($folder in $list.Folders) {
        ProcessFolder($folder.Url)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 2020-09-17
      • 2012-04-18
      • 1970-01-01
      相关资源
      最近更新 更多