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

拖放存档器小工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.06/5 (18投票s)

2007年2月10日

9分钟阅读

viewsIcon

76375

downloadIcon

1576

该小工具允许使用几乎任何格式压缩拖放到侧边栏的文件和文件夹。

Sample image

引言

压缩文件是我们想要共享文档时最常进行的操作之一。问题在于,对于大多数压缩程序来说,整理要压缩的文件需要花费很长时间,然后您还需要花费很长时间来选择最喜欢的压缩选项。这款 Windows Vista 侧边栏小工具试图解决这些问题。在其特性中,最有趣的是:

  • 使用几乎任何命令行存档器(您可能已经拥有一个,它随您的图形界面存档器一同提供)
  • 可以使用命令行应用程序支持的任何格式进行压缩(已在 WinZip、WinRar、WinAce 上测试)
  • 如果压缩软件安装在标准位置,则无需任何设置
  • 可通过侧边栏设置页面完全自定义,以用于任何压缩软件
  • 三个配置文件,可轻松快速地在压缩格式、设置和后端之间切换
  • 简单的多线程处理,带有进度指示器

从用户角度来看

请至少简要阅读以下文本,以便您了解用户如何与此小工具进行交互。

  1. 这个小工具有什么作用?

    此小工具允许您将文件和文件夹拖放到其侧边栏空间,然后将文件压缩后拖出。它通过使用您正在使用的存档器来实现。它已在 WinAce、WinZip 和 WinRar 上进行了测试,并且应该能与任何提供命令行实用程序(控制台应用程序)的其他存档器一起工作。

  2. 如何安装?

    下载演示项目 zip 文件。然后解压缩并运行包含的Setup.msi文件。您需要管理员权限才能正确安装所需的库。然后,您可以运行另一个名为Zipper.gadget的文件来安装该产品。

  3. 我该如何使用它?

    • 设置配置文件

      该小工具提供 3 个用于压缩文件的配置文件。每个配置文件都可以使用不同的存档实用程序,或者使用具有不同参数的同一实用程序。要设置您自己的存档器,请查看制造商网站,了解它是否附带控制台应用程序。如果附带,则必须在小工具设置中输入该应用程序的路径。然后,查看该应用程序的文档,了解调用它的合适参数,并在您输入应用程序名称的配置文件的“参数”文本框中输入这些参数。

      到目前为止,该小工具已在 WinRar、WinZip 和 WinAce 上进行了测试,并为这些应用程序提供了默认配置文件。

      • 我使用 WinRar

        如果您已安装在默认位置,则无需编辑任何设置。否则,请在小工具的设置对话框中输入此信息。

        PATH : installation path (ex: C:\Program Files\WinRAR\rar.exe )
        ARGS : a -ep1
        EXTENSION : rar
        

        注意:请查阅控制台应用程序帮助以调整您的压缩级别。为兼容起见,压缩将保留在默认级别。

      • 我使用 WinAce

        对于 WinAce,控制台应用程序是单独下载的。将从http://www.winace.com/获得的软件包中的文件解压缩到 c:\Downloads,这样就不需要任何设置。否则,请执行以下操作:

        注意:由于您运行的是 Windows Vista,因此提取的文件中只有ace32.exe对您有效。

        PATH : path to ace32.exe
        ARGS : a -r
        EXTENSION : ace

        注意:请查阅控制台应用程序帮助以调整您的压缩级别。为兼容起见,压缩将保留在默认级别。

      • 我使用 WinZip

        要使用 WinZip,您必须使用专业版(此版本需要付费)。将其安装到默认路径,则无需编辑任何设置,但您必须安装免费的附加组件,该附加组件提供来自http://www.winzip.com/prodpagecl.htm的控制台功能。

        PATH : installation path of wzzip.exe
        ARGS : -rp
        EXTENSION : zip

        注意:由于您运行的是 Windows Vista,并且 WinZip 的控制台应用程序帮助为.hlp格式(Vista 不支持),因此它将无法工作。如果您想进一步调整压缩参数,请使用此链接

      • 我使用其他存档器:我建议您使用7Zip 命令行实用程序,它很小且效果很好。

    • 压缩文件

      将所需文件和文件夹从资源管理器拖放到小工具窗口。要删除任何文件,只需双击它即可。完成后,单击带有绿色箭头的那个大按钮。应该会出现一个进度条。如果未出现,请检查窗口顶部的组合框。如果它显示“禁用”,则表示您尚未正确设置存档器。请尝试其他配置文件。当进度条停止时,它应该会被一个显示打包图像的大图替换。将其拖到您想要放置压缩文件的地方。

  4. 已知限制

    根据您的存档器,文件名中的空格可能不受支持。

开发体验

ActiveX 与 XBAP

该小工具围绕一个使用 Visual Studio 2005 和 WinForms 2.0 用 C# 开发的 ActiveX 组件构建。选择不使用 WPF 和 XBAP 是因为 XBAP 无法与它所处的 HTML 和 JavaScript 进行交互。因此,使用小工具设置来自定义小工具的行为是不可能的。相反,ActiveX 控件不仅易于用 C# 构建,而且可以轻松地进行交互。
与 JavaScript。

在 C# 中创建 ActiveX 控件需要两个步骤:

  1. 生成一个 GUID - 您 Usercontrol 类的唯一标识符,并将其作为属性放在类定义前面,如下所示:

    [Guid("1FAC78B4-B53D-11DB-A52E-328155D89593")]
    [ComVisible(true)]
    public partial class UserControl1 : UserControl
        {...

    生成 GUID 的最简单方法是使用此网页

    还要注意用于使类对 COM 世界可见的 ComVisible 属性。

  2. 将 VS IDE 设置为允许 COM 对象构建。转到项目设置 -> 生成,然后选中“Register for COM Interop”(注册 COM 互操作)。

内置压缩与命令行集成

之所以决定使用第三方压缩工具,是因为通过这种方法,该小工具可以满足所有用户的需求。简单、不太懂技术的使用者会欣赏默认配置文件,并且无需编辑设置;而经验丰富的用户将享受调整参数以根据自己的喜好定制压缩的好处。这样,就没有人会被落下。

从 C# 应用程序使用命令行工具的描述,请参见我之前的关于小工具的文章,即CommandPrompt。从中了解如何完成这项工作。在此项目中,所有必需的代码都封装在 Process 函数中。此函数接受文件名和参数,并启动命令行压缩实用程序的进程。这将生成一个文件 - 存档 - 在当前用户的temp文件夹中。要移动此文件,我们使用拖放。

拖放

拖放操作在 C# 中很容易实现,尽管它看起来很复杂。从我们的程序中拖出文件是最简单的,所以我们将从这里开始。我想要一个图像来表示结果,因此我使用了一个只有一项的 ListView 控件,并为其附加了一个来自 imageSource 的图像,如下所示:

ListViewItem it=new ListViewItem();
it.ImageIndex=0;
lstResult.View = View.LargeIcon;
lstResult.Scrollable = false;

lstResult.SmallImageList = imageList1;
lstResult.LargeImageList = imageList1;
lstResult.Items.Add(it); 

然后,要执行实际的从 listView 中拖出操作,我们附加一个事件处理程序到 ItemDrag 事件:

void lstResult_ItemDrag(object sender, ItemDragEventArgs e)
{
    string[] files = new String[1];
    files[0] =outFile;
    DoDragDrop(new DataObject(DataFormats.FileDrop, files),
                DragDropEffects.Copy | DragDropEffects.Move);
}

如您所见,DoDragDrop 是这里唯一未知的函数。

要将文件从资源管理器拖到我们的程序,我们必须处理两个事件:DragEnterDragDrop。当用户将文件拖放到我们的对象上时,会引发 DragEnter 事件,用于显示禁止图标,如果我们拖动了文件或文件夹以外的内容。当用户在对象上释放文件时,则使用 DragDrop 事件。代码非常简单,如下所示:

void lstFiles_DragDrop(object sender, DragEventArgs e)
        {
            try
            {
                Array a = (Array)e.Data.GetData(DataFormats.FileDrop);
                if (a != null)
                {
                    // Extract string from first array element
                    // (ignore all files except first 
            // if number of files are dropped).
                    string s = a.GetValue(0).ToString();

                    if (!lstFiles.Items.Contains(s))
                    {
                        string filename = System.IO.Path.GetFileName(s);
                        lstFiles.Items.Add(filename);
                        filePaths.Add(s);
                    }
                }
                changeState(0);
            }
            catch (Exception ex)
            {... 

void lstFiles_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
        e.Effect = DragDropEffects.Copy;
    else
        e.Effect = DragDropEffects.None;
}

总体业务逻辑设计

该小工具被设计为一个具有三个状态的有限状态机 (FSM)。

  • 0 - 等待用户添加文件
  • 1 - 正在处理(将文件添加到存档器)
  • 2 - 等待用户将结果拖出小工具

状态之间的可能转换发生在文件被删除(x-> 0)、文件被添加(x->0)、选择另一个配置文件(x->0)时。

这些状态反映在界面上,因为有些对象只在某些状态下出现,例如 progressBar(仅在状态 2 中)或存档图像(仅在状态 3 中)。

添加小工具设置

为了实现与 Windows Vista 小工具指南一致的用户界面,设置应该使用小工具 API 创建。因此,我需要记住的设置总共有 9 个,每个配置文件 3 个(路径、参数和存档扩展名)。有趣的是,选择本地硬盘驱动器字段的自然选项——一个 input="file" textBox——在小工具构建情况下不起作用,因为它不允许通过脚本设置值,而这正是我们希望看到已输入的设置时应该发生的情况。我放弃了这种方法,采用了另一种:我将此函数附加到每个路径 textBox 左侧的“浏览”按钮。

function setPath1()
{
    var oItem = System.Shell.chooseFile(true, "All Files:*.*::", "", "");
    path1.value = oItem.path;
}

注意:初始(默认)设置在设置页面中不可见。它们内置于 ActiveX 控件本身,并被设置页面中的设置所覆盖。如果设置页面中指定的文件未找到,则配置文件显示为“DISABLED”(禁用)。ActiveX 中的默认设置包含提供了更大的健壮性(即使 settings.html 文件丢失或机器上运行的程序出现 JavaScript 问题,仍然可以工作)和更高的灵活性(可以将 ActiveX 包含在独立的应用程序中而无需任何修改)。

关于使用的词汇的注释

一些有知识的用户可能会注意到,在本文中,我互换使用“compress”(压缩)和“archive”(存档)这两个词。技术上来说,这是不正确的。

“存档”是指将一个或多个文件合并成一个单独的实体。经典的例子是 Linux 工具 Tar(最初是“Tape ARchiver”)。存档并不一定意味着生成的文件比其组件的总和小。

“压缩”是指使用更少的比特编码信息的过程。最广泛使用的压缩格式是 ZIP。

然而,在本文中,为了变化,我决定互换使用这两个术语。

参考文献

特别说明

RAR 和 ZIP 的两个图标是在征得其作者的许可后使用的。

© . All rights reserved.