You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

75 lines
2.2 KiB

import 'dart:io';
import 'package:win_text_editor/app/models/file_node.dart';
class FileService {
/// 延时加载目录内容(不递归)
static Future<List<FileNode>> listDirectory(String path, {int parentDepth = 0}) async {
final directory = Directory(path);
final List<FileNode> nodes = [];
if (await directory.exists()) {
final entities = directory.listSync();
// 遍历目录实体并创建FileNode
for (final entity in entities) {
nodes.add(
FileNode(
name: entity.path.split(Platform.pathSeparator).last,
path: entity.path,
isDirectory: entity is Directory,
depth: parentDepth + 1,
children: [],
),
);
}
// 排序:文件夹在前按字母排序,文件在后按字母排序
nodes.sort((a, b) {
if (a.isDirectory && !b.isDirectory) {
return -1; // a是文件夹,b是文件,a排在前面
} else if (!a.isDirectory && b.isDirectory) {
return 1; // a是文件,b是文件夹,b排在前面
} else {
// 都是文件夹或都是文件时,按名称字母排序
return a.name.compareTo(b.name);
}
});
}
return nodes;
}
/// 递归构建完整文件树(原方法保留备用)
static Future<List<FileNode>> buildFileTree(String rootPath) async {
final rootDirectory = Directory(rootPath);
final List<FileNode> nodes = [];
if (await rootDirectory.exists()) {
final entities = rootDirectory.listSync();
for (final entity in entities) {
final node = FileNode(
name: entity.path.split(Platform.pathSeparator).last,
path: entity.path,
isDirectory: entity is Directory,
);
if (entity is Directory) {
node.children.addAll(await buildFileTree(entity.path));
}
nodes.add(node);
}
}
return nodes;
}
static Future<String> readFile(String filePath) async {
return await File(filePath).readAsString();
}
static Future<void> writeFile(String filePath, String content) async {
await File(filePath).writeAsString(content);
}
}