サイズの大きい.dwgファイルを扱う際、完全保存には時間がかかることがあります。Teighaには、.dwgファイル用の新しい増分ファイル保存機能があり、変更されたデータのみを保存するため、多くの変更を含まない大きなファイルの場合、完全保存よりも高速です。
Teighaは、増分ファイル保存を実行するための2つの方法を提供します。
void OdDbDatabase::save(const OdString& filename, bool saveThumbnailImage = false);
void OdDbDatabase::save(OdStreamBuf* pStreamBuf, bool saveThumbnailImage = false);
絶対パスを使用した増分保存
ほとんどの場合、現在の.dwgデータベースは、最初のパラメータとしてパスを受け取るOdDbDatabase::save()メソッドを使用して、増分的に保存できます。呼び出しは次のとおりです。
pDb->save(targetPath);
最初のパラメータはターゲットファイルの絶対パスです。このパスは、保存したいデータベースから取得できる別のパスと等しい必要があります。絶対パスが一致しない場合、メソッドは完全保存を実行します。2番目のパラメータは、サムネイル画像をファイルに保存するかどうかを制御します。
ファイルは、以下の条件でのみ増分的に保存されます。
- ファイルが.dwgファイルであること
- ターゲットファイルの絶対パスが、上記のように元のパスと等しいこと
- ファイルが以前に保存されていること
- ファイルのデータベースバージョンがOdDb::kDHL_CURRENT(最新フォーマット)と等しいこと
また、メソッドの動作は、ISAVEPERCENTシステム変数の値に依存します。ISAVEPERCENT値は、ファイル内で許容される無駄なスペースの割合です。ISAVEPERCENTが0に等しい場合、メソッドは完全保存を実行します。それ以外の場合は、次のように動作します。
- 無駄なスペースの実際の割合がISAVEPERCENT以下の場合、メソッドは増分ファイル保存を実行します。
- 無駄なスペースの実際の割合がISAVEPERCENTより大きい場合、メソッドは完全保存を実行します。
SAVEコマンドを使用してファイル保存操作を実行する場合は、OdDbDatabase::save(…)メソッドを使用することをお勧めします。ただし、SAVEASの場合は、OdDbDatabase::writeFile(…)メソッドを使用する必要があります。独自のアプリケーションを実装する際に、対応する呼び出しを分離できます。
増分ファイル保存の使用方法については、OdaMfcAppのサンプルアプリケーションも参照してください: Core\Examples\win\OdaMfcApp\OdaMfcAppDoc.cpp
OdStreamBufを使用した増分保存
データベースを一時ファイルに増分的に保存したい場合は、OdStreamBufへのポインタを受け取るOdDbDatabase::save(…)メソッドの2番目のバージョンを使用する必要があります。
このメソッドは、元のファイルのコピーを使用してファイルをより安全に保存するために必要になる場合があります。
たとえば、次の手順でファイルを処理できます。
ファイル処理が開始されたら、元のファイルを一時ファイルにコピーします。
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);
一時ファイルが不要になったら、削除できます。