テキストファイルの保存と削除
テキストファイルの保存と保存したファイルの削除方法を紹介します。保存の方法としては、上書きと既にあるデータに追加のデータを追記する方法があります。
ファイルの読み込みや、ディレクトリの取得処理などは前回、Fileプラグインの基本であるFileSystem APIにて説明していますので、基本的なAPIについてはそちらから参照することをおすすめします。
データを上書き保存する
ローカルファイルにデータを保存する方法を紹介します。ファイルにデータを書きこむにはFileWriterオブジェクトを使います。
FileWriterオブジェクトを作成するにはデータを読む場合と同様にresolveLocalFileSystemURL()もしくは、requestFileSystem()メソッドを使ってファイルEntryを取得してから作成します。
テキストデータをローカルファイルに書き込むためのサンプルコードがリスト5です。
//(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)でデータを書き込みます。
| フラグ名 | 説明 |
|---|---|
| create | trueを指定した場合には、存在しない場合には新規に作成する。 |
| exclusive | trueを指定した場合でかつ、新規に作成する場合に、既に存在している場合にはエラーにする。 |
ファイルにデータを追記して保存する
先ほどはファイルにデータを上書きして必ず、新しいデータとして保存していましたが、既にあるデータに新たにデータを追記することも可能です。
その場合には、データを書きこむ際にデータの書き込み位置をデータの最後に設定してからデータを書き込みます。リスト6がファイルを追記する場合のサンプルコードです。
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はファイルを削除する場合のサンプルコードです。
//(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()メソッドが利用できますので、用途に合わせて選択して使用してください。
