SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Apache Cordovaで本格スマホアプリに挑戦しよう

ファイルを操作するためのプラグインで、テキストや画像をアプリ内に保存する

Apache Cordovaで本格スマホアプリに挑戦しよう 第6回

テキストファイルの保存と削除

 テキストファイルの保存と保存したファイルの削除方法を紹介します。保存の方法としては、上書きと既にあるデータに追加のデータを追記する方法があります。

 ファイルの読み込みや、ディレクトリの取得処理などは前回、Fileプラグインの基本であるFileSystem APIにて説明していますので、基本的なAPIについてはそちらから参照することをおすすめします。

データを上書き保存する

 ローカルファイルにデータを保存する方法を紹介します。ファイルにデータを書きこむにはFileWriterオブジェクトを使います。

 FileWriterオブジェクトを作成するにはデータを読む場合と同様にresolveLocalFileSystemURL()もしくは、requestFileSystem()メソッドを使ってファイルEntryを取得してから作成します。

 テキストデータをローカルファイルに書き込むためのサンプルコードがリスト5です。

リスト5 ファイルの保存(app/www/js/controllers/FileTextController.jsの抜粋)
//(1)textareaで設定された文字列
var input = $scope.input;
//(2)DirectoryEntryを取得する
window.resolveLocalFileSystemURL(
  cordova.file.dataDirectory,
  function(dir){
    //(3)memo.txtファイルがない場合には作成する
    dir.getFile("memo.txt", {create: true}, function (entry) {
      //(4)FileWriterオブジェクトを作成する
      entry.createWriter(function (writer) {
        //(5)データを書き込む
        writer.write(input);

      }, function (error) {
        window.alert("書込失敗 :" + error.code + " - " + message);
      });

    }, function (error) {
      window.alert("書込失敗 :" + error.code + " - " + message);
    });
  },
  function(error){
    window.alert("書込失敗 :" + error.code + " - " + message);
  }
);

 (1)は、AngularJSにおいてテキストエリアに入力されたテキストデータを取得する処理です。jQueryであれば、$("#texarea").val()のように記述した事と同様の処理で、input変数に入力された文字列が設定されるということで理解してもらえれば問題ありません。

 続いて、(2)のようにresolveLocalFileSystemURL()メソッドでcordova.file.dataDirectoryのDirectoryEntryを取得します。cordova.file.dataDirectoryは前回紹介しましたが、アプリがデータを永続的に保存できる領域の一つです。iOSでも、Androidでも共通で存在するフォルダですので、今回はこのフォルダを利用します。

 (3)では、取得したDirectoryEntryのgetFileメソッドを使って"memo.txt"というファイル名でFileオブジェクトを作成します。このときに、最初はファイルは存在しないので、なかった場合に新規作成するように第2引数にcreateフラグを立てています。フラグは表3のような指定が可能です。そして、(4)FileWriterオブジェクトを作成し、(5)でデータを書き込みます。

表3 getFile/getDirectoryに指定可能なフラグ
フラグ名 説明
create trueを指定した場合には、存在しない場合には新規に作成する。
exclusive trueを指定した場合でかつ、新規に作成する場合に、既に存在している場合にはエラーにする。

ファイルにデータを追記して保存する

 先ほどはファイルにデータを上書きして必ず、新しいデータとして保存していましたが、既にあるデータに新たにデータを追記することも可能です。

 その場合には、データを書きこむ際にデータの書き込み位置をデータの最後に設定してからデータを書き込みます。リスト6がファイルを追記する場合のサンプルコードです。

リスト6 ファイルのデータ追記保存例(app/www/js/controllers/FileTextController.jsの抜粋)
window.resolveLocalFileSystemURL(
  cordova.file.dataDirectory,
  function(dir){
    dir.getFile("memo.txt", {create: true}, function (entry) {
      entry.createWriter(function (writer) {
        //(1)ファイルを追記する場合
        writer.seek(writer.length);
        writer.write(input);
      });
    });
  }
);

 (1)のようにFileWriterを作成したら、seekメソッドを使って書込位置をデータの最後にします。後は同様にwriteメソッドで書き込めば終了です。

ファイルを削除する

 続いて、既に存在するファイルを削除する場合です。FileEntryもしくはDirectoryEntryのremove()メソッドを使って削除しますが、ディレクトリの場合には配下にファイル、もしくはディレクトリが存在する場合も含めて削除ができる、removeRecursively()メソッドも用意されています。

 リスト7はファイルを削除する場合のサンプルコードです。

リスト7 ファイルの削除例(app/www/js/controllers/FileTextController.jsの抜粋)
//(1)FileEntryの取得
window.resolveLocalFileSystemURL(
  cordova.file.dataDirectory + "memo.txt",
  function(entry){
    //(2)ファイルの削除処理
    entry.remove(function(){
      window.alert("Remove OK");
    },function(){
      window.alert("Remove Error");
    });
  }
);

 (1)ではこれまで同様に対象のファイルを取得するためにresolveLocalFileSystemURL()メソッドを使ってFileEntryを取得します。

 続いて、(2)のように取得したFileEntryのremove()メソッドを使ってデータを削除します。削除処理に関する成功もしくは失敗まではわかりますが、その原因まではわからないようです。また、指定するパスがディレクトリであれば、取得できるEntryはDirectoryEntryになりますが、流れは同じで、remove()メソッドと、removeRecursively()メソッドが利用できますので、用途に合わせて選択して使用してください。

次のページ
画像ファイルの保存と表示

この記事は参考になりましたか?

Apache Cordovaで本格スマホアプリに挑戦しよう連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9527 2016/07/13 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー