[返回博客](/cn/blog) # 对 .dwg 文件使用增量保存

Iakov Shamrai 四月 13, 2017 [\#performance](/cn/blog/tag/performance) [\#Example](/cn/blog/tag/example)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

处理大型 .dwg 文件时，有时完全保存会很慢。Teigha 为 .dwg 文件提供了一个新的增量文件保存功能，它只保存修改过的数据，这对于没有大量修改的大型文件来说比完全保存更快。

Teigha 提供了两种执行增量文件保存的方法：

```
void OdDbDatabase::save(const OdString& filename, bool saveThumbnailImage = false);
void OdDbDatabase::save(OdStreamBuf* pStreamBuf, bool saveThumbnailImage = false);
```

### 使用绝对路径进行增量保存

在大多数情况下，您可以使用 OdDbDatabase::save() 方法增量保存当前的 .dwg 数据库，该方法将路径作为第一个参数。调用如下：

```
pDb->save(targetPath);
```

第一个参数是目标文件的绝对路径。该路径应与您要保存的数据库中获取的另一个路径相同。如果绝对路径不匹配，该方法将执行完全保存。第二个参数控制缩略图图像是否保存到文件中。

文件仅在以下条件下增量保存：

- 文件是 .dwg 文件
- 目标文件的绝对路径与上述原始路径相同
- 文件以前已保存
- 文件的数据库版本等于 OdDb::kDHL\_CURRENT（最新格式）

此外，该方法的行为取决于 ISAVEPERCENT 系统变量的值。ISAVEPERCENT 值是文件中允许的浪费空间的百分比。如果 ISAVEPERCENT 等于 0，该方法将执行完全保存。否则，它按以下方式工作：

- 如果实际浪费空间的百分比小于或等于 ISAVEPERCENT，该方法将执行增量文件保存。
- 如果实际浪费空间的百分比大于 ISAVEPERCENT，该方法将执行完全保存。

建议在使用 SAVE 命令执行文件保存操作时使用 OdDbDatabase::save(…) 方法。但对于 SAVEAS，您应该使用 OdDbDatabase::writeFile(…) 方法。您可以在实现自己的应用程序时分离相应的调用。

另请参阅 OdaMfcApp 示例应用程序，了解如何使用增量文件保存：**Core\\Examples\\win\\OdaMfcApp\\OdaMfcAppDoc.cpp**

### 使用 OdStreamBuf 进行增量保存

如果您想将数据库增量保存到临时文件，您应该使用 OdDbDatabase::save(…) 方法的第二个版本，该版本接受指向 OdStreamBuf 的指针。

您可能需要此方法通过使用原始文件的副本更安全地保存文件。

例如，您可以使用以下步骤处理文件。

当文件处理开始时，将原始文件复制到临时文件：

```
OdString cmdString("copy \"" + targetPath + "\" \"" + pathToTemp + "\"");
system(cmdString);
```

要将当前打开的数据库（从原始文件读取）保存到您创建的作为副本的临时文件，请打开临时文件的流以进行写入。

然后调用 OdDbDatabase::save() 方法，将指向流的指针作为第一个参数：

```
{
OdStreamBufPtr pTempFile = odSystemServices()->createFile(pathToTemp, Oda::kFileWrite, Oda::kShareDenyReadWrite, Oda::kOpenAlways);

pDb->save(pTempFile, true);
}
```

成功保存后，请确保临时文件流已关闭，然后如果需要，您可以用包含数据库实际状态的临时文件替换原始文件：

```
cmdString = "copy \"" + pathToTemp + "\" \"" + targetPath + "\"";
system(cmdString);
```

临时文件不再需要后，您可以将其删除。

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
