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

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

Issue 16156009: dart:io | Add .stat() and .statSync() to FileSystemEntity and subclasses File, Directory, and Link. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « sdk/lib/io/file_impl.dart ('k') | sdk/lib/io/link.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 class FileSystemEntityType { 7 class FileSystemEntityType {
8 static const FILE = const FileSystemEntityType._internal(0); 8 static const FILE = const FileSystemEntityType._internal(0);
9 static const DIRECTORY = const FileSystemEntityType._internal(1); 9 static const DIRECTORY = const FileSystemEntityType._internal(1);
10 static const LINK = const FileSystemEntityType._internal(2); 10 static const LINK = const FileSystemEntityType._internal(2);
(...skipping 28 matching lines...) Expand all
39 this.modified, 39 this.modified,
40 this.accessed, 40 this.accessed,
41 this.type, 41 this.type,
42 this.mode, 42 this.mode,
43 this.size); 43 this.size);
44 44
45 external static List<int> _statSync(String path); 45 external static List<int> _statSync(String path);
46 46
47 47
48 /** 48 /**
49 * Call the operating system's stat() function on [path]. 49 * Calls the operating system's stat() function on [path].
50 * Returns a [FileStat] object containing the data returned by stat(). 50 * Returns a [FileStat] object containing the data returned by stat().
51 * If the call fails, returns a [FileStat] object with .type set to 51 * If the call fails, returns a [FileStat] object with .type set to
52 * FileSystemEntityType.NOT_FOUND and the other fields invalid. 52 * FileSystemEntityType.NOT_FOUND and the other fields invalid.
53 */ 53 */
54 static FileStat statSync(String path) { 54 static FileStat statSync(String path) {
55 var data = _statSync(path); 55 var data = _statSync(path);
56 if (data is Error) throw data; 56 if (data is Error) throw data;
57 return new FileStat._internal( 57 return new FileStat._internal(
58 new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME] * 1000), 58 new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME] * 1000),
59 new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME] * 1000), 59 new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME] * 1000),
60 new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME] * 1000), 60 new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME] * 1000),
61 FileSystemEntityType._lookup(data[_TYPE]), 61 FileSystemEntityType._lookup(data[_TYPE]),
62 data[_MODE], 62 data[_MODE],
63 data[_SIZE]); 63 data[_SIZE]);
64 } 64 }
65 65
66 /** 66 /**
67 * Asynchronously call the operating system's stat() function on [path]. 67 * Asynchronously calls the operating system's stat() function on [path].
68 * Returns a Future which completes with a [FileStat] object containing 68 * Returns a Future which completes with a [FileStat] object containing
69 * the data returned by stat(). 69 * the data returned by stat().
70 * If the call fails, completes the future with a [FileStat] object with 70 * If the call fails, completes the future with a [FileStat] object with
71 * .type set to FileSystemEntityType.NOT_FOUND and the other fields invalid. 71 * .type set to FileSystemEntityType.NOT_FOUND and the other fields invalid.
72 */ 72 */
73 static Future<FileStat> stat(String path) { 73 static Future<FileStat> stat(String path) {
74 // Get a new file service port for each request. We could also cache one. 74 // Get a new file service port for each request. We could also cache one.
75 var service = _FileUtils._newServicePort(); 75 var service = _FileUtils._newServicePort();
76 List request = new List(2); 76 List request = new List(2);
77 request[0] = _STAT_REQUEST; 77 request[0] = _STAT_REQUEST;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 return service.call(request).then((response) { 186 return service.call(request).then((response) {
187 if (_isErrorResponse(response)) { 187 if (_isErrorResponse(response)) {
188 throw _exceptionFromResponse(response, 188 throw _exceptionFromResponse(response,
189 "Error getting type of '$path'"); 189 "Error getting type of '$path'");
190 } 190 }
191 return response; 191 return response;
192 }); 192 });
193 } 193 }
194 194
195 /** 195 /**
196 * Do two paths refer to the same object in the file system? 196 * Synchronously checks whether two paths refer to the same object in the
197 * Links are not identical to their targets, and two links 197 * file system. Returns a [:Future<bool>:] that completes with the result.
198 * are not identical just because they point to identical targets.
199 * Links in intermediate directories in the paths are followed, though.
200 * 198 *
201 * Throws an error if one of the paths points to an object that does not 199 * Comparing a link to its target returns false, as does comparing two links
202 * exist. 200 * that point to the same target. To check the target of a link, use
203 * The target of a link can be compared by first getting it with Link.target. 201 * Link.target explicitly to fetch it. Directory links appearing
202 * inside a path are followed, though, to find the file system object.
203 *
204 * Completes the returned Future with an error if one of the paths points
205 * to an object that does not exist.
204 */ 206 */
205 static Future<bool> identical(String path1, String path2) { 207 static Future<bool> identical(String path1, String path2) {
206 // Get a new file service port for each request. We could also cache one. 208 // Get a new file service port for each request. We could also cache one.
207 var service = _FileUtils._newServicePort(); 209 var service = _FileUtils._newServicePort();
208 List request = new List(3); 210 List request = new List(3);
209 request[0] = _IDENTICAL_REQUEST; 211 request[0] = _IDENTICAL_REQUEST;
210 request[1] = path1; 212 request[1] = path1;
211 request[2] = path2; 213 request[2] = path2;
212 return service.call(request).then((response) { 214 return service.call(request).then((response) {
213 if (_isErrorResponse(response)) { 215 if (_isErrorResponse(response)) {
214 throw _exceptionFromResponse(response, 216 throw _exceptionFromResponse(response,
215 "Error in FileSystemEntity.identical($path1, $path2)"); 217 "Error in FileSystemEntity.identical($path1, $path2)");
216 } 218 }
217 return response; 219 return response;
218 }); 220 });
219 } 221 }
220 222
221 223
222 /** 224 /**
223 * Do two paths refer to the same object in the file system? 225 * Synchronously checks whether two paths refer to the same object in the
224 * Links are not identical to their targets, and two links 226 * file system.
225 * are not identical just because they point to identical targets. 227 *
226 * Links in intermediate directories in the paths are followed, though. 228 * Comparing a link to its target returns false, as does comparing two links
229 * that point to the same target. To check the target of a link, use
230 * Link.target explicitly to fetch it. Directory links appearing
231 * inside a path are followed, though, to find the file system object.
227 * 232 *
228 * Throws an error if one of the paths points to an object that does not 233 * Throws an error if one of the paths points to an object that does not
229 * exist. 234 * exist.
230 * The target of a link can be compared by first getting it with Link.target.
231 */ 235 */
232 static bool identicalSync(String path1, String path2) { 236 static bool identicalSync(String path1, String path2) {
233 var result = _identical(path1, path2); 237 var result = _identical(path1, path2);
234 _throwIfError(result, 'Error in FileSystemEntity.identicalSync'); 238 _throwIfError(result, 'Error in FileSystemEntity.identicalSync');
235 return result; 239 return result;
236 } 240 }
237 241
238 /** 242 /**
239 * Check whether the file system entity with this path exists. Returns 243 * Checks whether the file system entity with this path exists. Returns
240 * a [:Future<bool>:] that completes with the result. 244 * a [:Future<bool>:] that completes with the result.
241 * 245 *
242 * Since FileSystemEntity is abstract, every FileSystemEntity object 246 * Since FileSystemEntity is abstract, every FileSystemEntity object
243 * is actually an instance of one of the subclasses [File], 247 * is actually an instance of one of the subclasses [File],
244 * [Directory], and [Link]. Calling [exists] on an instance of one 248 * [Directory], and [Link]. Calling [exists] on an instance of one
245 * of these subclasses checks whether the object exists in the file 249 * of these subclasses checks whether the object exists in the file
246 * system object exists and is of the correct type (file, directory, 250 * system object exists and is of the correct type (file, directory,
247 * or link). To check whether a path points to an object on the 251 * or link). To check whether a path points to an object on the
248 * file system, regardless of the object's type, use the [type] 252 * file system, regardless of the object's type, use the [type]
249 * static method. 253 * static method.
250 * 254 *
251 */ 255 */
252 Future<bool> exists(); 256 Future<bool> exists();
253 257
254 /** 258 /**
255 * Synchronously check whether the file system entity with this path 259 * Synchronously checks whether the file system entity with this path
256 * exists. 260 * exists.
257 * 261 *
258 * Since FileSystemEntity is abstract, every FileSystemEntity object 262 * Since FileSystemEntity is abstract, every FileSystemEntity object
259 * is actually an instance of one of the subclasses [File], 263 * is actually an instance of one of the subclasses [File],
260 * [Directory], and [Link]. Calling [existsSync] on an instance of 264 * [Directory], and [Link]. Calling [existsSync] on an instance of
261 * one of these subclasses checks whether the object exists in the 265 * one of these subclasses checks whether the object exists in the
262 * file system object exists and is of the correct type (file, 266 * file system object exists and is of the correct type (file,
263 * directory, or link). To check whether a path points to an object 267 * directory, or link). To check whether a path points to an object
264 * on the file system, regardless of the object's type, use the 268 * on the file system, regardless of the object's type, use the
265 * [typeSync] static method. 269 * [typeSync] static method.
266 */ 270 */
267 bool existsSync(); 271 bool existsSync();
268 272
273 /**
274 * Calls the operating system's stat() function on the [path] of this
275 * [FileSystemEntity]. Identical to [:FileStat.stat(this.path):].
276 *
277 * Returns a [:Future<FileStat>:] object containing the data returned by
278 * stat().
279 *
280 * If the call fails, completes the future with a [FileStat] object
281 * with .type set to
282 * FileSystemEntityType.NOT_FOUND and the other fields invalid.
283 */
284 Future<FileStat> stat();
285
286 /**
287 * Synchronously calls the operating system's stat() function on the
288 * [path] of this [FileSystemEntity].
289 * Identical to [:FileStat.statSync(this.path):].
290 *
291 * Returns a [FileStat] object containing the data returned by stat().
292 *
293 * If the call fails, returns a [FileStat] object with .type set to
294 * FileSystemEntityType.NOT_FOUND and the other fields invalid.
295 */
296 FileStat statSync();
297
298
299 /**
300 * Finds the type of file system object that a path points to. Returns
301 * a [:Future<FileSystemEntityType>:] that completes with the result.
302 *
303 * [FileSystemEntityType] has the constant instances FILE, DIRECTORY,
304 * LINK, and NOT_FOUND. [type] will return LINK only if the optional
305 * named argument [followLinks] is false, and [path] points to a link.
306 * If the path does not point to a file system object, or any other error
307 * occurs in looking up the path, NOT_FOUND is returned. The only
308 * error or exception that may be put on the returned future is ArgumentError,
309 * caused by passing the wrong type of arguments to the function.
310 */
269 static Future<FileSystemEntityType> type(String path, 311 static Future<FileSystemEntityType> type(String path,
270 {bool followLinks: true}) 312 {bool followLinks: true})
271 => _getTypeAsync(path, followLinks).then(FileSystemEntityType._lookup); 313 => _getTypeAsync(path, followLinks).then(FileSystemEntityType._lookup);
272 314
315 /**
316 * Synchronously finds the type of file system object that a path points to.
317 * Returns a [FileSystemEntityType].
318 *
319 * [FileSystemEntityType] has the constant instances FILE, DIRECTORY,
320 * LINK, and NOT_FOUND. [type] will return LINK only if the optional
321 * named argument [followLinks] is false, and [path] points to a link.
322 * If the path does not point to a file system object, or any other error
323 * occurs in looking up the path, NOT_FOUND is returned. The only
324 * error or exception that may be thrown is ArgumentError,
325 * caused by passing the wrong type of arguments to the function.
326 */
273 static FileSystemEntityType typeSync(String path, {bool followLinks: true}) 327 static FileSystemEntityType typeSync(String path, {bool followLinks: true})
274 => FileSystemEntityType._lookup(_getTypeSync(path, followLinks)); 328 => FileSystemEntityType._lookup(_getTypeSync(path, followLinks));
275 329
330
331 /**
332 * Checks if type(path, followLinks: false) returns
333 * FileSystemEntityType.LINK.
334 */
276 static Future<bool> isLink(String path) => _getTypeAsync(path, false) 335 static Future<bool> isLink(String path) => _getTypeAsync(path, false)
277 .then((type) => (type == FileSystemEntityType.LINK._type)); 336 .then((type) => (type == FileSystemEntityType.LINK._type));
278 337
338 /**
339 * Checks if type(path) returns FileSystemEntityType.FILE.
340 */
279 static Future<bool> isFile(String path) => _getTypeAsync(path, true) 341 static Future<bool> isFile(String path) => _getTypeAsync(path, true)
280 .then((type) => (type == FileSystemEntityType.FILE._type)); 342 .then((type) => (type == FileSystemEntityType.FILE._type));
281 343
344 /**
345 * Checks if type(path) returns FileSystemEntityType.DIRECTORY.
346 */
282 static Future<bool> isDirectory(String path) => _getTypeAsync(path, true) 347 static Future<bool> isDirectory(String path) => _getTypeAsync(path, true)
283 .then((type) => (type == FileSystemEntityType.DIRECTORY._type)); 348 .then((type) => (type == FileSystemEntityType.DIRECTORY._type));
284 349
350 /**
351 * Synchronously checks if typeSync(path, followLinks: false) returns
352 * FileSystemEntityType.LINK.
353 */
285 static bool isLinkSync(String path) => 354 static bool isLinkSync(String path) =>
286 (_getTypeSync(path, false) == FileSystemEntityType.LINK._type); 355 (_getTypeSync(path, false) == FileSystemEntityType.LINK._type);
287 356
357 /**
358 * Synchronously checks if typeSync(path) returns
359 * FileSystemEntityType.FILE.
360 */
288 static bool isFileSync(String path) => 361 static bool isFileSync(String path) =>
289 (_getTypeSync(path, true) == FileSystemEntityType.FILE._type); 362 (_getTypeSync(path, true) == FileSystemEntityType.FILE._type);
290 363
364 /**
365 * Synchronously checks if typeSync(path) returns
366 * FileSystemEntityType.DIRECTORY.
367 */
291 static bool isDirectorySync(String path) => 368 static bool isDirectorySync(String path) =>
292 (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY._type); 369 (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY._type);
293 370
371
294 static _throwIfError(Object result, String msg) { 372 static _throwIfError(Object result, String msg) {
295 if (result is OSError) { 373 if (result is OSError) {
296 throw new FileIOException(msg, result); 374 throw new FileIOException(msg, result);
297 } else if (result is ArgumentError) { 375 } else if (result is ArgumentError) {
298 throw result; 376 throw result;
299 } 377 }
300 } 378 }
301 } 379 }
OLDNEW
« no previous file with comments | « sdk/lib/io/file_impl.dart ('k') | sdk/lib/io/link.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698