如何从blob / filestream中识别文件类型?

时间:2009-06-16 22:09:35

标签: .net sql-server file blob filestream

我们在lonnng时间之前购买了一个“现成的”应用程序,它能够将文件存储为SQL Server中的blob。我们注意到,由于一个部门更频繁地使用此blob字段,因此在过去六个月内数据库的大小增加了一倍多。结果,应用程序变得非常缓慢。

我的任务是从数据库中删除blob字段并将文件保存到实际的文件系统中。不幸的是,应用程序不存储数据库中文件类型的内容。虽然我可以读取数据库中存在的文件,但我不知道将文件保存为什么扩展名。应用程序的支持服务台不再支持此版本的软件,也不会与我们讨论提取数据的问题。很遗憾,我们无权访问其源代码。

任何建议都将不胜感激!提前谢谢!

7 个答案:

答案 0 :(得分:7)

您可以查看前几个字节并找出最常见的文件类型

http://www.garykessler.net/library/file_sigs.html

答案 1 :(得分:2)

请勿将其保存为任何类型。将其另存为没有扩展名的文件。如果您不知道它是什么,请不要伪造它。如果保存它的应用程序请求它,则从文件系统返回它的方式与从数据库返回的方式相同;作为二进制数据。数据库不关心二进制对象是什么类型的数据;你也不应该。

答案 2 :(得分:2)

您可以尝试使用TriD http://mark0.net/soft-trid-e.html

它将扫描文件并尝试确定扩展名。

答案 3 :(得分:1)

您可以在UrlMon.dll中使用FindMimeFromData()函数(使用pinvoke)。

请参阅此功能的this page for an example和此MSDN page for the documentation

答案 4 :(得分:0)

您如何知道这些信息是人类可读的?

文件扩展名用于关联特定软件以打开文件,以便当您双击.txt文件时,notepad.exe会处理它。

如果您只是为了卸载数据库而将它们写入文件系统,那么就不需要任何特定的扩展。如果要将软件与其关联,请使用相应的扩展名

答案 5 :(得分:0)

另一种选择是对数据库进行物理分区。您可以将包含blob字段的表存储在可以存储在不同硬盘/主轴上的其他数据库文件中。包含blob表的磁盘可以通过将其设置为RAID 0或RAID 10来进一步优化。

这可以加快速度。此外,这种方法消除了更改应用程序逻辑的需要。

答案 6 :(得分:0)

用你的话说“......我的任务......” - 你确定这不是一个可以通过对数据库进行一些优化来解决的问题吗?如果您想要尽可能避免使用源代码并且没有支持的遗留应用程序,那么就应该这样做。

所以,看看这里的问题 - 应用程序的缓慢。那么为什么它会变慢?数据库索引无法解决的问题?

如果必须将BLOB提取到文件系统,那么为什么文件格式相关?当然,该应用程序旨在对数据库进行查询以获取文件 - 如何将BLOB提取到文件系统可以帮助您?

除此之外 - 我通常使用Unix file命令通过幻数识别文件。