feat: 下载时若存在数据丢失风险则弹窗提示;服务端增加占用信息查看功能

This commit is contained in:
2026-07-19 00:21:57 +08:00
parent 0aacef79e5
commit d53d6deb2e
5 changed files with 123 additions and 14 deletions
+1
View File
@@ -1,3 +1,4 @@
# https://dart.dev/tools/private-files
# Created by `dart pub`
.dart_tool/
repo/
+37 -2
View File
@@ -2,6 +2,7 @@ import 'dart:io';
import 'package:args/args.dart';
import 'package:file/local.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart';
import 'package:shelf_dav/shelf_dav.dart';
@@ -24,6 +25,7 @@ void main(List<String> args) async {
if (!rootDir.existsSync()) {
rootDir.createSync(recursive: true);
}
var user = argResults.option('user')!;
final config = DAVConfig(
root: rootDir,
prefix: '/dav',
@@ -33,7 +35,7 @@ void main(List<String> args) async {
readOnly: false,
propertyStorageType: PropertyStorageType.file,
authenticationProvider: BasicAuthenticationProvider.plaintext(
users: {argResults.option('user')!: argResults.option('auth')!},
users: {user: argResults.option('auth')!},
),
);
@@ -42,6 +44,39 @@ void main(List<String> args) async {
final ip = InternetAddress.anyIPv4;
final port = int.parse(argResults.option('port') ?? '8800');
final server = await serve(dav.handler, ip, port);
final server = await serve(
(request) {
if (request.method == 'GET' && request.url.path == 'info/$user') {
return getInfo(rootDir);
}
return dav.handler.call(request);
},
ip,
port,
);
print('WebDAV server listening on port ${server.port}');
}
Response getInfo(Directory dir) {
var du = Process.runSync('du', [
'-h',
'--time',
dir.absolute.path,
]).stdout.toString();
var result = <String>[];
for (var line in du.split('\n')) {
var parts = line.split(dir.absolute.path);
if (parts.length == 2) {
if (parts.last.trim().isEmpty) {
result.insert(0, '${parts.first}总占用\n');
} else {
result.add('${parts.first}${Uri.decodeComponent(parts.last)}');
}
}
}
return Response.ok(
result.join('\n'),
headers: {'content-type': 'text/plain'},
);
}