import 'dart:io'; import 'package:flutter_document_picker/flutter_document_picker.dart'; import 'package:path_provider/path_provider.dart'; import 'package:smartphone/util/date_util.dart'; import 'logger_util.dart'; /// File manager class FileUtil { /// フォルダ名 static String fileName = "file"; /// 経路 static String _temporaryDirectory = ""; /// @description フォルダの作成 /// @return void static void createCounter() { getTemporaryDirectory().then((value) { _temporaryDirectory = value.path; Directory directory = Directory('$_temporaryDirectory/$fileName'); if (!directory.existsSync()) { directory.createSync(); logD('ドキュメントの初期化に成功しました。ファイルの保存パスは ${directory.path}'); } }); } /// @description ファイルストレージパスの作成 /// @return Future<String> static Future<String> createLogCounter() { var name = DateUtil.getDateTime(DateTime.now().millisecondsSinceEpoch, DateType.yyyymmddNoSplit); return getTemporaryDirectory().then((value) { _temporaryDirectory = value.path; Directory directory = Directory('$_temporaryDirectory/$name'); if (!directory.existsSync()) { directory.createSync(); logD('ドキュメントの初期化に成功しました。ファイルの保存パスは ${directory.path}'); } return directory.path; }); } /// @description 内容を書く /// @param: contents 内容を書く /// @param: name 書類名. /// @return void static void writeCounter(String contents, String name) { File file = File('$_temporaryDirectory/$fileName/$name'); String counterString = ""; if ( file.existsSync() ) { counterString = file.readAsStringSync(); } String resultString = counterString + contents; // 上書き書き file.writeAsString(resultString).then((value) { logWTF(value.path); }); } /// @description 日誌を書き始める /// @param: contents 内容を書く /// @return void static void writeLog(String contents) async { var path = await createLogCounter(); if (path.isEmpty) { logE('path is null'); return; } String counterString = ''; var name = DateUtil.getDateTime(DateTime.now().millisecondsSinceEpoch, DateType.yyyymmddNoSplit); File file; for (var i = 1; ; i++) { file = File('$path/errorlog_${name}_$i.txt'); if (file.existsSync()) { if (file.lengthSync() < 10 * 1024 * 1024) { counterString = file.readAsStringSync(); break; } } else { break; } } String resultString = counterString + contents; // 上書き書き file.writeAsString(resultString).then((value) { logWTF(value.path); }); } /// @description ファイルの取得 /// @param: name 書類名. /// @return File static File getLocalFile(String name) { return File("$_temporaryDirectory/$fileName/$name"); } /// @description 読み取りコンテンツ長 /// @param: name 書類名. /// @return int static int readCounter(String name) { try { File file = getLocalFile(name); // テキストコンテンツの読み取り String counterString = file.readAsStringSync(); return int.parse(counterString); } on FileSystemException { return 0; } } /// @description ローカルファイル選択ダイログ表示 /// @return Future<File?> 選択されだファイル static Future<File?> getLocalDocumentFile() async { final path = await FlutterDocumentPicker.openDocument(); if (path != null) { var file = File(path); // ファイル名称を取得する String tgzName = file.toString().split("/").last; // サンドボックスのパース+file+ファイル名称 file = await file.rename('$_temporaryDirectory/$fileName/$tgzName'); return file; } return null; } /// @description コンテンツの削除 /// @return void static void deleteCounter() { Directory directory = Directory('$_temporaryDirectory/$fileName'); if (directory.existsSync()) { List<FileSystemEntity> files = directory.listSync(); if (files.isNotEmpty) { for (var file in files) { // ファイルのFW更新.tgzを削除する file.deleteSync(); } } // ファイルを削除する // directory.deleteSync(); } } /// @description 最新のログファイルを取得する /// @return File? static File? getNewestLogFile() { try { Directory directory = Directory(_temporaryDirectory); var directoryList = directory.listSync(); directoryList = directoryList.where((element) { var name = element.path.split('/').last; return int.tryParse(name) != null; }).toList(); var newestDirectory = directoryList.reduce((current, next) { var currentName = int.parse(current.path.split('/').last); var nextName = int.parse(next.path.split('/').last); return currentName > nextName ? current : next; }); directory = Directory(newestDirectory.path); directoryList = directory.listSync(); var newestFile = directoryList.reduce((current, next) { // /data/user/0/com.xxx.worker.worker/cache/2023529/errorlog_2023529_1.txt var currentIndex = current.path.split('/').last // errorlog_2023529_1.txt .split('.').first // errorlog_2023529_1 .split('_').last; // 1 var nextIndex = next.path.split('/').last .split('.').first .split('_').last; return int.parse(currentIndex) > int.parse(nextIndex) ? current : next; }); logWTF(newestFile.path); return newestFile as File; } catch (e) { return null; } } /// @description すべてのファイルを取得 /// @return List<FileSystemEntity>? static List<FileSystemEntity>? getAllCounter() { Directory directory = Directory('$_temporaryDirectory/$fileName'); return directory.listSync(); } /// @description 最新バージョンに戻る /// @return FileSystemEntity? static FileSystemEntity? obtainTheLatestVersionInformation() { Directory directory = Directory('$_temporaryDirectory/$fileName'); // ファイル名:E1FW_PKG_vxxx.tgz(xxx:数字 3 桁) FileSystemEntity? fileSystemEntity; if (directory.existsSync()) { List<FileSystemEntity> files = directory.listSync(); if (files.isNotEmpty) { int version = 0; for (var file in files) { String fileSuffix = file.path.split("E1FW_PKG_v").last; if (fileSuffix.isNotEmpty) { // ファイル名が E1FW_PKG_vxxx.tgz 以外ならば、FW 更新ファイルとして認識しないこと。 if (fileSuffix.contains(".tgz")) { int fileVersion = int.parse(fileSuffix.split(".").first); if (fileVersion > version) { version = fileVersion; fileSystemEntity = file; } } } } } } return fileSystemEntity; } }
flutter 文件的操作
最新推荐文章于 2023-11-30 22:01:32 发布