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

CD 刻录机 - 控制台版本

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.72/5 (8投票s)

2008 年 7 月 5 日

CPOL

5分钟阅读

viewsIcon

29763

downloadIcon

1215

一个命令行程序,将文本文件中指定的文件夹和文件备份到 CD-W

Invoking CDBackup passing CopyArguments.arg, the program writes Adding file names...Adding file contents...Done, then exits

引言

本文描述的第一个程序 CDBackup,会创建一个 CD-W 磁盘,其中包含命令行中指定的控制文件中列出的文件目录树。

背景

CDBackup 应用程序是 CodeProject 文章 "CD刻录机"(作者:Akin Ocal)中提出的想法的直接扩展。

Using the Code

在我们家,我们将计算机上的重要数据备份到 CD-W 上,并存放在银行保险箱里。手动选择要备份的文件和文件夹很容易出错。CDBackup 程序允许我创建和维护一个要写入 CD-W 的文件和文件夹列表。这个列表文件通过命令行传递给 CDBackup 应用程序。我在桌面创建了一个快捷方式,用于调用该程序并传递列表文件。备份过程就是放入空白 CD 并点击图标(如果不是因为... 但这一点我稍后会谈到)。

包含要复制到 CD-W 的文件规格的列表文件具有特定格式。允许使用注释。支持三种注释形式。这些形式模仿了 C 语言、C++ 语言和 DOS 批处理文件的“语言”。

  • 注释可以以 /* 开始,以 */ 结束,可以跨越多行(或不跨越)(C 风格)。
  • 注释可以以 // 开始,并在当前行末尾结束(C++ 风格)。
  • 注释可以以 :: 开始,并在当前行末尾结束(DOS 批处理风格)。

大多数情况下,我想备份某个特定点以下的所有文件。但也有一些文件我想单独复制。所以有两个实际的复制命令。

Copy pattern source destination
RecursiveCopy pattern source destination

例如,要将文件 D:\Utils\MakeList 复制到 CD-W 的根目录,命令将是

Copy MakeList "D:\Utils" \

要将 D:\Projects\Templates\FileOpenDialog\MultiSelect 的所有内容复制到 CD-W 上的 Templates\FileOpenDialog\MultiSelect 文件夹,命令将是

RecursiveCopy *.* "D:\Projects\Templates\FileOpenDialog\MultiSelect" 
                  "Templates\FileOpenDialog\MultiSelect"

一个完整的参数文件可能如下所示

/* This
is
a comment */

// This is a comment

:: This is a comment


Copy MakeList "D:\Utils" \
RecursiveCopy *.* "D:\Projects\Templates\FileOpenDialog\MultiSelect" 
                  "Templates\FileOpenDialog\MultiSelect"

关注点

仓促开始工作时,我忽略了一个小问题,结果却给我带来了麻烦。那个问题是,(我开始时参考的 Akin Ocal 的文章 "CD刻录机" 中使用的)StgCreateDocfile 创建的结构化存储的文件名限制为 31 个字符。程序运行后,我发现我们需要备份大量文件名超过 31 个字符的文件。所以最后我放弃了这个项目。

如果您在 MSDN 或其他 Microsoft 文档中查找 StgCreateDocfile,您会发现(至少我发现了)以下内容

"注意:所有 Microsoft® Windows® 2000 和 Windows XP 应用程序都应该使用新的函数 StgCreateStorageEx,而不是 StgCreateDocfile。"

我尝试使用 StgCreateStorageEx,但遇到了各种问题,然后放弃了,因为我相信我找到了一个更简单的备份方法。

在我疯狂地搜索解决方案以解决 StgCreateDocfile 施加的 31 个字符限制时,我偶然发现了一个关于 Windows XP 用于写入 CD-W 的文件队列的缓存位置的引用。该位置是

drive-letter:\Documents and Settings\username\Local Settings\
                   Application Data\Microsoft\CD Burning

我意识到我只需要 CDBackup 的第一部分——将要写入 CD 的文件进行排序的部分。我将新版本命名为 CDQueueForBackup。

我用代码替换了将每个文件放入结构化存储的代码,而是将文件复制到 drive-letter:\Documents and Settings\username\Local Settings\Application Data\Microsoft\CD Burning 下的相应位置,这样我就基本完成了。

结果是,当 Microsoft 决定在当时可用的基本 CD 数据格式 (ISO 9660) 之上创建 CD 格式 (Joliet) 时,Microsoft 决定将 CD 上的文件名限制为 64 个字符。至少 64 个字符的限制比我最初实现中施加的 31 个字符限制要好。

所以我添加了一个检查,用于检查文件名长度超过 64 个字符的文件,然后我就完成了。

现在顺序是

  • 点击备份图标。
  • 备份图标运行 CDQueueForBackup,并将列表文件作为命令行参数。
  • CDQueueForBackup 将指定的文件复制到 drive-letter:\Documents and Settings\username\Local Settings\Application Data\Microsoft\CD Burning 下,创建任何必需的文件夹。
  • 如果任何文件的名称超过 64 个字符的长度,CDQueueForBackup 会显示路径和文件名。

CDQueueForBackup lists files whose names exceed 64 characters in length

(如果 DOS 框的窗口设置为显示更多列,CDQueueForBackup 的诊断输出会更容易阅读。为了满足 CodeProject 的格式要求,我在上面截图中显示的屏幕截图时,不得不缩小 DOS 框的显示宽度。)

然后用户可以自由地使用 Windows XP 内置的 CD 刻录功能(从上下文菜单中选择“将这些文件写入 CD”)或清理队列而不刻录(从上下文菜单中选择“删除临时文件”)。

The context menu for the CD drive allows 'Write these files to CD' and 'Delete temporary files' options

由于只有我们家使用这个程序,我没有担心处理过长文件名的方法。当我们第一次运行程序时,程序列出了四个过长的文件。我们简单地重命名了这些文件,清理了队列,重新运行了 CDQueueForBackup,然后刻录了第一张 CD。下次(除非我们在此期间创建了另一个有问题的文件),应该就没有问题了。

CDQueueForBackup displays a dot (period) for every file it queues

CDQueueForBackup 为每个排队的文件的显示一个点。

Windows XP displays a baloon alert when files are copied to the CD Queue location

当 Windows XP 检测到文件正在被复制到 CD 刻录队列区域时,会显示上面的气球提示。

© . All rights reserved.