Index: sdk/lib/io/file_system_entity.dart |
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart |
index 847b7d12839eff0abbccca09027dbc5b8c2cf3a5..2ed7290ef6b8ce501d2d88ceb876f9e1f7c7439b 100644 |
--- a/sdk/lib/io/file_system_entity.dart |
+++ b/sdk/lib/io/file_system_entity.dart |
@@ -21,6 +21,90 @@ class FileSystemEntityType { |
final int _type; |
} |
+ |
+class FileStat { |
+ // These must agree with enum FileStat in file.h. |
+ static const TYPE = 0; |
+ static const CHANGED_TIME = 1; |
+ static const MODIFIED_TIME = 2; |
+ static const ACCESSED_TIME = 3; |
+ static const MODE = 4; |
+ static const SIZE = 5; |
+ |
+ FileStat._internal(this.changed, |
+ this.modified, |
+ this.accessed, |
+ this.type, |
+ this.mode, |
+ this.size); |
+ |
+ external static List<int> _statSync(String path); |
+ |
+ static FileStat statSync(String path) { |
+ var data = _statSync(path); |
+ if (data is Error) throw data; |
+ return new FileStat._internal( |
+ new DateTime.fromMillisecondsSinceEpoch(data[CHANGED_TIME] * 1000), |
+ new DateTime.fromMillisecondsSinceEpoch(data[MODIFIED_TIME] * 1000), |
+ new DateTime.fromMillisecondsSinceEpoch(data[ACCESSED_TIME] * 1000), |
+ FileSystemEntityType._lookup(data[TYPE]), |
+ data[MODE], |
+ data[SIZE]); |
+ } |
+ |
+ static Future<FileStat> stat(String path) { |
+ // Get a new file service port for each request. We could also cache one. |
+ var service = _FileUtils._newServicePort(); |
+ List request = new List(2); |
+ request[0] = _STAT_REQUEST; |
+ request[1] = path; |
+ return service.call(request).then((response) { |
+ if (_isErrorResponse(response)) { |
+ throw _exceptionFromResponse(response, |
+ "Error getting stat of '$path'"); |
+ } |
+ // Unwrap the real list from the "I'm not an error" wrapper. |
+ List data = response[1]; |
+ return new FileStat._internal( |
+ new DateTime.fromMillisecondsSinceEpoch(data[CHANGED_TIME] * 1000), |
+ new DateTime.fromMillisecondsSinceEpoch(data[MODIFIED_TIME] * 1000), |
+ new DateTime.fromMillisecondsSinceEpoch(data[ACCESSED_TIME] * 1000), |
+ FileSystemEntityType._lookup(data[TYPE]), |
+ data[MODE], |
+ data[SIZE]); |
+ }); |
+ } |
+ |
+ String toString() => """ |
+FileStat: type $type |
+ changed $changed |
+ modified $modified |
+ accessed $accessed |
+ mode ${modeString()} |
+ size $size"""; |
+ |
+ String modeString() { |
+ var permissions = mode & 0xFFF; |
+ var codes = const ['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx']; |
+ var result = []; |
+ if (permissions & 0x800) result.add("(suid) "); |
+ if (permissions & 0x400) result.add("(guid) "); |
+ if (permissions & 0x200) result.add("(sticky) "); |
+ result.add(codes[(permissions >> 6) & 0x7]); |
+ result.add(codes[(permissions >> 3) & 0x7]); |
+ result.add(codes[permissions & 0x7]); |
+ return result.join(); |
+ } |
+ |
+ final DateTime changed; |
+ final DateTime modified; |
+ final DateTime accessed; |
+ final FileSystemEntityType type; |
+ final int mode; |
+ final int size; |
+} |
+ |
+ |
/** |
* A [FileSystemEntity] is a common super class for [File] and |
* [Directory] objects. |