ZetCode

Dart FileStat

最后修改于 2025 年 4 月 4 日

Dart 中的 FileStat 类提供了文件和目录的文件系统统计信息。它是 dart:io 库的一部分,提供有关文件系统实体的元数据。

FileStat 包含文件大小、修改时间、类型等信息。它对文件管理、同步和监控操作很有用。

基本定义

FileStat 是一个表示文件系统统计信息的不可变类。它通过 FileSystemEntity.stat() 方法获得。

关键属性包括类型、大小和修改时间。该类有助于在不打开文件的情况下确定文件的存在、权限和其他属性。

获取基本文件统计信息

本示例演示了如何使用 FileStat 获取基本文件统计信息。

main.dart
import 'dart:io';

void main() async {
  var file = File('example.txt');
  await file.writeAsString('Hello, Dart!');
  
  var stat = await file.stat();
  
  print('File type: ${stat.type}');
  print('File size: ${stat.size} bytes');
  print('Modified: ${stat.modified}');
}

我们创建一个文件,写入一些内容,然后检索其统计信息。stat 方法返回一个 Future<FileStat>,其中包含文件的元数据。

$ dart main.dart
File type: FileSystemEntityType.file
File size: 12 bytes
Modified: 2025-04-04 10:30:45.000

检查文件是否存在

本示例演示了如何使用 FileStat 检查文件是否存在。

main.dart
import 'dart:io';

void main() async {
  var file = File('nonexistent.txt');
  
  try {
    var stat = await file.stat();
    print('File exists: ${stat.type != FileSystemEntityType.notFound}');
  } catch (e) {
    print('File does not exist');
  }
}

我们尝试获取一个不存在的文件的统计信息。如果文件不存在或无法访问,stat() 方法会抛出异常。

$ dart main.dart
File does not exist

比较文件修改时间

本示例演示了如何比较两个文件的修改时间。

main.dart
import 'dart:io';

void main() async {
  var file1 = File('file1.txt');
  var file2 = File('file2.txt');
  
  await file1.writeAsString('First file');
  await Future.delayed(Duration(seconds: 1));
  await file2.writeAsString('Second file');
  
  var stat1 = await file1.stat();
  var stat2 = await file2.stat();
  
  if (stat1.modified.isBefore(stat2.modified)) {
    print('file1 was modified before file2');
  } else {
    print('file2 was modified before file1');
  }
}

我们在两个文件之间创建延迟,然后比较它们的修改时间。这对于同步场景很有用。

$ dart main.dart
file1 was modified before file2

获取目录统计信息

本示例演示了如何获取目录的统计信息。

main.dart
import 'dart:io';

void main() async {
  var dir = Directory('test_dir');
  await dir.create();
  
  var stat = await dir.stat();
  
  print('Type: ${stat.type}');
  print('Modified: ${stat.modified}');
  print('Size: ${stat.size}'); // Directories may report 0 size
}

我们创建一个目录并检索其统计信息。请注意,在某些平台上,目录大小可能会报告为 0,因为它们不包含内容。

$ dart main.dart
Type: FileSystemEntityType.directory
Modified: 2025-04-04 10:32:10.000
Size: 0

符号链接统计信息

本示例演示了如何获取符号链接的统计信息。

main.dart
import 'dart:io';

void main() async {
  var file = File('target.txt');
  await file.writeAsString('Target file content');
  
  var link = Link('link.txt');
  await link.create(file.path);
  
  var stat = await link.stat();
  
  print('Link type: ${stat.type}');
  print('Link size: ${stat.size}');
  
  // To get the target's stats, use followLinks: true
  var targetStat = await link.stat(followLinks: true);
  print('Target size: ${targetStat.size}');
}

我们创建一个符号链接并检查其统计信息。当 followLinks: false 时,我们获取链接本身的统计信息。当 followLinks: true 时,我们获取目标文件的统计信息。

$ dart main.dart
Link type: FileSystemEntityType.link
Link size: 10
Target size: 20

最佳实践

来源

Dart FileStat 文档

本教程介绍了 Dart 的 FileStat 类,并通过实际示例展示了文件元数据访问、存在性检查以及目录等特殊情况。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出 所有 Dart 教程