mht文件

本文介绍了解决MHT文件关联丢失的问题,通过修改注册表设置重新关联MHT文件与相应应用程序,使MHT文件能够正常打开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  平时保存一些资料,习惯于保存为mht格式,既有文字,又有图片,比较方便.

  今天本来想更改打开方式,可是不注意将文件类型中的关联删掉了.搞得自己打不开,郁闷!

  搜索了一下,原来mht文件是类似于邮件方式存储的文档,扩展名改为eml,居然可以使用oe打开.可是,用IE还是无法正确打开!

  无奈,只好找另外一台可以打开的机器,搜索注册表,将mht和mhtml的文件类型注册表内容导出来,到我的本子上双击导入,才可以正常打开.

  如果哪位同学遇到类似问题,可以将下面内容复制到文本文件中,并将文件扩展名改为reg,双击导入即可.

  (适用于windows XP SP3)

     附件/Files/z494627/mht_reg.txt

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.mht]
@="360seURL"
"Content Type"="message/rfc822"

[HKEY_CLASSES_ROOT\.mht\OpenWithList]

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Excel]

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Excel\shell]

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Excel\shell\edit]
@="打开(&O)"

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Excel\shell\edit\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE\" /e"
"command"=hex(7):26,00,69,00,67,00,41,00,56,00,6e,00,2d,00,7d,00,66,00,28,00,\
  5a,00,58,00,66,00,65,00,41,00,52,00,36,00,2e,00,6a,00,69,00,45,00,58,00,43,\
  00,45,00,4c,00,46,00,69,00,6c,00,65,00,73,00,3e,00,21,00,44,00,65,00,40,00,\
  5d,00,56,00,7a,00,28,00,72,00,3d,00,66,00,60,00,31,00,6c,00,66,00,71,00,60,\
  00,3f,00,52,00,26,00,20,00,2f,00,65,00,00,00,00,00

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Excel\shell\edit\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Excel\shell\edit\ddeexec\application]
@="Excel"

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Excel\shell\edit\ddeexec\topic]
@="system"

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Word]

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Word\shell]

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Word\shell\edit]
@="打开(&O)"

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Word\shell\edit\command]
@="\"C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE\" /n /dde"
"command"=hex(7):26,00,69,00,67,00,41,00,56,00,6e,00,2d,00,7d,00,66,00,28,00,\
  5a,00,58,00,66,00,65,00,41,00,52,00,36,00,2e,00,6a,00,69,00,57,00,4f,00,52,\
  00,44,00,46,00,69,00,6c,00,65,00,73,00,3e,00,50,00,60,00,6f,00,73,00,2c,00,\
  31,00,40,00,53,00,57,00,3d,00,50,00,37,00,76,00,36,00,47,00,50,00,6c,00,5d,\
  00,58,00,68,00,20,00,2f,00,6e,00,20,00,2f,00,64,00,64,00,65,00,00,00,00,00

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Word\shell\edit\ddeexec]
@="[REM _DDE_Direct][FileOpen(\"%1\")]"

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Word\shell\edit\ddeexec\Application]
@="WinWord"

[HKEY_CLASSES_ROOT\.mht\OpenWithList\Microsoft Office Word\shell\edit\ddeexec\Topic]
@="System"

 

 

转载于:https://www.cnblogs.com/z494627/archive/2011/02/08/1949938.html

<think>解析MHT文件MHTML)涉及处理多部分相关的MIME内容。MHT文件通常包含一个主HTML文档和多个内联资源(如图片、CSS等),所有内容通过MIME边界分隔。步骤:1.读取MHT文件内容(通常为文本,但可能包含二进制资源)2.解析MIME头部,获取边界字符串3.根据边界分割整个文件内容4.解析每个部分,提取内容类型、内容位置和实际数据注意:MHT文件通常使用“multipart/related”类型,并且边界字符串在Content-Type头中指定。我们将使用Qt来实现,因为问题中出现了Qt相关的代码。但请注意,MHT解析不一定要用Qt,这里为了与之前上下文一致。实现方案:1.读取文件内容2.解析主Content-Type头,获取边界字符串3.分割各部分4.对每个部分,解析其头部和主体由于MHT文件可能很大,我们需要注意性能。但这里我们假设文件可以一次性读入内存。代码示例:</think>### 解析 MHT 文件的完整解决方案 MHT (MHTML) 文件是网页存档格式,包含 HTML 内容、图像、CSS 等资源,使用 MIME 多部分格式存储。以下是使用 C++/Qt 解析 MHT 文件的完整方案: #### 核心解析代码 ```cpp #include <QFile> #include <QTextStream> #include <QRegularExpression> #include <QMimeDatabase> #include <QMimeMultipart> #include <QDebug> bool parseMhtFile(const QString& filePath) { // 1. 读取文件内容 QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { qWarning() << "Failed to open file:" << filePath; return false; } QByteArray fileContent = file.readAll(); file.close(); // 2. 提取 MIME 边界 QRegularExpression boundaryRegex("Content-Type: multipart/related;\\s*boundary=\"([^\"]+)\""); QRegularExpressionMatch match = boundaryRegex.match(fileContent); if (!match.hasMatch()) { qWarning() << "MIME boundary not found"; return false; } QString boundary = "--" + match.captured(1); QByteArray boundaryBytes = boundary.toUtf8(); // 使用 UTF-8 编码 // 3. 使用 Qt MIME 解析器 QMimeDatabase mimeDb; QMimeMultipart multipart(mimeDb.mimeTypeForData(fileContent).name()); if (!multipart.isValid()) { qWarning() << "Invalid MIME structure"; return false; } // 4. 解析各部分内容 for (const auto& part : multipart.parts()) { if (!part.isBodyAvailable()) continue; // 获取内容位置 (Content-Location) QString contentLocation; if (part.hasHeader("Content-Location")) { contentLocation = part.header("Content-Location"); } // 获取内容类型 QString contentType = part.contentType(); // 处理内容体 QByteArray bodyData = part.body(); // 根据类型处理内容 if (contentType.startsWith("text/html")) { qDebug() << "HTML content:" << contentLocation; // 保存 HTML 文件或进一步处理 } else if (contentType.startsWith("image/")) { qDebug() << "Image resource:" << contentLocation << "Size:" << bodyData.size() << "bytes"; // 保存图像文件 } else if (contentType == "text/css") { qDebug() << "CSS stylesheet:" << contentLocation; // 保存 CSS 文件 } } return true; } // 使用示例 int main() { parseMhtFile("example.mht"); return 0; } ``` #### 关键组件解析 1. **文件读取** - 使用 `QFile` 读取整个文件到 `QByteArray` - 处理文件打开失败的情况 2. **边界提取** - 正则表达式匹配 `Content-Type` 头部获取边界 - 边界格式:`multipart/related; boundary="----=_NextPart_..."` 3. **MIME 解析** - 使用 Qt 内置的 `QMimeMultipart` 解析多部分结构 - 自动处理嵌套 MIME 部分和编码问题 4. **内容处理** - 通过 `Content-Location` 获取资源路径 - 根据 `Content-Type` 分发处理: - `text/html`: 主 HTML 文档 - `image/*`: 图片资源 - `text/css`: 样式表 - `application/x-javascript`: JavaScript 文件 #### 高级功能扩展 **资源提取与重建目录结构** ```cpp void extractResource(const QMimePart& part, const QString& baseDir) { QString location = part.header("Content-Location"); if (location.isEmpty()) return; QFileInfo fileInfo(location); QString fullPath = baseDir + "/" + fileInfo.fileName(); QFile output(fullPath); if (output.open(QIODevice::WriteOnly)) { output.write(part.body()); output.close(); } } ``` **字符编码处理** ```cpp QString decodeTextContent(const QByteArray& data, const QString& charset) { QTextCodec* codec = QTextCodec::codecForName(charset.toLatin1()); return codec ? codec->toUnicode(data) : QString::fromUtf8(data); } ``` #### 注意事项 1. **编码问题** - MHT 可能使用多种编码(Latin-1, UTF-8, Windows-1252) - 使用 `QTextCodec` 根据 `charset` 参数转换文本内容 2. **二进制资源** - 图片、字体等资源需原样保存 - 避免对非文本内容进行编码转换 3. **相对路径** - `Content-Location` 可能是相对路径 - 需要重建原始目录结构 4. **大型文件** - 对于大文件,使用流式解析 - 避免一次性加载整个文件到内存 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值