@@ -300,6 +300,93 @@ fs.access('/etc/passwd', fs.R_OK | fs.W_OK, (err) => {
300300});
301301```
302302
303+ Using `fs.access()` to check for the accessibility of a file before calling
304+ `fs.open()`, `fs.readFile()` or `fs.writeFile()` is not recommended. Doing
305+ so introduces a race condition, since other processes may change the file's
306+ state between the two calls. Instead, user code should open/read/write the
307+ file directly and handle the error raised if the file is not accessible.
308+
309+ For example:
310+
311+
312+ **write (NOT RECOMMENDED)**
313+
314+ ```js
315+ fs.access('myfile', (err) => {
316+ if (!err) {
317+ console.error('myfile already exists');
318+ return;
319+ }
320+
321+ fs.open('myfile', 'wx', (err, fd) => {
322+ if (err) throw err;
323+ writeMyData(fd);
324+ });
325+ });
326+ ```
327+
328+ **write (RECOMMENDED)**
329+
330+ ```js
331+ fs.open('myfile', 'wx', (err, fd) => {
332+ if (err) {
333+ if (err.code === "EEXIST") {
334+ console.error('myfile already exists');
335+ return;
336+ } else {
337+ throw err;
338+ }
339+ }
340+
341+ writeMyData(fd);
342+ });
343+ ```
344+
345+ **read (NOT RECOMMENDED)**
346+
347+ ```js
348+ fs.access('myfile', (err) => {
349+ if (err) {
350+ if (err.code === "ENOENT") {
351+ console.error('myfile does not exist');
352+ return;
353+ } else {
354+ throw err;
355+ }
356+ }
357+
358+ fs.open('myfile', 'r', (err, fd) => {
359+ if (err) throw err;
360+ readMyData(fd);
361+ });
362+ });
363+ ```
364+
365+ **read (RECOMMENDED)**
366+
367+ ```js
368+ fs.open('myfile', 'r', (err, fd) => {
369+ if (err) {
370+ if (err.code === "ENOENT") {
371+ console.error('myfile does not exist');
372+ return;
373+ } else {
374+ throw err;
375+ }
376+ }
377+
378+ readMyData(fd);
379+ });
380+ ```
381+
382+ The "not recommended" examples above check for accessibility and then use the
383+ file; the "recommended" examples are better because they use the file directly
384+ and handle the error, if any.
385+
386+ In general, check for the accessibility of a file only if the file won’t be
387+ used directly, for example when its accessibility is a signal from another
388+ process.
389+
303390## fs.accessSync(path[, mode])
304391<!-- YAML
305392added: v0.11.15
@@ -487,11 +574,83 @@ fs.exists('/etc/passwd', (exists) => {
487574});
488575```
489576
490- `fs.exists()` should not be used to check if a file exists before calling
491- `fs.open()`. Doing so introduces a race condition since other processes may
492- change the file's state between the two calls. Instead, user code should
493- call `fs.open()` directly and handle the error raised if the file is
494- non-existent.
577+ Using `fs.exists()` to check for the existence of a file before calling
578+ `fs.open()`, `fs.readFile()` or `fs.writeFile()` is not recommended. Doing
579+ so introduces a race condition, since other processes may change the file's
580+ state between the two calls. Instead, user code should open/read/write the
581+ file directly and handle the error raised if the file does not exist.
582+
583+ For example:
584+
585+ **write (NOT RECOMMENDED)**
586+
587+ ```js
588+ fs.exists('myfile', (exists) => {
589+ if (exists) {
590+ console.error('myfile already exists');
591+ } else {
592+ fs.open('myfile', 'wx', (err, fd) => {
593+ if (err) throw err;
594+ writeMyData(fd);
595+ });
596+ }
597+ });
598+ ```
599+
600+ **write (RECOMMENDED)**
601+
602+ ```js
603+ fs.open('myfile', 'wx', (err, fd) => {
604+ if (err) {
605+ if (err.code === "EEXIST") {
606+ console.error('myfile already exists');
607+ return;
608+ } else {
609+ throw err;
610+ }
611+ }
612+ writeMyData(fd);
613+ });
614+ ```
615+
616+ **read (NOT RECOMMENDED)**
617+
618+ ```js
619+ fs.exists('myfile', (exists) => {
620+ if (exists) {
621+ fs.open('myfile', 'r', (err, fd) => {
622+ readMyData(fd);
623+ });
624+ } else {
625+ console.error('myfile does not exist');
626+ }
627+ });
628+ ```
629+
630+ **read (RECOMMENDED)**
631+
632+ ```js
633+ fs.open('myfile', 'r', (err, fd) => {
634+ if (err) {
635+ if (err.code === "ENOENT") {
636+ console.error('myfile does not exist');
637+ return;
638+ } else {
639+ throw err;
640+ }
641+ } else {
642+ readMyData(fd);
643+ }
644+ });
645+ ```
646+
647+ The "not recommended" examples above check for existence and then use the
648+ file; the "recommended" examples are better because they use the file directly
649+ and handle the error, if any.
650+
651+ In general, check for the existence of a file only if the file won’t be
652+ used directly, for example when its existence is a signal from another
653+ process.
495654
496655## fs.existsSync(path)
497656<!-- YAML
0 commit comments