この記事で扱っていること
- 様々な形でファイルのバックアップを取る方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
ハードウェアを動かすときなどにデフォルトのパラメータを保存しているファイルを読み取った後、新たに設定を決めて次回以降プログラムを動かすとき用にその新しい設定をファイル保存するときには、結果を後から追跡できるように前の設定を残しておくと便利なことがあります。
また、ハードウェアを使うようなプログラムでなくても、何かしら処理を行うようなプログラムで処理の対象を読み取ったり、結果を常に特定の名前のファイルで出力するような場面であっても、前のファイルを残しておきたいという場合もあり得ると思います。
そんな時、ファイル名をどう管理するかについて考えます。
もちろん、新しい設定は新しい名前のファイルに保存すればいいという考え方もありますが、プログラムでユーザーに設定ファイルをいちいち選択させたくないため設定ファイルは常に固定の名前にしておきたいという場合があります。
そこで本記事では、既存のファイルに対していくつかのパターンでバックアップファイル作成をするプログラムの例を挙げています。
どんな結果になるか
バックアップファイルをどのような名前にするか、どこに保存するかを決める必要があります。
- バックアップ作成時のタイムスタンプを入れて保存する
- 特定の文字列(backupなど)を入れて保存する
- 番号を連番にして保存する
- 元のファイルの保存時間をファイル名に入れて保存する
- バックアップファイル専用のフォルダに保存する
どれも大枠は一緒で少しずつ違う関数を使ったりするだけなのですが、これらのパターンについて紹介していきます。
なお、前提として元々のファイルは適当に作った
<あるフォルダ>\tips\ファイルを様々な形でバックアップを取る\test.txt
という階層にあるtest.txtを使用しています。
プログラムの構造
上で紹介したそれぞれの処理内容とするためのブロックダイアグラムを紹介していきます。
なお、一部を除いて、紹介しているブロックダイアグラムは「ファイルパス名を生成する」ところまでです。実際にファイル作成には「ファイルを開く/作成/置換」の関数や「コピー」といったファイルI/Oパレットにある関数を使用します。
まずは、バックアップ時のタイムスタンプをファイル名に入れる場合です。
時間情報は「日付/時間を秒で取得」を使うことで扱うことができますが、データタイプがタイムスタンプデータになっているので、「日付/時間文字列をフォーマット」関数を使用しています。
実際は、「文字列にフォーマット」関数で形式文字列を編集すればタイムスタンプデータを文字列に変換できるため「日付/時間文字列をフォーマット」関数は必須ではないですが、「日付/時間を秒で取得」と「日付/時間文字列をフォーマット」をセットで使用することが多いのでこのような実装としてみました。
また、元々のファイルの拡張子以外の名前部分は「ファイル拡張子を取得」関数で抽出しています。
次に、特定の文字列をファイル名に入れる場合です。
特別なことはなく、入れたい文字列(以下の例ではbackup)を間に挟むだけです。文字列連結の関数を使用してももちろんできますが、文字列にフォーマット関数だと形式文字列を編集するだけでファイル名拡張子を表す「.(ドット)」の文字列を配線しなくて済むので少しだけ楽です。
次は連番を付与する場合です。
これは、もうそのものずばりの「増分する接尾辞と一緒にファイル保存」の関数を使用できます。
他の4つと異なり、この関数を使用するだけでファイルそのものが生成されます。(「増分する接尾辞と一緒にファイル保存」を使用することで、「ファイルを開く/作成/置換」を実行したのと同じ状態になります)
次は元ファイルの保存されていた時間情報をファイル名に反映させる場合です。
正確には、元ファイルの最終更新時間がタイムスタンプ情報となり保存されます。なので以下の例では元々のtest.txtが0時4分58秒に最終更新されていた、ということになります。
最後は、バックアップ用のフォルダにファイルを保存する場合です。
今まで紹介した他のプログラムは全て、元々のファイルと同じ階層に保存するものでしたが、バックアップファイルは別フォルダにしたい、という場合にはそのフォルダパスをパス作成の関数に入力すれば簡単にできます。
ただし、バックアップ用フォルダに複数のファイルを入れる場合には同じ名前にするとよくないので、結局他に紹介したいずれかの方法でユニークなファイル名にする必要があります。
以下では、タイムスタンプデータをファイル名に入れて、backupというフォルダに保存するようにしています。
関数の使い方
上で紹介したようなファイル保存のプログラムを作る際に使用する関数の使い方についてもう少し深堀していきます。
まずは、日付/時間文字列をフォーマット関数です。これを使用することで時間情報を任意の並びで文字列に変えてくれます。
以下に指定の仕方のいくつかの例を示していますが、個々については関数のヘルプをみてみてください。
また、上で紹介したようにタイムスタンプデータの文字列への変換は文字列にフォーマット関数を使用しても行えます。
ただし、時間形式に変換するという指定をするために「%<XXX>T」といった形にし、XXXの部分に時間形式文字列を入れます。
そんな文字列にフォーマット関数は、文字列データ以外の数値データなども一律文字列に変換してくれます。
形式文字列の部分で、「%」を使用して上から順に変換するようになっています。
連番を使用するには「増分する接尾辞と一緒にファイル保存」の関数を使えますが、この番号の付与の仕方を指定することができます。
ファイルまたはフォルダが既存するかチェックの関数を使用することで、例えば連続運転しているプログラムに対して日付ごとにファイルを保存したい場合の日付フォルダの生成を行えます。
この記事では、ファイルのバックアップを取る様々な方法を紹介しました。
似たような方法が多いですが、パスの扱い方やファイルIOの関数の使い方に慣れればいくらでも違うパターンのファイル作成ができると思いますが、少しでも参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント