なでしこ開発日誌~落ち着く場所はありますか?

人それぞれ、落ち着く場所があると思います。お風呂に入ると落ち着くとか、行きつけのカフェだったりすると思います。

私の場合は、それがトイレです。なぜかトイレに居るとすごく落ち着くので、よくノートパソコンを持ち込んで、仕事をしていたりします。とても滑稽なのですが、不思議と仕事が捗るのです。

ですので、プログラムや原稿を書いていて行き詰ると、用もなく(いや、その間に用は足すのですが…)トイレに篭ることになります。特に我が家のトイレは快適なのですが、トイレという閉鎖された空間が、子供の頃に憧れていた「秘密基地」のように思えてしまうからかもしれません。

皆さんの落ち着く場所はどこでしょうか。もし、変わった場所があれば、ぜひ、教えてくださいね。

フォルダ一括圧縮プログラムを作る

いきなり、出だしから変な話をしてしまいましてすみません。(気を取り直して…)今回は、フォルダ一括圧縮を行うプログラムを作ってみたいと思います。

皆さんは、パソコンのどこにどんなデータを保存していますか。人それぞれ使い方があると思いますが、だいたいは、データや仕事の分野ごとにフォルダに分けて管理しているのではないでしょうか。

私も、仕事の分野ごとにフォルダを分けて管理しています。そこで、これをバックアップするために、フォルダごとにデータを圧縮するというプログラムを作ってみようと思います。

プログラムのイメージとしては、それぞれ圧縮したいフォルダがあるフォルダの1つ上のフォルダ(マイドキュメントなど様々なフォルダがそれぞれ保存されている場所)を指定すると、それ以下にあるフォルダを次々と圧縮して、外付けのハードディスクなどに、バックアップするプログラムです。

フォルダ一括圧縮の手順

今回のプログラムは、とにかく、指定のフォルダ以下のフォルダを1つずつ圧縮していくというものなのです。

ここで、今回作るプログラムの手順をまとめてみたいと思います。一番簡単に書くと以下の動作をさせたいと思います。

・指定したフォルダ以下にあるフォルダを圧縮する

この一行を実際のプログラムに直すためには、もう少し細かい点を考えなければなりません。もう少し細かくプログラムに直すことを考えて手順にすると次のようになります。

(1)指定フォルダ以下のフォルダを列挙する
(2)列挙したフォルダについて以下の動作を繰り返し行う
(3)圧縮先のファイル名を作る
(4)実際にフォルダを圧縮する

フォルダを列挙して次々と処理する

先ほど考えた手順を実際のプログラムに直すためには、フォルダを列挙する方法と、列挙したフォルダを次々と処理する方法を知っていなくてはなりません。

なでしこで、フォルダを列挙して、次々と処理するには、以下のように書きます。

「指定フォルダ」のフォルダ列挙して反復
  ※ここに処理する内容
  ※ここに処理する内容
  ※ここに処理する内容…

フォルダを列挙するには、「フォルダ列挙」命令を使い、列挙したフォルダを順に処理していくには、「反復」構文を使います。要するに、上の書式を雛形としてプログラムを書けば良いのです。

とりあえず、列挙したフォルダを表示するだけのプログラムを書くと、以下のようになります。

マイドキュメントのフォルダ列挙して反復
  対象を表示。

ファイル・フォルダを圧縮する方法

次に、なでしこで、ファイルやフォルダを圧縮・解凍する方法ですが、これはとても簡単です。それは「xxをxxに圧縮」や「xxをxxに解凍」と書きます。つまり、見たままに書くことができます。これが日本語プログラミング言語の威力です!

圧縮するには、以下のように書きます。例えば、マイドキュメント以下全ての内容を、デスクトップ上の「バックアップ.lzh」へ圧縮したい場合は、以下のように書きます。

「{マイドキュメント}」を「{デスクトップ}バックアップ.lzh」へ圧縮。

ZIP圧縮を使うには?

なでしこを使う場合、圧縮するには、LZH形式・ZIP形式・CAB形式を選ぶことができます。ただし、ZIP形式やCAB形式で圧縮したい場合は、圧縮を行うためのアーカイバDLLをダウンロードする必要があります。

ZIP圧縮を行うためのDLLは、「7-zip.dll」で、以下のサイトからダウンロードできます。

7-zip32.dll ... ZIP形式の圧縮解凍DLL

また、CAB圧縮のためには、以下の「cab32.dll」のDLLをダウンロードします。

cab32.dll ... CAB形式の圧縮解凍DLL

実は、LZH形式の圧縮を使うには「UNLHA32.DLL」が必要になるのですが、これは、作者の方の許可を得て、はじめからなでしこの中に梱包されているので、LZH形式の圧縮の場合には、ダウンロードが不要です。

また、各保存形式を変える方法ですが、このためには、特に意識することなく、「xxから『ファイル名.lzh』へ圧縮」と書くと、LZH形式で圧縮され、「xxから『ファイル名.cab』へ圧縮」と書くと、CAB形式で圧縮されることになります。

10行プログラム

さて、こうして作ったプログラムは以下のようになります。

【使い方】

以下のプログラムを実行すると、まず、一括圧縮したいフォルダを尋ねられますので指定します。続いて、圧縮ファイルを保存するフォルダを尋ねられますので指定します。すると、圧縮するように指定したフォルダの中に入っているフォルダを1つずつ圧縮していきます。

圧縮したいフォルダを指定します。

フォルダを1つずつ圧縮します。

【なでしこのプログラム】

「圧縮したいフォルダを選択してください」と言う。#1
フォルダ選択して、選択フォルダに代入。もし、それが空ならば、終わり。#2
「圧縮ファイルを保存するフォルダを選択してください」と言う。#3
フォルダ選択して、保存フォルダに代入。もし、それが空ならば、終わり。#4
選択フォルダのフォルダ列挙して反復#5
  対象フォルダ=選択フォルダ&対象。#6
  保存名=「{保存フォルダ}{対象}.lzh」。#7
  母艦のタイトルは、「圧縮中:{対象}」。#8
  対象フォルダを保存名に圧縮。#9
「完了!」と言って、終わり。#10

1~2行目では、圧縮対象となるフォルダをユーザーに尋ねます。3~4行目では、保存先のフォルダをユーザーに尋ねています。

5行目で、フォルダを列挙して6~9行目を繰り返すように指定します。7行目以降では、圧縮対象となるフォルダのパス名と、保存対象となるフォルダのパス名を決めてから実際に圧縮します。 10行目では、完了の旨を表示してプログラムを終了します。

改造のヒント

こうしたバックアップのプログラムは、定期的に実行します。今回作った10行プログラムでは、毎回ユーザーに圧縮対象フォルダと、保存先フォルダを尋ねていますが、これでは、利便性がよくありません。そこで、それぞれのフォルダを保存する機能をつければ、毎回フォルダを指定することなく、実行することができます。

また、フォルダの中には、圧縮したくないフォルダもあるでしょう。そこで、除外リストなどを用意して、指定のフォルダは圧縮対象から外すなどの処理ができると、より実用的だと思います。

ぜひ、自分の使いやすいように、改造してみてください。