@@ -249,9 +249,9 @@ pub struct DirBuilder {
249249pub fn read < P : AsRef < Path > > ( path : P ) -> io:: Result < Vec < u8 > > {
250250 fn inner ( path : & Path ) -> io:: Result < Vec < u8 > > {
251251 let mut file = File :: open ( path) ?;
252- let size = file. metadata ( ) . map ( |m| m. len ( ) ) . unwrap_or ( 0 ) ;
253- let mut bytes = Vec :: with_capacity ( size as usize ) ;
254- io:: default_read_to_end ( & mut file, & mut bytes) ?;
252+ let size = file. metadata ( ) . map ( |m| m. len ( ) as usize ) . ok ( ) ;
253+ let mut bytes = Vec :: with_capacity ( size. unwrap_or ( 0 ) ) ;
254+ io:: default_read_to_end ( & mut file, & mut bytes, size ) ?;
255255 Ok ( bytes)
256256 }
257257 inner ( path. as_ref ( ) )
@@ -289,9 +289,9 @@ pub fn read<P: AsRef<Path>>(path: P) -> io::Result<Vec<u8>> {
289289pub fn read_to_string < P : AsRef < Path > > ( path : P ) -> io:: Result < String > {
290290 fn inner ( path : & Path ) -> io:: Result < String > {
291291 let mut file = File :: open ( path) ?;
292- let size = file. metadata ( ) . map ( |m| m. len ( ) ) . unwrap_or ( 0 ) ;
293- let mut string = String :: with_capacity ( size as usize ) ;
294- io:: default_read_to_string ( & mut file, & mut string) ?;
292+ let size = file. metadata ( ) . map ( |m| m. len ( ) as usize ) . ok ( ) ;
293+ let mut string = String :: with_capacity ( size. unwrap_or ( 0 ) ) ;
294+ io:: default_read_to_string ( & mut file, & mut string, size ) ?;
295295 Ok ( string)
296296 }
297297 inner ( path. as_ref ( ) )
@@ -732,12 +732,12 @@ impl fmt::Debug for File {
732732}
733733
734734/// Indicates how much extra capacity is needed to read the rest of the file.
735- fn buffer_capacity_required ( mut file : & File ) -> usize {
736- let size = file. metadata ( ) . map ( |m| m. len ( ) ) . unwrap_or ( 0 ) ;
737- let pos = file. stream_position ( ) . unwrap_or ( 0 ) ;
735+ fn buffer_capacity_required ( mut file : & File ) -> Option < usize > {
736+ let size = file. metadata ( ) . map ( |m| m. len ( ) ) . ok ( ) ? ;
737+ let pos = file. stream_position ( ) . ok ( ) ? ;
738738 // Don't worry about `usize` overflow because reading will fail regardless
739739 // in that case.
740- size. saturating_sub ( pos) as usize
740+ Some ( size. saturating_sub ( pos) as usize )
741741}
742742
743743#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -761,14 +761,16 @@ impl Read for File {
761761
762762 // Reserves space in the buffer based on the file size when available.
763763 fn read_to_end ( & mut self , buf : & mut Vec < u8 > ) -> io:: Result < usize > {
764- buf. reserve ( buffer_capacity_required ( self ) ) ;
765- io:: default_read_to_end ( self , buf)
764+ let size = buffer_capacity_required ( self ) ;
765+ buf. reserve ( size. unwrap_or ( 0 ) ) ;
766+ io:: default_read_to_end ( self , buf, size)
766767 }
767768
768769 // Reserves space in the buffer based on the file size when available.
769770 fn read_to_string ( & mut self , buf : & mut String ) -> io:: Result < usize > {
770- buf. reserve ( buffer_capacity_required ( self ) ) ;
771- io:: default_read_to_string ( self , buf)
771+ let size = buffer_capacity_required ( self ) ;
772+ buf. reserve ( size. unwrap_or ( 0 ) ) ;
773+ io:: default_read_to_string ( self , buf, size)
772774 }
773775}
774776#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -817,14 +819,16 @@ impl Read for &File {
817819
818820 // Reserves space in the buffer based on the file size when available.
819821 fn read_to_end ( & mut self , buf : & mut Vec < u8 > ) -> io:: Result < usize > {
820- buf. reserve ( buffer_capacity_required ( self ) ) ;
821- io:: default_read_to_end ( self , buf)
822+ let size = buffer_capacity_required ( self ) ;
823+ buf. reserve ( size. unwrap_or ( 0 ) ) ;
824+ io:: default_read_to_end ( self , buf, size)
822825 }
823826
824827 // Reserves space in the buffer based on the file size when available.
825828 fn read_to_string ( & mut self , buf : & mut String ) -> io:: Result < usize > {
826- buf. reserve ( buffer_capacity_required ( self ) ) ;
827- io:: default_read_to_string ( self , buf)
829+ let size = buffer_capacity_required ( self ) ;
830+ buf. reserve ( size. unwrap_or ( 0 ) ) ;
831+ io:: default_read_to_string ( self , buf, size)
828832 }
829833}
830834#[ stable( feature = "rust1" , since = "1.0.0" ) ]
0 commit comments