モーリーのメモスマートフォン用の表示で見るモーリーのメモアプリ開発等(プログラミング、CG作成)、興味を持ったことを実践してまとめるブログです。JavaScript↓こちらの記事で、Node.jsの環境を作成しました。mmorley.hatenablog.comNode.jsの使用例を見ていたら、ファイル操作が出来ることを発見!ここでのファイル操作とは、ファイルの名前変更、削除、ファイル情報の取得等です。ブラウザ上で動く従来のJavaScriptでは出来なかったので盲点でした。個人的には、不慣れなunixコマンドよりいろいろ出来そうです。ファイル操作に関する関数群は、Node.jsの標準モジュールに含まれています。Node.jsには使いたいライブラリをnpmで組み込んで使用する仕組みがありますが、標準モジュールは最初から組み込まれています。標準モジュールに含まれる関数群の詳細は、公式のAPIリファレンスで確認出来ます。いうことで、今回は試しにファイル内のフォルダを列挙するプログラムを作成します。注意する必要があります。私が今回使用した環境です。Documentation↑の関数名の一覧を見ると『〜Sync』の有無で2通りあるものがあります。『〜Sync』が付いてるのが同期処理の関数で、付いてないのが非同期処理の関数です。同期処理と非同期処理のふるまいの違いを把握していないと、意図する結果が得られないので、理解は必須です。注意するのは処理の順序です。次の関数で例を示します。指定フォルダ内のファイル・サブフォルダ名を取得する関数です。Desktopのファイルとフォルダ名をターミナルに表示するプログラムを書きます。下記のコードで、1の関数の処理はディスクにアクセスするので時間がかかります。1の処理の完了を待ってから2が実行されるので、ターミナルにDesktopの情報が表示されます。'/Users/ユーザ名/Desktop';』のユーザ名の部分は、使用中のユーザ名に書き換えて下さい。下記のコードで、1は関数の呼び出しだけで処理の完了を待たずに、すぐに2を実行します。file[]は空の状態なので、何も表示されません。1の処理が完了したら、3が実行されます。実行結果:何も表示されない上記コードを直すには、2の処理を3のコールバック関数の中に移すだけですが、次の場合はもう少し複雑です。サブフォルダ内も含めて、フォルダ内のファイルを列挙するサブフォルダ内も含めてデスクトップ内のファイル情報(ファイル名、サイズ、作成日)を取得し、デスクトップにresult.csvという名前で書き出します。getFiles(dir){...})(dirTarget);』は、関数を定義して、即実行する書き方です。1のgetFiles関数は、フォルダが見つかるたびにgetFiles自身を呼び出しています。何回getFilesが呼び出されるかは、フォルダの階層や数次第です。同期処理なので、1の処理は、必ず2の前までに完了しています。同期処理の関数を非同期処理の関数に変更するコールバック関数で、ファイル書き出しを行うという修正だけでは上手く行きません。全てのファイル情報の読み込みが完了したのを判定して、それからファイルに書き出す必要があります。delay)を使用しました。delayミリ秒後に、callbackで指定した関数を1度だけ実行する関数です。1でdirに含まれるファイル(またはフォルダ)をfileに読み込みます。2でfileの中身をチェックし、フォルダが見つかるごとにdirに追加します。未チェックのフォルダがあれば1に戻り、無ければファイルに書き出します。"");非同期処理を行う関数が同時に複数実行されないようにしています。非同期処理が終わるごとに、コールバック関数で、setTimeout()によって次の関数を呼び出しています。あとがき最初は、同期・非同期の関数をよく理解せずに使ったため、実行順序が無茶苦茶になってました。実行順序を理解していないと、バグが見つけにくいです。非同期処理は、サーバー処理のように複数を相手に処理するような場合のためのものです。今回書いた処理は単独で実行するものなので、本来は全部同期処理で書けば良いと思いますが、練習のため非同期処理で書きました。複数を相手にする場合、グローバル変数を使わない方が良いのかなと考えて、引数で渡すようにしてみました。↑の記事のプログラムの派生版です。(8)参加グループプログラミングリンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!mmorleyさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。