65.9K
CodeProject 正在变化。 阅读更多。
Home

ZipTrack

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (28投票s)

2009年12月3日

CPOL

5分钟阅读

viewsIcon

63334

downloadIcon

796

一种管理所有下载的 zip 文件的全面方法。

ZipTrack - Main Screen

引言

多年来,我收集了不少代码和程序示例。问题是,有时我可能还记得我有一个如何做某事的例子,但我找不到它。此程序旨在扫描我下载的 zip 文件并解析其中的文档,然后将内容信息插入数据库,该数据库可进一步用于提供 RegEx 搜索。

为此,它为我提供了一种 Zip 库。因此,我可以为每个 zip 文件添加书签,这些书签会将我带回原始文章以获取 zip 存档。

版本 1.0

演示的技术和设计方法

  • SQL Express 2008 数据源
  • 自定义框架数据层
  • 强类型数据集
  • ICSharpCode.SharpZipLib
  • ICSharpCode.TextEditor
  • 创建型/工厂/代理/单例 - 设计模式
  • 自定义用户控件
  • 自定义 GUI 设计器
  • 所有者绘制控件

要求

以下是您需要执行的操作的循序渐进过程

  1. 请确保您的计算机上已安装 SQL Server 2008 [^]。
  2. 确保您拥有以下 DLL:ICSharpCode.SharpZipLib 和 ICSharpCode.TextEditor,来自 SharpDevelop [^](包含在文章下载中)。
  3. 在您自己的 SQL Server 实例上创建数据库。脚本可以在解决方案附带的“...\\Data\Create.dbArchive.sql”目录中找到。
  4. 更改 Host 类中的 InitializeClass 方法里的 ConnectionString 属性。
  5. 运行程序。示例网站包含在您在上一步中创建的新数据库中。
  6. 如果您想一次添加一个 zip 文件,请单击“新建存档”按钮。
  7. 如果您想一次添加多个 zip 存档,请单击工具栏中的“打开”按钮。
  8. 选择要与将要导入的文件关联的网站,然后单击“接受”按钮。
  9. 完成此操作后,单击“取消”关闭窗体。
  10. 通过从[网站视图]中选择合适的网站,您应该会看到找到的 zip 文件。
  11. [Zip 文件视图]中至少有一个 zip 文件后,您可以选择添加一个或多个书签。
  12. 当您在左侧选择一个 Zip 文件时,其内容将在右侧的[Zip 文件内容视图]中显示。
  13. [Zip 文件内容视图]中选择一个基于 ASCII 文本的文件,该文件的内容将显示在[*文件内容视图*]中。

ZipTrack - Main Screen

定义

让我们从定义此实用程序所使用的领域特定语言开始

  1. 存档 - 存档表示一个 Zip 文件(例如,HelloWorld.zip)。
  2. 书签 - 书签是存储在数据库中的 Internet 快捷方式,它链接回原始或支持的网页文章,并且可以被检索。
  3. 文档 - 文档是 zip 存档文件内的*任何*内容(即*.cs, *.txt, *.doc, *.dll, *.exe, *.vb 等...)。
  4. 网站 - 本程序广泛使用网站将每个下载的存档与原始来源相关联。

用法

uml

通常,大多数用户已经将多个文件下载到桌面 PC 上。我们要做的是创建这些文件的库,以便将来可以轻松查找。因此,ZipTrack 需要组织和管理这些文件。

分类

我经常在互联网上找到各种技巧/窍门/解决方案。我需要一种方法来分类我找到的内容以及在哪里找到的。我发现的最能完成这项工作的最佳方法是将所有文件放入以我下载的网站命名的单独目录中(例如,CodeProject等)。

Website Categories

分组

如果您像我一样,您会发现很多文件的时间跨度不止几天,甚至可能是几年。使用互联网上找到的列表框分组代码,我们可以按日期对存档进行分组,这与 Microsoft Outlook 按日期对电子邮件进行分组的方式非常相似。

Archive Grouping

搜索

这个程序最实用的部分可能是能够在不解压每个文件来检查其内容的情况下搜索 zip 存档。

Archive Grouping

数据层架构

随附了脚本文件,供您在自己的 SQL Server 实例上重新创建数据库。数据层由通用的可继承对象组成,这些对象便于数据检索和存储。数据层按任意顺序包含以下对象:

  • 模型 - 这些对象为任何派生的业务类提供基类。业务对象类继承自基类以共享通用功能和属性。
  • 业务对象 - 业务对象封装了与其表示的数据表相关的所有数据和业务行为。
  • 管理器类 - 此管理器类便于访问数据存储。所有数据都在此集中式存储库中捕获和提供。它充当创建设计模式,用于创建和检索具体的业务对象。
  • 数据处理程序 - DataHandler 类提供了一个一致的接口,用于访问许多不同来源和格式的数据。它使用 DataRequestEventHandlers 管理简单的数据请求、转换和相关操作。它提供了对可以操作数据的命令的访问。

基本模型示例

Namespace Common
    Public MustInherit Class Model

        Public MustOverride Property Name() As String

        Public MustOverride ReadOnly Property PrimaryID() As Integer

    End Class
End Namespace

关注点

在这个项目中,我发现一件很有趣的事情是,我需要一种方法来将快捷方式拖放到我的窗体上以帮助生成书签。但是,我需要一种方法来实现 Internet 快捷方式的 GetData 函数。

拖放

Private Sub BookmarksGrid1_DragDrop(ByVal sender As Object, _
            ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
    If e.Data.GetDataPresent("UniformResourceLocator", False) Then

        Dim data As Object = e.Data.GetData("UniformResourceLocator")

        Dim ms As MemoryStream = TryCast(data, MemoryStream)
        Dim bytes() As Byte = ms.ToArray()
        Dim encod As Encoding = Encoding.ASCII
        Dim LnkText As String = encod.GetString(bytes)

        Me.CreateNew(LnkText)

    ElseIf e.Data.GetDataPresent("FileNameW", False) Then

        '------------------------------------------------
        'You can drag and drop items from the desktop or Explorer onto the DataGridView
        '------------------------------------------------

        'Dim names As System.Array = _
        '     CType(e.Data.GetData("FileNameW", False), System.Array)
        'Dim LnkText As String = ResolveShellLink(CStr(names.GetValue(0)))

        'Me.CreateNew(LnkText)

    End If
End Sub

ResolveShellLink

在我的搜索过程中,我还找到了一种检索桌面快捷方式到文件的链接信息的方法。现在,您可以将项目从桌面或 Explorer 拖放到 DataGridView 上。请注意,您将获得一个文件名数组,因为您可以选择多个文件并删除它们;我只使用了第一个项目。要使用此功能,“添加引用”到 c:\windows\system32\shell32.dll

Private Function ResolveShellLink(ByVal name As String) As String
    ' --- Find the target for a short-cut
    If String.Compare(Path.GetExtension(name), ".lnk", True) <> 0 Then Return name
    Dim shl As New Shell32.Shell
    Dim dir As Shell32.Folder = shl.NameSpace(Path.GetDirectoryName(name))
    Dim itm As Shell32.FolderItem = dir.Items().Item(Path.GetFileName(name))
    Dim lnk As Shell32.ShellLinkObject = CType(itm.GetLink, Shell32.ShellLinkObject)
    Return lnk.Path
End Function

待办事项

尽管在此未实现,但我认为将来可能会实现文件快捷方式方法。也许还会实现一种将新网站添加到数据库的方法。祝您编码愉快!

© . All rights reserved.