class SaveFile {
constructor() {
this.filename = null;
this.callbackComplete = null;
this.callbackError = null;
}
// ブラウザ上で実行している場合のファイル保存処理
saveFileBrowser(filename, data) {
// Blobに変換して download
let blob = new Blob([data], { type: "text/plain" });
let a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.target = '_blank';
a.download = filename; // Edgeは無効……
a.click();
// download完了後に memory解放したほうがいい
// URL.revokeObjectURL();
};
// アプリケーションとして実行している場合のファイル保存処理
saveFileApp(filename, data, callbackComplete, callbackError) {
if (null != callbackComplete) this.callbackComplete = callbackComplete;
if (null != callbackError) this.callbackError = callbackError;
// Unique filename作成 (ABC.txtが既にある → ABC(1).txt という file nameになる
// write, append指定はerrorになる。filepickerかmanifestで権限取得する必要があるかも
let fileoption = Windows.Storage.CreationCollisionOption.generateUniqueName;
Windows.Storage.DownloadsFolder.createFileAsync(filename, fileoption).done(this.saveFileAppOpenFile.bind(this, data), this.saveFileError.bind(this));
};
// 以下、Private関数 -------------------
saveFileAppOpenFile(savedata, file) { // [!!caution] callback設定時に savedataを無理やりbind済み
// 実際に書き込まれた file nameを取得
let name = file.name;
// file objectの pathを参照すると保存先 folderが大変なことになっているが
// 実際に保存される場所は Downloads/<ApplicationName>/ になる
// この時点で fileは既に open済みになっている
// fileへデータ書き込み
Windows.Storage.FileIO.writeTextAsync(file, savedata);
// 書き込み完了チェック
Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(this.saveFileComplete.bind(this), this.saveFileError.bind(this));
};
saveFileComplete() {
// 保存完了
debuglog('ファイル保存完了');
if (null != this.callbackComplete) this.callbackComplete();
};
saveFileError(err) {
console.error('ファイル保存エラー\nerror=' + err.message + 'description=' + err.description);
if (null != this.callbackError) this.callbackError(err.message);
};
} // class SaveFile