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 // Read the file in blocks of size 64k. | 7 // Read the file in blocks of size 64k. |
8 const int _BLOCK_SIZE = 64 * 1024; | 8 const int _BLOCK_SIZE = 64 * 1024; |
9 | 9 |
10 | 10 |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 throwIfError(ms, "Cannot retrieve modification time", path); | 362 throwIfError(ms, "Cannot retrieve modification time", path); |
363 return new DateTime.fromMillisecondsSinceEpoch(ms); | 363 return new DateTime.fromMillisecondsSinceEpoch(ms); |
364 } | 364 } |
365 | 365 |
366 external static _open(String path, int mode); | 366 external static _open(String path, int mode); |
367 | 367 |
368 RandomAccessFile openSync({FileMode mode: FileMode.READ}) { | 368 RandomAccessFile openSync({FileMode mode: FileMode.READ}) { |
369 if (mode != FileMode.READ && | 369 if (mode != FileMode.READ && |
370 mode != FileMode.WRITE && | 370 mode != FileMode.WRITE && |
371 mode != FileMode.APPEND) { | 371 mode != FileMode.APPEND) { |
372 throw new FileException("Unknown file mode. Use FileMode.READ, " | 372 throw new FileSystemException("Unknown file mode. Use FileMode.READ, " |
373 "FileMode.WRITE or FileMode.APPEND.", | 373 "FileMode.WRITE or FileMode.APPEND.", |
374 path); | 374 path); |
375 } | 375 } |
376 var id = _open(path, mode._mode); | 376 var id = _open(path, mode._mode); |
377 throwIfError(id, "Cannot open file", path); | 377 throwIfError(id, "Cannot open file", path); |
378 return new _RandomAccessFile(id, path); | 378 return new _RandomAccessFile(id, path); |
379 } | 379 } |
380 | 380 |
381 external static int _openStdio(int fd); | 381 external static int _openStdio(int fd); |
382 | 382 |
383 static RandomAccessFile _openStdioSync(int fd) { | 383 static RandomAccessFile _openStdioSync(int fd) { |
384 var id = _openStdio(fd); | 384 var id = _openStdio(fd); |
385 if (id == 0) { | 385 if (id == 0) { |
386 throw new FileException("Cannot open stdio file for: $fd"); | 386 throw new FileSystemException("Cannot open stdio file for: $fd"); |
387 } | 387 } |
388 return new _RandomAccessFile(id, ""); | 388 return new _RandomAccessFile(id, ""); |
389 } | 389 } |
390 | 390 |
391 Future<String> fullPath() => resolveSymbolicLinks(); | 391 Future<String> fullPath() => resolveSymbolicLinks(); |
392 | 392 |
393 String fullPathSync() => resolveSymbolicLinksSync(); | 393 String fullPathSync() => resolveSymbolicLinksSync(); |
394 | 394 |
395 Stream<List<int>> openRead([int start, int end]) { | 395 Stream<List<int>> openRead([int start, int end]) { |
396 return new _FileStream(path, start, end); | 396 return new _FileStream(path, start, end); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 builder.add(data); | 430 builder.add(data); |
431 } | 431 } |
432 opened.closeSync(); | 432 opened.closeSync(); |
433 return builder.takeBytes(); | 433 return builder.takeBytes(); |
434 } | 434 } |
435 | 435 |
436 String _tryDecode(List<int> bytes, Encoding encoding) { | 436 String _tryDecode(List<int> bytes, Encoding encoding) { |
437 try { | 437 try { |
438 return encoding.decode(bytes); | 438 return encoding.decode(bytes); |
439 } catch (_) { | 439 } catch (_) { |
440 throw new FileException( | 440 throw new FileSystemException( |
441 "Failed to decode data using encoding '${encoding.name}'", path); | 441 "Failed to decode data using encoding '${encoding.name}'", path); |
442 } | 442 } |
443 } | 443 } |
444 | 444 |
445 Future<String> readAsString({Encoding encoding: UTF8}) { | 445 Future<String> readAsString({Encoding encoding: UTF8}) { |
446 return readAsBytes().then((bytes) { | 446 return readAsBytes().then((bytes) { |
447 return _tryDecode(bytes, encoding); | 447 return _tryDecode(bytes, encoding); |
448 }); | 448 }); |
449 } | 449 } |
450 | 450 |
451 String readAsStringSync({Encoding encoding: UTF8}) { | 451 String readAsStringSync({Encoding encoding: UTF8}) { |
452 List<int> bytes = readAsBytesSync(); | 452 List<int> bytes = readAsBytesSync(); |
453 return _tryDecode(bytes, encoding); | 453 return _tryDecode(bytes, encoding); |
454 } | 454 } |
455 | 455 |
456 List<String> _decodeLines(List<int> bytes, Encoding encoding) { | 456 List<String> _decodeLines(List<int> bytes, Encoding encoding) { |
457 if (bytes.length == 0) return []; | 457 if (bytes.length == 0) return []; |
458 var list = []; | 458 var list = []; |
459 var controller = new StreamController(sync: true); | 459 var controller = new StreamController(sync: true); |
460 var error = null; | 460 var error = null; |
461 controller.stream | 461 controller.stream |
462 .transform(encoding.decoder) | 462 .transform(encoding.decoder) |
463 .transform(new LineSplitter()) | 463 .transform(new LineSplitter()) |
464 .listen((line) => list.add(line), onError: (e) => error = e); | 464 .listen((line) => list.add(line), onError: (e) => error = e); |
465 controller.add(bytes); | 465 controller.add(bytes); |
466 controller.close(); | 466 controller.close(); |
467 if (error != null) { | 467 if (error != null) { |
468 throw new FileException( | 468 throw new FileSystemException( |
469 "Failed to decode data using encoding '${encoding.name}'", path); | 469 "Failed to decode data using encoding '${encoding.name}'", path); |
470 } | 470 } |
471 return list; | 471 return list; |
472 } | 472 } |
473 | 473 |
474 Future<List<String>> readAsLines({Encoding encoding: UTF8}) { | 474 Future<List<String>> readAsLines({Encoding encoding: UTF8}) { |
475 return readAsBytes().then((bytes) { | 475 return readAsBytes().then((bytes) { |
476 return _decodeLines(bytes, encoding); | 476 return _decodeLines(bytes, encoding); |
477 }); | 477 }); |
478 } | 478 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 void writeAsStringSync(String contents, | 512 void writeAsStringSync(String contents, |
513 {FileMode mode: FileMode.WRITE, | 513 {FileMode mode: FileMode.WRITE, |
514 Encoding encoding: UTF8}) { | 514 Encoding encoding: UTF8}) { |
515 writeAsBytesSync(encoding.encode(contents), mode: mode); | 515 writeAsBytesSync(encoding.encode(contents), mode: mode); |
516 } | 516 } |
517 | 517 |
518 String toString() => "File: '$path'"; | 518 String toString() => "File: '$path'"; |
519 | 519 |
520 static throwIfError(Object result, String msg, String path) { | 520 static throwIfError(Object result, String msg, String path) { |
521 if (result is OSError) { | 521 if (result is OSError) { |
522 throw new FileException(msg, path, result); | 522 throw new FileSystemException(msg, path, result); |
523 } | 523 } |
524 } | 524 } |
525 } | 525 } |
526 | 526 |
527 | 527 |
528 class _RandomAccessFile implements RandomAccessFile { | 528 class _RandomAccessFile implements RandomAccessFile { |
529 final String path; | 529 final String path; |
530 int _id; | 530 int _id; |
531 bool _asyncDispatched = false; | 531 bool _asyncDispatched = false; |
532 SendPort _fileService; | 532 SendPort _fileService; |
533 | 533 |
534 _RandomAccessFile(int this._id, String this.path); | 534 _RandomAccessFile(int this._id, String this.path); |
535 | 535 |
536 Future<RandomAccessFile> close() { | 536 Future<RandomAccessFile> close() { |
537 return _dispatch(_FILE_CLOSE, [_id], markClosed: true).then((result) { | 537 return _dispatch(_FILE_CLOSE, [_id], markClosed: true).then((result) { |
538 if (result != -1) { | 538 if (result != -1) { |
539 _id = result; | 539 _id = result; |
540 return this; | 540 return this; |
541 } else { | 541 } else { |
542 throw new FileException("Cannot close file", path); | 542 throw new FileSystemException("Cannot close file", path); |
543 } | 543 } |
544 }); | 544 }); |
545 } | 545 } |
546 | 546 |
547 external static int _close(int id); | 547 external static int _close(int id); |
548 | 548 |
549 void closeSync() { | 549 void closeSync() { |
550 _checkAvailable(); | 550 _checkAvailable(); |
551 var id = _close(_id); | 551 var id = _close(_id); |
552 if (id == -1) { | 552 if (id == -1) { |
553 throw new FileException("Cannot close file", path); | 553 throw new FileSystemException("Cannot close file", path); |
554 } | 554 } |
555 _id = id; | 555 _id = id; |
556 } | 556 } |
557 | 557 |
558 Future<int> readByte() { | 558 Future<int> readByte() { |
559 return _dispatch(_FILE_READ_BYTE, [_id]).then((response) { | 559 return _dispatch(_FILE_READ_BYTE, [_id]).then((response) { |
560 if (_isErrorResponse(response)) { | 560 if (_isErrorResponse(response)) { |
561 throw _exceptionFromResponse(response, "readByte failed", path); | 561 throw _exceptionFromResponse(response, "readByte failed", path); |
562 } | 562 } |
563 return response; | 563 return response; |
564 }); | 564 }); |
565 } | 565 } |
566 | 566 |
567 external static _readByte(int id); | 567 external static _readByte(int id); |
568 | 568 |
569 int readByteSync() { | 569 int readByteSync() { |
570 _checkAvailable(); | 570 _checkAvailable(); |
571 var result = _readByte(_id); | 571 var result = _readByte(_id); |
572 if (result is OSError) { | 572 if (result is OSError) { |
573 throw new FileException("readByte failed", path, result); | 573 throw new FileSystemException("readByte failed", path, result); |
574 } | 574 } |
575 return result; | 575 return result; |
576 } | 576 } |
577 | 577 |
578 Future<List<int>> read(int bytes) { | 578 Future<List<int>> read(int bytes) { |
579 if (bytes is !int) { | 579 if (bytes is !int) { |
580 throw new ArgumentError(bytes); | 580 throw new ArgumentError(bytes); |
581 } | 581 } |
582 return _dispatch(_FILE_READ, [_id, bytes]).then((response) { | 582 return _dispatch(_FILE_READ, [_id, bytes]).then((response) { |
583 if (_isErrorResponse(response)) { | 583 if (_isErrorResponse(response)) { |
584 throw _exceptionFromResponse(response, "read failed", path); | 584 throw _exceptionFromResponse(response, "read failed", path); |
585 } | 585 } |
586 return response[1]; | 586 return response[1]; |
587 }); | 587 }); |
588 } | 588 } |
589 | 589 |
590 external static _read(int id, int bytes); | 590 external static _read(int id, int bytes); |
591 | 591 |
592 List<int> readSync(int bytes) { | 592 List<int> readSync(int bytes) { |
593 _checkAvailable(); | 593 _checkAvailable(); |
594 if (bytes is !int) { | 594 if (bytes is !int) { |
595 throw new ArgumentError(bytes); | 595 throw new ArgumentError(bytes); |
596 } | 596 } |
597 var result = _read(_id, bytes); | 597 var result = _read(_id, bytes); |
598 if (result is OSError) { | 598 if (result is OSError) { |
599 throw new FileException("readSync failed", path, result); | 599 throw new FileSystemException("readSync failed", path, result); |
600 } | 600 } |
601 return result; | 601 return result; |
602 } | 602 } |
603 | 603 |
604 Future<int> readInto(List<int> buffer, [int start, int end]) { | 604 Future<int> readInto(List<int> buffer, [int start, int end]) { |
605 if (buffer is !List || | 605 if (buffer is !List || |
606 (start != null && start is !int) || | 606 (start != null && start is !int) || |
607 (end != null && end is !int)) { | 607 (end != null && end is !int)) { |
608 throw new ArgumentError(); | 608 throw new ArgumentError(); |
609 } | 609 } |
(...skipping 27 matching lines...) Expand all Loading... |
637 (start != null && start is !int) || | 637 (start != null && start is !int) || |
638 (end != null && end is !int)) { | 638 (end != null && end is !int)) { |
639 throw new ArgumentError(); | 639 throw new ArgumentError(); |
640 } | 640 } |
641 if (start == null) start = 0; | 641 if (start == null) start = 0; |
642 if (end == null) end = buffer.length; | 642 if (end == null) end = buffer.length; |
643 if (end == start) return 0; | 643 if (end == start) return 0; |
644 _checkReadWriteListArguments(buffer.length, start, end); | 644 _checkReadWriteListArguments(buffer.length, start, end); |
645 var result = _readInto(_id, buffer, start, end); | 645 var result = _readInto(_id, buffer, start, end); |
646 if (result is OSError) { | 646 if (result is OSError) { |
647 throw new FileException("readInto failed", path, result); | 647 throw new FileSystemException("readInto failed", path, result); |
648 } | 648 } |
649 return result; | 649 return result; |
650 } | 650 } |
651 | 651 |
652 Future<RandomAccessFile> writeByte(int value) { | 652 Future<RandomAccessFile> writeByte(int value) { |
653 if (value is !int) { | 653 if (value is !int) { |
654 throw new ArgumentError(value); | 654 throw new ArgumentError(value); |
655 } | 655 } |
656 return _dispatch(_FILE_WRITE_BYTE, [_id, value]).then((response) { | 656 return _dispatch(_FILE_WRITE_BYTE, [_id, value]).then((response) { |
657 if (_isErrorResponse(response)) { | 657 if (_isErrorResponse(response)) { |
658 throw _exceptionFromResponse(response, "writeByte failed", path); | 658 throw _exceptionFromResponse(response, "writeByte failed", path); |
659 } | 659 } |
660 return this; | 660 return this; |
661 }); | 661 }); |
662 } | 662 } |
663 | 663 |
664 external static _writeByte(int id, int value); | 664 external static _writeByte(int id, int value); |
665 | 665 |
666 int writeByteSync(int value) { | 666 int writeByteSync(int value) { |
667 _checkAvailable(); | 667 _checkAvailable(); |
668 if (value is !int) { | 668 if (value is !int) { |
669 throw new ArgumentError(value); | 669 throw new ArgumentError(value); |
670 } | 670 } |
671 var result = _writeByte(_id, value); | 671 var result = _writeByte(_id, value); |
672 if (result is OSError) { | 672 if (result is OSError) { |
673 throw new FileException("writeByte failed", path, result); | 673 throw new FileSystemException("writeByte failed", path, result); |
674 } | 674 } |
675 return result; | 675 return result; |
676 } | 676 } |
677 | 677 |
678 Future<RandomAccessFile> writeFrom(List<int> buffer, [int start, int end]) { | 678 Future<RandomAccessFile> writeFrom(List<int> buffer, [int start, int end]) { |
679 if ((buffer is !List && buffer is !ByteData) || | 679 if ((buffer is !List && buffer is !ByteData) || |
680 (start != null && start is !int) || | 680 (start != null && start is !int) || |
681 (end != null && end is !int)) { | 681 (end != null && end is !int)) { |
682 throw new ArgumentError("Invalid arguments to writeFrom"); | 682 throw new ArgumentError("Invalid arguments to writeFrom"); |
683 } | 683 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
715 if (end == null) end = buffer.length; | 715 if (end == null) end = buffer.length; |
716 if (end == start) return; | 716 if (end == start) return; |
717 _checkReadWriteListArguments(buffer.length, start, end); | 717 _checkReadWriteListArguments(buffer.length, start, end); |
718 _BufferAndStart bufferAndStart = | 718 _BufferAndStart bufferAndStart = |
719 _ensureFastAndSerializableByteData(buffer, start, end); | 719 _ensureFastAndSerializableByteData(buffer, start, end); |
720 var result = _writeFrom(_id, | 720 var result = _writeFrom(_id, |
721 bufferAndStart.buffer, | 721 bufferAndStart.buffer, |
722 bufferAndStart.start, | 722 bufferAndStart.start, |
723 end - (start - bufferAndStart.start)); | 723 end - (start - bufferAndStart.start)); |
724 if (result is OSError) { | 724 if (result is OSError) { |
725 throw new FileException("writeFrom failed", path, result); | 725 throw new FileSystemException("writeFrom failed", path, result); |
726 } | 726 } |
727 } | 727 } |
728 | 728 |
729 Future<RandomAccessFile> writeString(String string, | 729 Future<RandomAccessFile> writeString(String string, |
730 {Encoding encoding: UTF8}) { | 730 {Encoding encoding: UTF8}) { |
731 if (encoding is! Encoding) { | 731 if (encoding is! Encoding) { |
732 throw new ArgumentError(encoding); | 732 throw new ArgumentError(encoding); |
733 } | 733 } |
734 var data = encoding.encode(string); | 734 var data = encoding.encode(string); |
735 return writeFrom(data, 0, data.length); | 735 return writeFrom(data, 0, data.length); |
(...skipping 15 matching lines...) Expand all Loading... |
751 return response; | 751 return response; |
752 }); | 752 }); |
753 } | 753 } |
754 | 754 |
755 external static _position(int id); | 755 external static _position(int id); |
756 | 756 |
757 int positionSync() { | 757 int positionSync() { |
758 _checkAvailable(); | 758 _checkAvailable(); |
759 var result = _position(_id); | 759 var result = _position(_id); |
760 if (result is OSError) { | 760 if (result is OSError) { |
761 throw new FileException("position failed", path, result); | 761 throw new FileSystemException("position failed", path, result); |
762 } | 762 } |
763 return result; | 763 return result; |
764 } | 764 } |
765 | 765 |
766 Future<RandomAccessFile> setPosition(int position) { | 766 Future<RandomAccessFile> setPosition(int position) { |
767 return _dispatch(_FILE_SET_POSITION, [_id, position]) | 767 return _dispatch(_FILE_SET_POSITION, [_id, position]) |
768 .then((response) { | 768 .then((response) { |
769 if (_isErrorResponse(response)) { | 769 if (_isErrorResponse(response)) { |
770 throw _exceptionFromResponse(response, "setPosition failed", path); | 770 throw _exceptionFromResponse(response, "setPosition failed", path); |
771 } | 771 } |
772 return this; | 772 return this; |
773 }); | 773 }); |
774 } | 774 } |
775 | 775 |
776 external static _setPosition(int id, int position); | 776 external static _setPosition(int id, int position); |
777 | 777 |
778 void setPositionSync(int position) { | 778 void setPositionSync(int position) { |
779 _checkAvailable(); | 779 _checkAvailable(); |
780 var result = _setPosition(_id, position); | 780 var result = _setPosition(_id, position); |
781 if (result is OSError) { | 781 if (result is OSError) { |
782 throw new FileException("setPosition failed", path, result); | 782 throw new FileSystemException("setPosition failed", path, result); |
783 } | 783 } |
784 } | 784 } |
785 | 785 |
786 Future<RandomAccessFile> truncate(int length) { | 786 Future<RandomAccessFile> truncate(int length) { |
787 return _dispatch(_FILE_TRUNCATE, [_id, length]).then((response) { | 787 return _dispatch(_FILE_TRUNCATE, [_id, length]).then((response) { |
788 if (_isErrorResponse(response)) { | 788 if (_isErrorResponse(response)) { |
789 throw _exceptionFromResponse(response, "truncate failed", path); | 789 throw _exceptionFromResponse(response, "truncate failed", path); |
790 } | 790 } |
791 return this; | 791 return this; |
792 }); | 792 }); |
793 } | 793 } |
794 | 794 |
795 external static _truncate(int id, int length); | 795 external static _truncate(int id, int length); |
796 | 796 |
797 void truncateSync(int length) { | 797 void truncateSync(int length) { |
798 _checkAvailable(); | 798 _checkAvailable(); |
799 var result = _truncate(_id, length); | 799 var result = _truncate(_id, length); |
800 if (result is OSError) { | 800 if (result is OSError) { |
801 throw new FileException("truncate failed", path, result); | 801 throw new FileSystemException("truncate failed", path, result); |
802 } | 802 } |
803 } | 803 } |
804 | 804 |
805 Future<int> length() { | 805 Future<int> length() { |
806 return _dispatch(_FILE_LENGTH, [_id]).then((response) { | 806 return _dispatch(_FILE_LENGTH, [_id]).then((response) { |
807 if (_isErrorResponse(response)) { | 807 if (_isErrorResponse(response)) { |
808 throw _exceptionFromResponse(response, "length failed", path); | 808 throw _exceptionFromResponse(response, "length failed", path); |
809 } | 809 } |
810 return response; | 810 return response; |
811 }); | 811 }); |
812 } | 812 } |
813 | 813 |
814 external static _length(int id); | 814 external static _length(int id); |
815 | 815 |
816 int lengthSync() { | 816 int lengthSync() { |
817 _checkAvailable(); | 817 _checkAvailable(); |
818 var result = _length(_id); | 818 var result = _length(_id); |
819 if (result is OSError) { | 819 if (result is OSError) { |
820 throw new FileException("length failed", path, result); | 820 throw new FileSystemException("length failed", path, result); |
821 } | 821 } |
822 return result; | 822 return result; |
823 } | 823 } |
824 | 824 |
825 Future<RandomAccessFile> flush() { | 825 Future<RandomAccessFile> flush() { |
826 return _dispatch(_FILE_FLUSH, [_id]).then((response) { | 826 return _dispatch(_FILE_FLUSH, [_id]).then((response) { |
827 if (_isErrorResponse(response)) { | 827 if (_isErrorResponse(response)) { |
828 throw _exceptionFromResponse(response, | 828 throw _exceptionFromResponse(response, |
829 "flush failed", | 829 "flush failed", |
830 path); | 830 path); |
831 } | 831 } |
832 return this; | 832 return this; |
833 }); | 833 }); |
834 } | 834 } |
835 | 835 |
836 external static _flush(int id); | 836 external static _flush(int id); |
837 | 837 |
838 void flushSync() { | 838 void flushSync() { |
839 _checkAvailable(); | 839 _checkAvailable(); |
840 var result = _flush(_id); | 840 var result = _flush(_id); |
841 if (result is OSError) { | 841 if (result is OSError) { |
842 throw new FileException("flush failed", path, result); | 842 throw new FileSystemException("flush failed", path, result); |
843 } | 843 } |
844 } | 844 } |
845 | 845 |
846 bool get closed => _id == 0; | 846 bool get closed => _id == 0; |
847 | 847 |
848 Future _dispatch(int request, List data, { bool markClosed: false }) { | 848 Future _dispatch(int request, List data, { bool markClosed: false }) { |
849 if (closed) { | 849 if (closed) { |
850 return new Future.error(new FileException("File closed", path)); | 850 return new Future.error(new FileSystemException("File closed", path)); |
851 } | 851 } |
852 if (_asyncDispatched) { | 852 if (_asyncDispatched) { |
853 var msg = "An async operation is currently pending"; | 853 var msg = "An async operation is currently pending"; |
854 return new Future.error(new FileException(msg, path)); | 854 return new Future.error(new FileSystemException(msg, path)); |
855 } | 855 } |
856 if (markClosed) { | 856 if (markClosed) { |
857 // Set the id_ to 0 (NULL) to ensure the no more async requests | 857 // Set the id_ to 0 (NULL) to ensure the no more async requests |
858 // can be issued for this file. | 858 // can be issued for this file. |
859 _id = 0; | 859 _id = 0; |
860 } | 860 } |
861 _asyncDispatched = true; | 861 _asyncDispatched = true; |
862 return _IOService.dispatch(request, data) | 862 return _IOService.dispatch(request, data) |
863 .whenComplete(() { | 863 .whenComplete(() { |
864 _asyncDispatched = false; | 864 _asyncDispatched = false; |
865 }); | 865 }); |
866 } | 866 } |
867 | 867 |
868 void _checkAvailable() { | 868 void _checkAvailable() { |
869 if (_asyncDispatched) { | 869 if (_asyncDispatched) { |
870 throw new FileException("An async operation is currently pending", path); | 870 throw new FileSystemException("An async operation is currently pending", p
ath); |
871 } | 871 } |
872 if (closed) { | 872 if (closed) { |
873 throw new FileException("File closed", path); | 873 throw new FileSystemException("File closed", path); |
874 } | 874 } |
875 } | 875 } |
876 } | 876 } |
OLD | NEW |