1

一時フォルダーに sqlite データベースを作成しています。今、そのファイルを別のフォルダーにコピーしたいと思います。sqlite データベース ファイルの名前を変更する sqlite コマンドはありますか?

C++ で名前変更関数を使用しようとしましたが、エラー 18 が返されます。エラー 18 は、「名前 newname を含むディレクトリは、ファイルと同じファイル システム上にある必要があります (名前 oldname で示される)」を意味します。

誰かがこれを行うためのより良い方法を提案できますか?

4

2 に答える 2

5

正しいファイルシステムで一時ディレクトリを使用してください!

まず、sqlite データベースは単なるファイルです。次の条件を満たしていれば、好きなように移動またはコピーできます。

  • 前回は正しく閉じられたので、ジャーナルにロールバックするものはありません
  • 先行書き込みログ タイプのジャーナルを使用する場合、完全にチェックポイントが設定されます。

したがって、ファイルとして移動することは正しいです。ファイルを移動するには、次の 2 つの方法があります。

  • renameシステムコールの使用。
  • ファイルをコピーして古いファイルを削除する。

前者には多くの利点があります: 部分的に書き込まれたファイルを残すことができない、両方のファイルを残すことができない、非常に高速で、古いファイルの名前を変更するために使用する場合、ターゲット名が変更される期間がありません。存在しません (最後は POSIX セマンティクスであり、Windows は NTFS で実行できますが、FAT ファイルシステムでは実行できません)。また、重要な欠点が 1 つあります。それは、ファイルシステム内でしか機能しないことです。したがって、次のことを行う必要があります。

  • プロセスが失敗した場合に部分的に書き込まれたファイルが残らないように名前を変更する場合は、名前の変更を使用する必要があるため、同じファイルシステム上の一時的な場所を使用する必要があります。多くの場合、これは一時ディレクトリを使用する代わりに、同じディレクトリで別の名前を使用することによって行われます。
  • たとえば、ネットワーク共有に配置したいなどの理由で宛先が遅い可能性があるために名前を変更している場合は、明らかに別のファイルシステムの一時ディレクトリを使用する必要があります。つまり、ファイルを読み取り、新しい名前で書き込む必要があります。標準の C または C++ ライブラリにはこのための関数はありませんが、多くのライブラリには関数があります (Python などの高水準言語には関数があり、いつでも実行/bin/mvするだけで実行できます)。
于 2012-09-05T06:48:32.377 に答える