Узел.JS проверить существующий файл
Как я могу проверить существование file?
в документации к модулю fs есть описание метода fs.exists(path, callback). Но, как я понимаю, он проверяет наличие только каталогов. И мне нужно проверить file!
Как это можно сделать?
17 ответов:
почему бы просто не попробовать открыть файл ?
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 }Для Узла.с JS версии v0.12.X и выше
и
path.existsиfs.existsбыли удаленыС помощью fs.характеристика:
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 doc говорит, как
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'); }обновление
новые версии от V6: документация
fs.statfs.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.статистика
@Fox: отличный ответ! Вот немного расширения с некоторыми дополнительными опциями. Это то, что я использую в последнее время в качестве решения:
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.' ); }П. С. Проверить ФС-дополнительные Если вы еще не используете это-это очень мило. https://github.com/jprichardson/node-fs-extra)
есть много неточных комментариев о
fs.existsSync()осуждается; оно не является.https://nodejs.org/api/fs.html#fs_fs_existssync_path
обратите внимание, что fs.exists () является устаревшим, но fs.existsSync () не является.
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); } });
Ну я сделал это таким образом, как видно на 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'); } });есть ли проблемы с этим?
после небольшого эксперимента, я нашел следующий пример с помощью
fs.statчтобы быть хорошим способом, чтобы асинхронно проверить, существует ли файл. Он также проверяет, что ваш "файл"-это "действительно файл" (а не каталог).этот метод использует обещания, предполагая, что вы работаете с асинхронного кода:
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обещание сама ошибка.
async/awaitверсию с помощьюutil.promisifyначиная с узла 8: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); } }); });
в старые времена, прежде чем сесть, я всегда проверяю, если стул есть, то я сижу еще у меня есть альтернативный план, как сидеть в автобусе. Теперь узел.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 ); } );код взят из http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/ С марта 2014 года, и немного изменен, чтобы соответствовать компьютеру. Он также проверяет наличие разрешения-удалить разрешение для тестирования
chmod a-r foo.txt
vannilla Nodejs callback
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. }the docs говорят, что вы должны использовать
access()в качестве замены устаревшимexists()Nodejs со встроенным обещанием (узел 7+)
function fileExists(path, cb){ return new Promise((accept,deny) => fs.access(path, fs.constants.F_OK,(er, result)=> cb(!err && result)) ); }популярный javascript framework
var fs = require('fs-extra') await fs.pathExists(filepath)как вы видите, гораздо проще. И преимущество перед promisify заключается в том, что у вас есть полные типизации с этим пакетом (полный intellisense/typescript)! Большинство случаи, когда вы уже включили эту библиотеку, потому что (+-10.000) другие библиотеки зависят от нее.
можно использовать
fs.statчтобы проверить, является ли target файлом или каталогом, и вы можете использовать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); }());
из узла.js документация:
с помощью fs.stat() для проверки наличия файла перед вызовом файловая система.open (), fs.readFile () или fs.writeFile () не рекомендуется. Вместо этого пользовательский код должен открывать/читать / записывать файл напрямую и обрабатывать ошибка возникает, если файл недоступен.
чтобы проверить, существует ли файл, не манипулируя им впоследствии, файловая система.доступа() рекомендуется.
Как говорится в официальной документации Nodejs:
fs.существует (путь, обратный вызов) Стабильность: 0-Не рекомендуется: использовать fs.stat () или fs.открыть() вместо этого.
Comments