OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of dart.io; | 5 part of dart.io; |
6 | 6 |
7 /** | 7 /** |
8 * The type of an entity on the file system, such as a file, directory, or link. | 8 * The type of an entity on the file system, such as a file, directory, or link. |
9 * | 9 * |
10 * These constants are used by the [FileSystemEntity] class | 10 * These constants are used by the [FileSystemEntity] class |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 this.mode, this.size); | 82 this.mode, this.size); |
83 | 83 |
84 const FileStat._internalNotFound() | 84 const FileStat._internalNotFound() |
85 : changed = null, | 85 : changed = null, |
86 modified = null, | 86 modified = null, |
87 accessed = null, | 87 accessed = null, |
88 type = FileSystemEntityType.NOT_FOUND, | 88 type = FileSystemEntityType.NOT_FOUND, |
89 mode = 0, | 89 mode = 0, |
90 size = -1; | 90 size = -1; |
91 | 91 |
92 external static _statSync(String path); | 92 external static _statSync(_Namespace namespace, String path); |
93 | 93 |
94 /** | 94 /** |
95 * Calls the operating system's stat() function on [path]. | 95 * Calls the operating system's stat() function on [path]. |
96 * Returns a [FileStat] object containing the data returned by stat(). | 96 * Returns a [FileStat] object containing the data returned by stat(). |
97 * If the call fails, returns a [FileStat] object with .type set to | 97 * If the call fails, returns a [FileStat] object with .type set to |
98 * FileSystemEntityType.NOT_FOUND and the other fields invalid. | 98 * FileSystemEntityType.NOT_FOUND and the other fields invalid. |
99 */ | 99 */ |
100 static FileStat statSync(String path) { | 100 static FileStat statSync(String path) { |
101 // Trailing path is not supported on Windows. | 101 // Trailing path is not supported on Windows. |
102 if (Platform.isWindows) { | 102 if (Platform.isWindows) { |
103 path = FileSystemEntity._trimTrailingPathSeparators(path); | 103 path = FileSystemEntity._trimTrailingPathSeparators(path); |
104 } | 104 } |
105 var data = _statSync(path); | 105 var data = _statSync(_Namespace._namespace, path); |
106 if (data is OSError) return FileStat._notFound; | 106 if (data is OSError) return FileStat._notFound; |
107 return new FileStat._internal( | 107 return new FileStat._internal( |
108 new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]), | 108 new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]), |
109 new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]), | 109 new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]), |
110 new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]), | 110 new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]), |
111 FileSystemEntityType._lookup(data[_TYPE]), | 111 FileSystemEntityType._lookup(data[_TYPE]), |
112 data[_MODE], | 112 data[_MODE], |
113 data[_SIZE]); | 113 data[_SIZE]); |
114 } | 114 } |
115 | 115 |
116 /** | 116 /** |
117 * Asynchronously calls the operating system's stat() function on [path]. | 117 * Asynchronously calls the operating system's stat() function on [path]. |
118 * Returns a Future which completes with a [FileStat] object containing | 118 * Returns a Future which completes with a [FileStat] object containing |
119 * the data returned by stat(). | 119 * the data returned by stat(). |
120 * If the call fails, completes the future with a [FileStat] object with | 120 * If the call fails, completes the future with a [FileStat] object with |
121 * .type set to FileSystemEntityType.NOT_FOUND and the other fields invalid. | 121 * .type set to FileSystemEntityType.NOT_FOUND and the other fields invalid. |
122 */ | 122 */ |
123 static Future<FileStat> stat(String path) { | 123 static Future<FileStat> stat(String path) { |
124 // Trailing path is not supported on Windows. | 124 // Trailing path is not supported on Windows. |
125 if (Platform.isWindows) { | 125 if (Platform.isWindows) { |
126 path = FileSystemEntity._trimTrailingPathSeparators(path); | 126 path = FileSystemEntity._trimTrailingPathSeparators(path); |
127 } | 127 } |
128 return _IOService._dispatch(_FILE_STAT, [path]).then((response) { | 128 return _File._dispatchWithNamespace(_FILE_STAT, [null, path]) |
| 129 .then((response) { |
129 if (_isErrorResponse(response)) { | 130 if (_isErrorResponse(response)) { |
130 return FileStat._notFound; | 131 return FileStat._notFound; |
131 } | 132 } |
132 // Unwrap the real list from the "I'm not an error" wrapper. | 133 // Unwrap the real list from the "I'm not an error" wrapper. |
133 List data = response[1]; | 134 List data = response[1]; |
134 return new FileStat._internal( | 135 return new FileStat._internal( |
135 new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]), | 136 new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]), |
136 new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]), | 137 new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]), |
137 new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]), | 138 new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]), |
138 FileSystemEntityType._lookup(data[_TYPE]), | 139 FileSystemEntityType._lookup(data[_TYPE]), |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 * var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath(); | 297 * var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath(); |
297 * if (path == '') path = '.'; | 298 * if (path == '') path = '.'; |
298 * new File(path).resolveSymbolicLinks().then((resolved) { | 299 * new File(path).resolveSymbolicLinks().then((resolved) { |
299 * print(resolved); | 300 * print(resolved); |
300 * }); | 301 * }); |
301 * | 302 * |
302 * since `Uri.resolve` removes `..` segments. This will result in the Windows | 303 * since `Uri.resolve` removes `..` segments. This will result in the Windows |
303 * behavior. | 304 * behavior. |
304 */ | 305 */ |
305 Future<String> resolveSymbolicLinks() { | 306 Future<String> resolveSymbolicLinks() { |
306 return _IOService | 307 return _File |
307 ._dispatch(_FILE_RESOLVE_SYMBOLIC_LINKS, [path]).then((response) { | 308 ._dispatchWithNamespace(_FILE_RESOLVE_SYMBOLIC_LINKS, [null, path]) |
| 309 .then((response) { |
308 if (_isErrorResponse(response)) { | 310 if (_isErrorResponse(response)) { |
309 throw _exceptionFromResponse( | 311 throw _exceptionFromResponse( |
310 response, "Cannot resolve symbolic links", path); | 312 response, "Cannot resolve symbolic links", path); |
311 } | 313 } |
312 return response; | 314 return response; |
313 }); | 315 }); |
314 } | 316 } |
315 | 317 |
316 /** | 318 /** |
317 * Resolves the path of a file system object relative to the | 319 * Resolves the path of a file system object relative to the |
(...skipping 16 matching lines...) Expand all Loading... |
334 * | 336 * |
335 * var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath(); | 337 * var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath(); |
336 * if (path == '') path = '.'; | 338 * if (path == '') path = '.'; |
337 * var resolved = new File(path).resolveSymbolicLinksSync(); | 339 * var resolved = new File(path).resolveSymbolicLinksSync(); |
338 * print(resolved); | 340 * print(resolved); |
339 * | 341 * |
340 * since `Uri.resolve` removes `..` segments. This will result in the Windows | 342 * since `Uri.resolve` removes `..` segments. This will result in the Windows |
341 * behavior. | 343 * behavior. |
342 */ | 344 */ |
343 String resolveSymbolicLinksSync() { | 345 String resolveSymbolicLinksSync() { |
344 var result = _resolveSymbolicLinks(path); | 346 var result = _resolveSymbolicLinks(_Namespace._namespace, path); |
345 _throwIfError(result, "Cannot resolve symbolic links", path); | 347 _throwIfError(result, "Cannot resolve symbolic links", path); |
346 return result; | 348 return result; |
347 } | 349 } |
348 | 350 |
349 /** | 351 /** |
350 * Calls the operating system's stat() function on the [path] of this | 352 * Calls the operating system's stat() function on the [path] of this |
351 * [FileSystemEntity]. Identical to [:FileStat.stat(this.path):]. | 353 * [FileSystemEntity]. Identical to [:FileStat.stat(this.path):]. |
352 * | 354 * |
353 * Returns a [:Future<FileStat>:] object containing the data returned by | 355 * Returns a [:Future<FileStat>:] object containing the data returned by |
354 * stat(). | 356 * stat(). |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 * | 457 * |
456 * Comparing a link to its target returns false, as does comparing two links | 458 * Comparing a link to its target returns false, as does comparing two links |
457 * that point to the same target. To check the target of a link, use | 459 * that point to the same target. To check the target of a link, use |
458 * Link.target explicitly to fetch it. Directory links appearing | 460 * Link.target explicitly to fetch it. Directory links appearing |
459 * inside a path are followed, though, to find the file system object. | 461 * inside a path are followed, though, to find the file system object. |
460 * | 462 * |
461 * Completes the returned Future with an error if one of the paths points | 463 * Completes the returned Future with an error if one of the paths points |
462 * to an object that does not exist. | 464 * to an object that does not exist. |
463 */ | 465 */ |
464 static Future<bool> identical(String path1, String path2) { | 466 static Future<bool> identical(String path1, String path2) { |
465 return _IOService | 467 return _File._dispatchWithNamespace(_FILE_IDENTICAL, [null, path1, path2]) |
466 ._dispatch(_FILE_IDENTICAL, [path1, path2]).then((response) { | 468 .then((response) { |
467 if (_isErrorResponse(response)) { | 469 if (_isErrorResponse(response)) { |
468 throw _exceptionFromResponse(response, | 470 throw _exceptionFromResponse(response, |
469 "Error in FileSystemEntity.identical($path1, $path2)", ""); | 471 "Error in FileSystemEntity.identical($path1, $path2)", ""); |
470 } | 472 } |
471 return response; | 473 return response; |
472 }); | 474 }); |
473 } | 475 } |
474 | 476 |
475 static final RegExp _absoluteWindowsPathPattern = | 477 static final RegExp _absoluteWindowsPathPattern = |
476 new RegExp(r'^(\\\\|[a-zA-Z]:[/\\])'); | 478 new RegExp(r'^(\\\\|[a-zA-Z]:[/\\])'); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 * | 519 * |
518 * Comparing a link to its target returns false, as does comparing two links | 520 * Comparing a link to its target returns false, as does comparing two links |
519 * that point to the same target. To check the target of a link, use | 521 * that point to the same target. To check the target of a link, use |
520 * Link.target explicitly to fetch it. Directory links appearing | 522 * Link.target explicitly to fetch it. Directory links appearing |
521 * inside a path are followed, though, to find the file system object. | 523 * inside a path are followed, though, to find the file system object. |
522 * | 524 * |
523 * Throws an error if one of the paths points to an object that does not | 525 * Throws an error if one of the paths points to an object that does not |
524 * exist. | 526 * exist. |
525 */ | 527 */ |
526 static bool identicalSync(String path1, String path2) { | 528 static bool identicalSync(String path1, String path2) { |
527 var result = _identical(path1, path2); | 529 var result = _identical(_Namespace._namespace, path1, path2); |
528 _throwIfError(result, 'Error in FileSystemEntity.identicalSync'); | 530 _throwIfError(result, 'Error in FileSystemEntity.identicalSync'); |
529 return result; | 531 return result; |
530 } | 532 } |
531 | 533 |
532 /** | 534 /** |
533 * Test if [watch] is supported on the current system. | 535 * Test if [watch] is supported on the current system. |
534 * | 536 * |
535 * OS X 10.6 and below is not supported. | 537 * OS X 10.6 and below is not supported. |
536 */ | 538 */ |
537 static bool get isWatchSupported => _FileSystemWatcher.isSupported; | 539 static bool get isWatchSupported => _FileSystemWatcher.isSupported; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 static bool isFileSync(String path) => | 602 static bool isFileSync(String path) => |
601 (_getTypeSync(path, true) == FileSystemEntityType.FILE._type); | 603 (_getTypeSync(path, true) == FileSystemEntityType.FILE._type); |
602 | 604 |
603 /** | 605 /** |
604 * Synchronously checks if typeSync(path) returns | 606 * Synchronously checks if typeSync(path) returns |
605 * FileSystemEntityType.DIRECTORY. | 607 * FileSystemEntityType.DIRECTORY. |
606 */ | 608 */ |
607 static bool isDirectorySync(String path) => | 609 static bool isDirectorySync(String path) => |
608 (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY._type); | 610 (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY._type); |
609 | 611 |
610 external static _getType(String path, bool followLinks); | 612 external static _getType(_Namespace namespace, String path, bool followLinks); |
611 external static _identical(String path1, String path2); | 613 external static _identical(_Namespace namespace, String path1, String path2); |
612 external static _resolveSymbolicLinks(String path); | 614 external static _resolveSymbolicLinks(_Namespace namespace, String path); |
613 | 615 |
614 // Finds the next-to-last component when dividing at path separators. | 616 // Finds the next-to-last component when dividing at path separators. |
615 static final RegExp _parentRegExp = Platform.isWindows | 617 static final RegExp _parentRegExp = Platform.isWindows |
616 ? new RegExp(r'[^/\\][/\\]+[^/\\]') | 618 ? new RegExp(r'[^/\\][/\\]+[^/\\]') |
617 : new RegExp(r'[^/]/+[^/]'); | 619 : new RegExp(r'[^/]/+[^/]'); |
618 | 620 |
619 /** | 621 /** |
620 * Removes the final path component of a path, using the platform's | 622 * Removes the final path component of a path, using the platform's |
621 * path separator to split the path. Will not remove the root component | 623 * path separator to split the path. Will not remove the root component |
622 * of a Windows path, like "C:\\" or "\\\\server_name\\". | 624 * of a Windows path, like "C:\\" or "\\\\server_name\\". |
(...skipping 23 matching lines...) Expand all Loading... |
646 return '.'; | 648 return '.'; |
647 } | 649 } |
648 } | 650 } |
649 | 651 |
650 /** | 652 /** |
651 * The directory containing [this]. | 653 * The directory containing [this]. |
652 */ | 654 */ |
653 Directory get parent => new Directory(parentOf(path)); | 655 Directory get parent => new Directory(parentOf(path)); |
654 | 656 |
655 static int _getTypeSync(String path, bool followLinks) { | 657 static int _getTypeSync(String path, bool followLinks) { |
656 var result = _getType(path, followLinks); | 658 var result = _getType(_Namespace._namespace, path, followLinks); |
657 _throwIfError(result, 'Error getting type of FileSystemEntity'); | 659 _throwIfError(result, 'Error getting type of FileSystemEntity'); |
658 return result; | 660 return result; |
659 } | 661 } |
660 | 662 |
661 static Future<int> _getTypeAsync(String path, bool followLinks) { | 663 static Future<int> _getTypeAsync(String path, bool followLinks) { |
662 return _IOService | 664 return _File._dispatchWithNamespace(_FILE_TYPE, [null, path, followLinks]) |
663 ._dispatch(_FILE_TYPE, [path, followLinks]).then((response) { | 665 .then((response) { |
664 if (_isErrorResponse(response)) { | 666 if (_isErrorResponse(response)) { |
665 throw _exceptionFromResponse(response, "Error getting type", path); | 667 throw _exceptionFromResponse(response, "Error getting type", path); |
666 } | 668 } |
667 return response; | 669 return response; |
668 }); | 670 }); |
669 } | 671 } |
670 | 672 |
671 static _throwIfError(Object result, String msg, [String path]) { | 673 static _throwIfError(Object result, String msg, [String path]) { |
672 if (result is OSError) { | 674 if (result is OSError) { |
673 throw new FileSystemException(msg, path, result); | 675 throw new FileSystemException(msg, path, result); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 buffer.write(')'); | 825 buffer.write(')'); |
824 return buffer.toString(); | 826 return buffer.toString(); |
825 } | 827 } |
826 } | 828 } |
827 | 829 |
828 class _FileSystemWatcher { | 830 class _FileSystemWatcher { |
829 external static Stream<FileSystemEvent> _watch( | 831 external static Stream<FileSystemEvent> _watch( |
830 String path, int events, bool recursive); | 832 String path, int events, bool recursive); |
831 external static bool get isSupported; | 833 external static bool get isSupported; |
832 } | 834 } |
OLD | NEW |