どうやってファイルの存在をチェックするのですか?
モジュールfs
のドキュメントには、メソッドの説明があります fs.exists(path, callback)
。しかし、私が理解しているように、それはディレクトリだけの存在をチェックします。そして私はファイルをチェックする必要があります。
どうすればこれができますか?
単にファイルを開いてみませんか?とにかくfs.open('YourFile', 'a', function (err, fd) { ... })
はちょっとした検索の後にこれを試してください:
var path = require('path');
path.exists('foo.txt', function(exists) {
if (exists) {
// do something
}
});
// or
if (path.existsSync('foo.txt')) {
// do something
}
Node.js v0.12.x以降の場合
path.exists
とfs.exists
はどちらも推奨されなくなりました
*編集:
変更:else if(err.code == 'ENOENT')
else if(err.code === 'ENOENT')
へ
Linterは、Double EqualsがTriple Equalではないと文句を言います。
Fs.statを使う:
fs.stat('foo.txt', function(err, stat) {
if(err == null) {
console.log('File exists');
} else if(err.code === 'ENOENT') {
// file does not exist
fs.writeFile('log.txt', 'Some log\n');
} else {
console.log('Some other error: ', err.code);
}
});
同期的にこれを行うためのより簡単な方法。
if (fs.existsSync('/etc/file')) {
console.log('Found file');
}
APIドキュメントには、existsSync
の仕組みが記載されています。
ファイルシステムを調べて、指定したパスが存在するかどうかをテストします。
Statの代わりに新しい fs.access(...)
を使うこともできます。
チェックのための簡略化された短い約束関数
s => new Promise(r=>fs.access(s, fs.F_OK, e => r(!e)))
使用例
let checkFileExists = s => new Promise(r=>fs.access(s, fs.F_OK, e => r(!e)))
checkFileExists("Some File Location")
.then(bool => console.log(´file exists: ${bool}´))
約束の方法を拡張しました。
// returns a promise which resolves true if file exists:
function checkFileExists(filepath){
return new Promise((resolve, reject) => {
fs.access(filepath, fs.F_OK, error => {
resolve(!error);
});
});
}
同期的にやりたい場合は、
function checkFileExistsSync(filepath){
let flag = true;
try{
fs.accessSync(filepath, fs.F_OK);
}catch(e){
flag = false;
}
return flag;
}
fs.exists(path, callback)
およびfs.existsSync(path)
は現在非推奨です。 https://nodejs.org/api/fs.html#fs_fs_exists_path_callback および https://nodejs.org/api/fs.html#fs_fs_existssync_path]を参照してください。 。
ファイルの存在を同期的にテストするためにieを使うことができます。 fs.statSync(path)
。ファイルが存在する場合はfs.Stats
オブジェクトが返されます。 https://nodejs.org/api/fs.html#fs_class_fs_stats を参照してください。それ以外の場合は、try/catchステートメントによって捕捉されるエラーがスローされます。 。
var fs = require('fs'),
path = '/path/to/my/file',
stats;
try {
stats = fs.statSync(path);
console.log("File exists.");
}
catch (e) {
console.log("File does not exist.");
}
V6より前の旧バージョン: これがドキュメントです
const fs = require('fs');
fs.exists('/etc/passwd', (exists) => {
console.log(exists ? 'it\'s there' : 'no passwd!');
});
// or Sync
if (fs.existsSync('/etc/passwd')) {
console.log('it\'s there');
}
UPDATE
V6からの新しいバージョン: fs.stat
のドキュメント
fs.stat('/etc/passwd', function(err, stat) {
if(err == null) {
//Exist
} else if(err.code == 'ENOENT') {
// NO exist
}
});
fs.exists
は1.0.0から非推奨になりました。代わりにfs.stat
を使うことができます。
var fs = require('fs');
fs.stat(path, (err, stats) => {
if ( !stats.isFile(filename) ) { // do this
}
else { // do this
}});
これはドキュメントへのリンクです fs.stats
@ Fox:素晴らしい答え!これは、いくつかのオプションを追加した、ちょっとした拡張です。それは私が最近Go-Toソリューションとして使用しているものです。
var fs = require('fs');
fs.lstat( targetPath, function (err, inodeStatus) {
if (err) {
// file does not exist-
if (err.code === 'ENOENT' ) {
console.log('No file or directory at',targetPath);
return;
}
// miscellaneous error (e.g. permissions)
console.error(err);
return;
}
// Check if this is a file or directory
var isDirectory = inodeStatus.isDirectory();
// Get file size
//
// NOTE: this won't work recursively for directories-- see:
// http://stackoverflow.com/a/7550430/486547
//
var sizeInBytes = inodeStatus.size;
console.log(
(isDirectory ? 'Folder' : 'File'),
'at',targetPath,
'is',sizeInBytes,'bytes.'
);
}
P.Sまだ使っていないのであれば、fs-extraをチェックしてください - それはかなり甘いです。 https://github.com/jprichardson/node-fs-extra )
fs.existsSync()
が推奨されなくなったことについての不正確なコメントがたくさんあります。そうではない。
https://nodejs.org/api/fs.html#fs_fs_existssync_path
Fs.exists()は非推奨ですが、fs.existsSync()は非推奨です。
ノード8の時点でasync/await
を使用しているutil.promisify
バージョン:
const fs = require('fs');
const { promisify } = require('util');
const stat = promisify(fs.stat);
describe('async stat', () => {
it('should not throw if file does exist', async () => {
try {
const stats = await stat(path.join('path', 'to', 'existingfile.txt'));
assert.notEqual(stats, null);
} catch (err) {
// shouldn't happen
}
});
});
describe('async stat', () => {
it('should throw if file does not exist', async () => {
try {
const stats = await stat(path.join('path', 'to', 'not', 'existingfile.txt'));
} catch (err) {
assert.notEqual(err, null);
}
});
});
fs.statSync(path, function(err, stat){
if(err == null) {
console.log('File exists');
//code when all ok
}else if (err.code == "ENOENT") {
//file doesn't exist
console.log('not file');
}
else {
console.log('Some other error: ', err.code);
}
});
ちょっとした実験の後、fs.stat
を使った次の例がファイルが存在するかどうかを非同期的にチェックする良い方法であることがわかりました。また、あなたの "ファイル"が "ファイルである"ことを確認します(ディレクトリではありません)。
このメソッドは、非同期コードベースを使用していると仮定して、Promisesを使用します。
const fileExists = path => {
return new Promise((resolve, reject) => {
try {
fs.stat(path, (error, file) => {
if (!error && file.isFile()) {
return resolve(true);
}
if (error && error.code === 'ENOENT') {
return resolve(false);
}
});
} catch (err) {
reject(err);
}
});
};
ファイルが存在しない場合でも、false
とはいえ、約束は解決されます。ファイルが存在し、それがディレクトリの場合は、true
が解決されます。ファイルを読み込もうとしているエラーはすべてreject
がエラーそのものを約束します。
さて私はこのようにして、 https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback に見られるように
fs.access('./settings', fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, function(err){
console.log(err ? 'no access or dir doesnt exist' : 'R/W ok');
if(err && err.code === 'ENOENT'){
fs.mkdir('settings');
}
});
これに問題はありますか?
function fileExists(path, cb){
return fs.access(path, fs.constants.F_OK,(er, result)=> cb(!err && result)) //F_OK checks if file is visible, is default does no need to be specified.
}
docs 非推奨のaccess()
の代わりにexists()
を使うべきだと言っています
function fileExists(path, cb){
return new Promise((accept,deny) =>
fs.access(path, fs.constants.F_OK,(er, result)=> cb(!err && result))
);
}
var fs = require('fs-extra')
await fs.pathExists(filepath)
あなたがずっと簡単に見えるように。そしてpromisifyよりも優れている点は、このパッケージで完全なタイピングができることです(完全なintellisense/TypeScript)。他のライブラリが(+ -10.000)他のライブラリに依存しているため、ほとんどの場合、このライブラリはすでに含まれています。
現代の非同期/待機方法(Node 12.8.x)
const fileExists = async path => !!(await fs.promises.stat(path).catch(e => false));
console.log(await fileExists('/path/myfile.txt'));
Targetがファイルかディレクトリかを確認するためにfs.stat
を使用することができ、ファイルに書き込み、読み取り、実行できるかどうかを確認するためにfs.access
を使用できます。 (ターゲットのフルパスを取得するにはpath.resolve
を使用するのを忘れないでください)
ドキュメンテーション:
完全な例(TypeScript)
import * as fs from 'fs';
import * as path from 'path';
const targetPath = path.resolve(process.argv[2]);
function statExists(checkPath): Promise<fs.Stats> {
return new Promise((resolve) => {
fs.stat(checkPath, (err, result) => {
if (err) {
return resolve(undefined);
}
return resolve(result);
});
});
}
function checkAccess(checkPath: string, mode: number = fs.constants.F_OK): Promise<boolean> {
return new Promise((resolve) => {
fs.access(checkPath, mode, (err) => {
resolve(!err);
});
});
}
(async function () {
const result = await statExists(targetPath);
const accessResult = await checkAccess(targetPath, fs.constants.F_OK);
const readResult = await checkAccess(targetPath, fs.constants.R_OK);
const writeResult = await checkAccess(targetPath, fs.constants.W_OK);
const executeResult = await checkAccess(targetPath, fs.constants.X_OK);
const allAccessResult = await checkAccess(targetPath, fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK | fs.constants.X_OK);
if (result) {
console.group('stat');
console.log('isFile: ', result.isFile());
console.log('isDir: ', result.isDirectory());
console.groupEnd();
}
else {
console.log('file/dir does not exist');
}
console.group('access');
console.log('access:', accessResult);
console.log('read access:', readResult);
console.log('write access:', writeResult);
console.log('execute access:', executeResult);
console.log('all (combined) access:', allAccessResult);
console.groupEnd();
process.exit(0);
}());
座る前の昔は私はいつも椅子があるかどうかをチェックし、それから私は他の人に座っていました私はコーチの上に座るような代替案を持っています。今node.jsサイトはただ行くことを提案し(チェックする必要はありません)、答えはこのようになります:
fs.readFile( '/foo.txt', function( err, data )
{
if(err)
{
if( err.code === 'ENOENT' )
{
console.log( 'File Doesn\'t Exist' );
return;
}
if( err.code === 'EACCES' )
{
console.log( 'No Permission' );
return;
}
console.log( 'Unknown Error' );
return;
}
console.log( data );
} );
2014年3月から http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/ から取得したコードで、コンピュータに合わせてわずかに変更されています。それは同様に許可をチェックします - chmod a-r foo.txt
をテストするための許可を削除します