@@ -165,10 +165,20 @@ fs.existsSync = function(path) {
165165 }
166166} ;
167167
168- fs . readFile = function ( path , encoding_ ) {
169- var encoding = typeof ( encoding_ ) === 'string' ? encoding_ : null ;
168+ fs . readFile = function ( path , options , callback_ ) {
170169 var callback = maybeCallback ( arguments [ arguments . length - 1 ] ) ;
171170
171+ if ( typeof options === 'function' || ! options ) {
172+ options = { encoding : null , flag : 'r' } ;
173+ } else if ( typeof options === 'string' ) {
174+ options = { encoding : options , flag : 'r' } ;
175+ } else if ( ! options ) {
176+ options = { encoding : null , flag : 'r' } ;
177+ } else if ( typeof options !== 'object' ) {
178+ throw new TypeError ( 'Bad arguments' ) ;
179+ }
180+
181+ var encoding = options . encoding ;
172182 assertEncoding ( encoding ) ;
173183
174184 // first, stat the file, so we know the size.
@@ -178,7 +188,8 @@ fs.readFile = function(path, encoding_) {
178188 var pos = 0 ;
179189 var fd ;
180190
181- fs . open ( path , constants . O_RDONLY , 438 /*=0666*/ , function ( er , fd_ ) {
191+ var flag = options . flag || 'r' ;
192+ fs . open ( path , flag , 438 /*=0666*/ , function ( er , fd_ ) {
182193 if ( er ) return callback ( er ) ;
183194 fd = fd_ ;
184195
@@ -243,10 +254,20 @@ fs.readFile = function(path, encoding_) {
243254 }
244255} ;
245256
246- fs . readFileSync = function ( path , encoding ) {
257+ fs . readFileSync = function ( path , options ) {
258+ if ( ! options ) {
259+ options = { encoding : null , flag : 'r' } ;
260+ } else if ( typeof options === 'string' ) {
261+ options = { encoding : options , flag : 'r' } ;
262+ } else if ( typeof options !== 'object' ) {
263+ throw new TypeError ( 'Bad arguments' ) ;
264+ }
265+
266+ var encoding = options . encoding ;
247267 assertEncoding ( encoding ) ;
248268
249- var fd = fs . openSync ( path , constants . O_RDONLY , 438 /*=0666*/ ) ;
269+ var flag = options . flag || 'r' ;
270+ var fd = fs . openSync ( path , flag , 438 /*=0666*/ ) ;
250271
251272 var size ;
252273 var threw = true ;
@@ -888,72 +909,93 @@ function writeAll(fd, buffer, offset, length, position, callback) {
888909 } ) ;
889910}
890911
891- fs . writeFile = function ( path , data , encoding_ , callback ) {
892- var encoding = ( typeof ( encoding_ ) == 'string' ? encoding_ : 'utf8' ) ;
893- assertEncoding ( encoding ) ;
912+ fs . writeFile = function ( path , data , options , callback ) {
913+ var callback = maybeCallback ( arguments [ arguments . length - 1 ] ) ;
894914
895- callback = maybeCallback ( arguments [ arguments . length - 1 ] ) ;
896- fs . open ( path , 'w' , 438 /*=0666*/ , function ( openErr , fd ) {
915+ if ( typeof options === 'function' || ! options ) {
916+ options = { encoding : 'utf8' , mode : 438 /*=0666*/ , flag : 'w' } ;
917+ } else if ( typeof options === 'string' ) {
918+ options = { encoding : options , mode : 438 , flag : 'w' } ;
919+ } else if ( ! options ) {
920+ options = { encoding : 'utf8' , mode : 438 /*=0666*/ , flag : 'w' } ;
921+ } else if ( typeof options !== 'object' ) {
922+ throw new TypeError ( 'Bad arguments' ) ;
923+ }
924+
925+ assertEncoding ( options . encoding ) ;
926+
927+ var flag = options . flag || 'w' ;
928+ fs . open ( path , options . flag || 'w' , options . mode , function ( openErr , fd ) {
897929 if ( openErr ) {
898930 if ( callback ) callback ( openErr ) ;
899931 } else {
900932 var buffer = Buffer . isBuffer ( data ) ? data : new Buffer ( '' + data ,
901- encoding ) ;
902- writeAll ( fd , buffer , 0 , buffer . length , 0 , callback ) ;
933+ options . encoding || 'utf8' ) ;
934+ var position = / a / . test ( flag ) ? null : 0 ;
935+ writeAll ( fd , buffer , 0 , buffer . length , position , callback ) ;
903936 }
904937 } ) ;
905938} ;
906939
907- fs . writeFileSync = function ( path , data , encoding ) {
908- assertEncoding ( encoding ) ;
940+ fs . writeFileSync = function ( path , data , options ) {
941+ if ( ! options ) {
942+ options = { encoding : 'utf8' , mode : 438 /*=0666*/ , flag : 'w' } ;
943+ } else if ( typeof options === 'string' ) {
944+ options = { encoding : options , mode : 438 , flag : 'w' } ;
945+ } else if ( typeof options !== 'object' ) {
946+ throw new TypeError ( 'Bad arguments' ) ;
947+ }
909948
910- var fd = fs . openSync ( path , 'w' ) ;
949+ assertEncoding ( options . encoding ) ;
950+
951+ var flag = options . flag || 'w' ;
952+ var fd = fs . openSync ( path , flag ) ;
911953 if ( ! Buffer . isBuffer ( data ) ) {
912- data = new Buffer ( '' + data , encoding || 'utf8' ) ;
954+ data = new Buffer ( '' + data , options . encoding || 'utf8' ) ;
913955 }
914956 var written = 0 ;
915957 var length = data . length ;
958+ var position = / a / . test ( flag ) ? null : 0 ;
916959 try {
917960 while ( written < length ) {
918- written += fs . writeSync ( fd , data , written , length - written , written ) ;
961+ written += fs . writeSync ( fd , data , written , length - written , position ) ;
962+ position += written ;
919963 }
920964 } finally {
921965 fs . closeSync ( fd ) ;
922966 }
923967} ;
924968
925- fs . appendFile = function ( path , data , encoding_ , callback ) {
926- var encoding = ( typeof ( encoding_ ) == 'string' ? encoding_ : 'utf8' ) ;
927- assertEncoding ( encoding ) ;
969+ fs . appendFile = function ( path , data , options , callback_ ) {
970+ var callback = maybeCallback ( arguments [ arguments . length - 1 ] ) ;
928971
929- callback = maybeCallback ( arguments [ arguments . length - 1 ] ) ;
972+ if ( typeof options === 'function' || ! options ) {
973+ options = { encoding : 'utf8' , mode : 438 /*=0666*/ , flag : 'a' } ;
974+ } else if ( typeof options === 'string' ) {
975+ options = { encoding : options , mode : 438 , flag : 'a' } ;
976+ } else if ( ! options ) {
977+ options = { encoding : 'utf8' , mode : 438 /*=0666*/ , flag : 'a' } ;
978+ } else if ( typeof options !== 'object' ) {
979+ throw new TypeError ( 'Bad arguments' ) ;
980+ }
930981
931- fs . open ( path , 'a' , 438 /*=0666*/ , function ( err , fd ) {
932- if ( err ) return callback ( err ) ;
933- var buffer = Buffer . isBuffer ( data ) ? data : new Buffer ( '' + data , encoding ) ;
934- writeAll ( fd , buffer , 0 , buffer . length , null , callback ) ;
935- } ) ;
982+ if ( ! options . flag )
983+ options = util . _extend ( { flag : 'a' } , options ) ;
984+ fs . writeFile ( path , data , options , callback ) ;
936985} ;
937986
938- fs . appendFileSync = function ( path , data , encoding ) {
939- assertEncoding ( encoding ) ;
940-
941- var fd = fs . openSync ( path , 'a' ) ;
942- if ( ! Buffer . isBuffer ( data ) ) {
943- data = new Buffer ( '' + data , encoding || 'utf8' ) ;
987+ fs . appendFileSync = function ( path , data , options ) {
988+ if ( ! options ) {
989+ options = { encoding : 'utf8' , mode : 438 /*=0666*/ , flag : 'a' } ;
990+ } else if ( typeof options === 'string' ) {
991+ options = { encoding : options , mode : 438 , flag : 'a' } ;
992+ } else if ( typeof options !== 'object' ) {
993+ throw new TypeError ( 'Bad arguments' ) ;
944994 }
945- var written = 0 ;
946- var position = null ;
947- var length = data . length ;
995+ if ( ! options . flag )
996+ options = util . _extend ( { flag : 'a' } , options ) ;
948997
949- try {
950- while ( written < length ) {
951- written += fs . writeSync ( fd , data , written , length - written , position ) ;
952- position += written ; // XXX not safe with multiple concurrent writers?
953- }
954- } finally {
955- fs . closeSync ( fd ) ;
956- }
998+ fs . writeFileSync ( path , data , options ) ;
957999} ;
9581000
9591001function errnoException ( errorno , syscall ) {
0 commit comments