2

我需要获取文件夹大小并在报告(SSRS)上显示信息。我需要为许多数据库(循环!)执行此操作。这些数据库是网站的后端。有没有人这样做过?你能指点我一些样品或正确的方向吗?xp_filesize 之类的解决方案是否正确?帮助!

4

4 回答 4

2

查看问题和 Tomalak 的回复,我假设报告服务器将能够访问数据库中保存的文件夹:

首先设置查询以让您返回路径的结果集 - 我假设您对这部分没有任何问题。接下来,您需要在报告中添加自定义代码函数:http: //msdn.microsoft.com/en-us/library/ms155798.aspx - 此函数将文件夹路径作为参数,并传回文件夹的大小。如果您想在报告中嵌入代码,您必须在 VB.Net 中编写,或者您可以编写一个 DLL 并将其引入。

一个示例 VB.Net 代码块(请记住,您可能需要为对象添加 System.IO 前缀。)http://www.freevbcode.com/ShowCode.asp?ID=4287

Public Shared Function GetFolderSize(ByVal DirPath As String, _
   Optional IncludeSubFolders as Boolean = True) As Long

  Dim lngDirSize As Long
  Dim objFileInfo As FileInfo
  Dim objDir As DirectoryInfo = New DirectoryInfo(DirPath)
  Dim objSubFolder As DirectoryInfo

Try

'add length of each file
  For Each objFileInfo In objDir.GetFiles()
    lngDirSize += objFileInfo.Length
  Next

  'call recursively to get sub folders
  'if you don't want this set optional
  'parameter to false 
If IncludeSubFolders then
  For Each objSubFolder In objDir.GetDirectories()
    lngDirSize += GetFolderSize(objSubFolder.FullName)
  Next
End if

Catch Ex As Exception


End Try

   Return lngDirSize
End Function

现在,在您的报告中,在您的表格中,对于显示文件夹大小的单元格,您将拥有类似以下的表达式:

=Code.GetFolderSize(Fields!FolderPath.Value)

我怀疑这种方法对于手动查看的报告是否有效,但是对于小型结果集或通过电子邮件发送的预定报告,您可能会侥幸逃脱?

哦,这篇文章建议您“可能”在 RS 中使用 System.IO 遇到权限问题:http: //blogs.sqlxml.org/bryantlikes/pages/824.aspx

于 2008-10-09T11:32:21.767 回答
1

您能否澄清在您的场景中谁应该做什么?您希望 SQL Server 获取信息还是希望 Reporting Server 获取信息?

“文件夹大小”到底是什么意思?“一个文件夹,总结每个文件”足够还是需要递归?无论哪种方式,我都会使用一个小的自定义 .NET 函数,它使用System.IO.Directory它的亲戚。

于 2008-10-07T17:59:04.777 回答
1

我会考虑把它分成两部分,也许是一个 Windows 服务来扫描目录并将数据聚合到数据库中,然后像往常一样使用 SSRS 来报告数据库。

我建议这样做的原因是使用 master..xp_filesize 并且它与 SQL Server 服务开始使用的帐户相关,需要访问要扫描的路径。一旦这变成访问其他机器上的路径,我就会对它的安全隐患感到不太舒服。

希望这可以帮助

于 2008-10-28T11:20:56.393 回答
1

在 SSRS 中,您可以借助自定义数据扩展来做到这一点。您需要将数据源的路径作为您的文件夹名称,它将检索您的文件及其相关信息并显示

如需进一步参考和自定义 dll,请使用此 http://www.devx.com/dbzone/Article/31336/0/page/4

我之前已经这样做了。

注意:您必须对报表设计器和报表管理器配置文件进行相关更改。

于 2008-11-03T09:48:27.977 回答