Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1675)

Side by Side Diff: sdk/lib/io/file_system_entity.dart

Issue 3007703002: [dart:io] Namespaces for file IO (Closed)
Patch Set: Remove namespace_unsupported.cc Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sdk/lib/io/file_impl.dart ('k') | sdk/lib/io/io.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
129 ._dispatchWithNamespace(_FILE_STAT, [null, path]).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
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._dispatchWithNamespace(
307 ._dispatch(_FILE_RESOLVE_SYMBOLIC_LINKS, [path]).then((response) { 308 _FILE_RESOLVE_SYMBOLIC_LINKS, [null, path]).then((response) {
308 if (_isErrorResponse(response)) { 309 if (_isErrorResponse(response)) {
309 throw _exceptionFromResponse( 310 throw _exceptionFromResponse(
310 response, "Cannot resolve symbolic links", path); 311 response, "Cannot resolve symbolic links", path);
311 } 312 }
312 return response; 313 return response;
313 }); 314 });
314 } 315 }
315 316
316 /** 317 /**
317 * Resolves the path of a file system object relative to the 318 * Resolves the path of a file system object relative to the
(...skipping 16 matching lines...) Expand all
334 * 335 *
335 * var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath(); 336 * var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();
336 * if (path == '') path = '.'; 337 * if (path == '') path = '.';
337 * var resolved = new File(path).resolveSymbolicLinksSync(); 338 * var resolved = new File(path).resolveSymbolicLinksSync();
338 * print(resolved); 339 * print(resolved);
339 * 340 *
340 * since `Uri.resolve` removes `..` segments. This will result in the Windows 341 * since `Uri.resolve` removes `..` segments. This will result in the Windows
341 * behavior. 342 * behavior.
342 */ 343 */
343 String resolveSymbolicLinksSync() { 344 String resolveSymbolicLinksSync() {
344 var result = _resolveSymbolicLinks(path); 345 var result = _resolveSymbolicLinks(_Namespace._namespace, path);
345 _throwIfError(result, "Cannot resolve symbolic links", path); 346 _throwIfError(result, "Cannot resolve symbolic links", path);
346 return result; 347 return result;
347 } 348 }
348 349
349 /** 350 /**
350 * Calls the operating system's stat() function on the [path] of this 351 * Calls the operating system's stat() function on the [path] of this
351 * [FileSystemEntity]. Identical to [:FileStat.stat(this.path):]. 352 * [FileSystemEntity]. Identical to [:FileStat.stat(this.path):].
352 * 353 *
353 * Returns a [:Future<FileStat>:] object containing the data returned by 354 * Returns a [:Future<FileStat>:] object containing the data returned by
354 * stat(). 355 * stat().
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 * 456 *
456 * Comparing a link to its target returns false, as does comparing two links 457 * 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 458 * that point to the same target. To check the target of a link, use
458 * Link.target explicitly to fetch it. Directory links appearing 459 * Link.target explicitly to fetch it. Directory links appearing
459 * inside a path are followed, though, to find the file system object. 460 * inside a path are followed, though, to find the file system object.
460 * 461 *
461 * Completes the returned Future with an error if one of the paths points 462 * Completes the returned Future with an error if one of the paths points
462 * to an object that does not exist. 463 * to an object that does not exist.
463 */ 464 */
464 static Future<bool> identical(String path1, String path2) { 465 static Future<bool> identical(String path1, String path2) {
465 return _IOService 466 return _File._dispatchWithNamespace(
466 ._dispatch(_FILE_IDENTICAL, [path1, path2]).then((response) { 467 _FILE_IDENTICAL, [null, path1, path2]).then((response) {
467 if (_isErrorResponse(response)) { 468 if (_isErrorResponse(response)) {
468 throw _exceptionFromResponse(response, 469 throw _exceptionFromResponse(response,
469 "Error in FileSystemEntity.identical($path1, $path2)", ""); 470 "Error in FileSystemEntity.identical($path1, $path2)", "");
470 } 471 }
471 return response; 472 return response;
472 }); 473 });
473 } 474 }
474 475
475 static final RegExp _absoluteWindowsPathPattern = 476 static final RegExp _absoluteWindowsPathPattern =
476 new RegExp(r'^(\\\\|[a-zA-Z]:[/\\])'); 477 new RegExp(r'^(\\\\|[a-zA-Z]:[/\\])');
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 * 518 *
518 * Comparing a link to its target returns false, as does comparing two links 519 * 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 520 * that point to the same target. To check the target of a link, use
520 * Link.target explicitly to fetch it. Directory links appearing 521 * Link.target explicitly to fetch it. Directory links appearing
521 * inside a path are followed, though, to find the file system object. 522 * inside a path are followed, though, to find the file system object.
522 * 523 *
523 * Throws an error if one of the paths points to an object that does not 524 * Throws an error if one of the paths points to an object that does not
524 * exist. 525 * exist.
525 */ 526 */
526 static bool identicalSync(String path1, String path2) { 527 static bool identicalSync(String path1, String path2) {
527 var result = _identical(path1, path2); 528 var result = _identical(_Namespace._namespace, path1, path2);
528 _throwIfError(result, 'Error in FileSystemEntity.identicalSync'); 529 _throwIfError(result, 'Error in FileSystemEntity.identicalSync');
529 return result; 530 return result;
530 } 531 }
531 532
532 /** 533 /**
533 * Test if [watch] is supported on the current system. 534 * Test if [watch] is supported on the current system.
534 * 535 *
535 * OS X 10.6 and below is not supported. 536 * OS X 10.6 and below is not supported.
536 */ 537 */
537 static bool get isWatchSupported => _FileSystemWatcher.isSupported; 538 static bool get isWatchSupported => _FileSystemWatcher.isSupported;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 static bool isFileSync(String path) => 601 static bool isFileSync(String path) =>
601 (_getTypeSync(path, true) == FileSystemEntityType.FILE._type); 602 (_getTypeSync(path, true) == FileSystemEntityType.FILE._type);
602 603
603 /** 604 /**
604 * Synchronously checks if typeSync(path) returns 605 * Synchronously checks if typeSync(path) returns
605 * FileSystemEntityType.DIRECTORY. 606 * FileSystemEntityType.DIRECTORY.
606 */ 607 */
607 static bool isDirectorySync(String path) => 608 static bool isDirectorySync(String path) =>
608 (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY._type); 609 (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY._type);
609 610
610 external static _getType(String path, bool followLinks); 611 external static _getType(_Namespace namespace, String path, bool followLinks);
611 external static _identical(String path1, String path2); 612 external static _identical(_Namespace namespace, String path1, String path2);
612 external static _resolveSymbolicLinks(String path); 613 external static _resolveSymbolicLinks(_Namespace namespace, String path);
613 614
614 // Finds the next-to-last component when dividing at path separators. 615 // Finds the next-to-last component when dividing at path separators.
615 static final RegExp _parentRegExp = Platform.isWindows 616 static final RegExp _parentRegExp = Platform.isWindows
616 ? new RegExp(r'[^/\\][/\\]+[^/\\]') 617 ? new RegExp(r'[^/\\][/\\]+[^/\\]')
617 : new RegExp(r'[^/]/+[^/]'); 618 : new RegExp(r'[^/]/+[^/]');
618 619
619 /** 620 /**
620 * Removes the final path component of a path, using the platform's 621 * 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 622 * path separator to split the path. Will not remove the root component
622 * of a Windows path, like "C:\\" or "\\\\server_name\\". 623 * of a Windows path, like "C:\\" or "\\\\server_name\\".
(...skipping 23 matching lines...) Expand all
646 return '.'; 647 return '.';
647 } 648 }
648 } 649 }
649 650
650 /** 651 /**
651 * The directory containing [this]. 652 * The directory containing [this].
652 */ 653 */
653 Directory get parent => new Directory(parentOf(path)); 654 Directory get parent => new Directory(parentOf(path));
654 655
655 static int _getTypeSync(String path, bool followLinks) { 656 static int _getTypeSync(String path, bool followLinks) {
656 var result = _getType(path, followLinks); 657 var result = _getType(_Namespace._namespace, path, followLinks);
657 _throwIfError(result, 'Error getting type of FileSystemEntity'); 658 _throwIfError(result, 'Error getting type of FileSystemEntity');
658 return result; 659 return result;
659 } 660 }
660 661
661 static Future<int> _getTypeAsync(String path, bool followLinks) { 662 static Future<int> _getTypeAsync(String path, bool followLinks) {
662 return _IOService 663 return _File._dispatchWithNamespace(
663 ._dispatch(_FILE_TYPE, [path, followLinks]).then((response) { 664 _FILE_TYPE, [null, path, followLinks]).then((response) {
664 if (_isErrorResponse(response)) { 665 if (_isErrorResponse(response)) {
665 throw _exceptionFromResponse(response, "Error getting type", path); 666 throw _exceptionFromResponse(response, "Error getting type", path);
666 } 667 }
667 return response; 668 return response;
668 }); 669 });
669 } 670 }
670 671
671 static _throwIfError(Object result, String msg, [String path]) { 672 static _throwIfError(Object result, String msg, [String path]) {
672 if (result is OSError) { 673 if (result is OSError) {
673 throw new FileSystemException(msg, path, result); 674 throw new FileSystemException(msg, path, result);
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 buffer.write(')'); 824 buffer.write(')');
824 return buffer.toString(); 825 return buffer.toString();
825 } 826 }
826 } 827 }
827 828
828 class _FileSystemWatcher { 829 class _FileSystemWatcher {
829 external static Stream<FileSystemEvent> _watch( 830 external static Stream<FileSystemEvent> _watch(
830 String path, int events, bool recursive); 831 String path, int events, bool recursive);
831 external static bool get isSupported; 832 external static bool get isSupported;
832 } 833 }
OLDNEW
« no previous file with comments | « sdk/lib/io/file_impl.dart ('k') | sdk/lib/io/io.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698