2016-10-26 2 views
5
empfohlen

ich das Handbuch für stat Methode here Lesen und es sagt:Warum wird mit fstat nicht

Mit fs.stat() für die Existenz einer Datei zu überprüfen, bevor Aufruf fs.open (), fs.readFile() oder fs.writeFile() wird nicht empfohlen. Stattdessen sollte der Benutzercode die Datei direkt öffnen/lesen/schreiben und den Fehler behandeln, wenn die Datei nicht verfügbar ist.

Um zu überprüfen, ob eine Datei existiert, ohne sie später zu bearbeiten, wird fs.access() empfohlen.

Also, ich habe zwei Fragen bekommen:

  • Warum mit Fehlerbehandlungs Art und Weise über fs.stat() bevorzugt wird für die Datei Existenz zu überprüfen?

  • Und da ich fs.access() verwenden kann, um auf Datei Existenz zu überprüfen, ist error handler Mechanismus immer noch bevorzugte Möglichkeit, um sicherzustellen, Datei geöffnet ist?

Ich glaube, ich habe eine Antwort auf die zweite Frage gefunden:

Mit fs.access() für die Zugänglichkeit einer Datei zu überprüfen, bevor Aufruf fs.open(), fs. readFile() oder fs.writeFile() wird nicht empfohlen. Dies führt zu einer Race Condition, da andere Prozesse möglicherweise den Status der Datei zwischen den beiden Aufrufen ändern . Stattdessen sollte der Benutzercode die Datei direkt öffnen/lesen/schreiben und den Fehler beheben, wenn die Datei nicht zugänglich ist.

So wahrscheinlich fs.open() Blöcke für andere Prozesse Datei, während fs.stat() und fs.access() einfach Informationen anfordern und andere Prozesse können immer noch/ändern, um die Datei löschen.

+0

Es sei denn, der Autor dieser Dokumente hat eine Erklärung dafür geschrieben, warum irgendwo (weil sie nicht das Bedürfnis hatten, es in der Dokumentation zu erklären), alle spekulieren können, was hier auf SO nicht wirklich nützlich ist. Zum Beispiel ist eine Spekulation, dass es weniger Arbeit macht, als 'fs.stat' muss mehr Informationen über die Datei erhalten. Aber ... –

+0

Getrennt: Ihre Frage ist nur über den * zweiten * zitierten Absatz, oder? Der erste zitierte Absatz hat nichts mit 'fs.access' zu tun (und macht den Grund für * seine * Empfehlung klar). –

+1

[Nützlicher Kommentar] (http://stackoverflow.com/questions/32748530/on-linux-is-access-faster-than-stat#comment53341880_32748530) – robertklep

Antwort

3

Ich glaube, dass das, was hier gemacht werden soll, ist klar, dass beiden fs.stat und fs.access nicht für den Fall empfohlen von vor dem Öffnen für die Zugänglichkeit einer Datei zu überprüfen. Wie in der Frage erwähnt, kann dies die Rennbedingungen auslösen. Die Funktionen exists() und existsSync() waren aus diesem Grund (und einige andere in Bezug auf die API) veraltet (um Version 4): Sie wurden oft für diesen Zweck ausgenutzt.

Beim Versuch, eine Datei zu öffnen, löst die Operation bereits einen Fehler aus, wenn auf die Datei nicht zugegriffen werden kann. Daher sollten solche Überprüfungen hier behandelt werden. Ansonsten gibt es more than one reasonable way to check if a file exists.

Beachten Sie auch, dass ab Version 6.8.0 existsSync() nicht mehr veraltet ist! Siehe discussion und 6.8.0 changelog. Es gelten die gleichen Regeln wie oben: Verwenden Sie es nur, wenn Sie die Datei nicht später öffnen möchten.

Verwandte Themen