Browserの場合はfile download、アプリの場合はそのままファイルに保存。どちらも Downloads folderに保存される。
- 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