Pertanyaan Periksa serentak jika file / direktori ada di Node.js


Bagaimana saya bisa memeriksa secara sinkron, menggunakan node.js, jika file atau direktori ada?


825
2017-12-19 11:19


asal


Jawaban:


Jawaban atas pertanyaan ini telah berubah selama bertahun-tahun. Itu arus Jawabannya ada di sini di bagian atas, diikuti oleh berbagai jawaban selama bertahun-tahun dalam urutan kronologis:

Jawaban Saat Ini

Kamu dapat memakai fs.existsSync():

var fs = require('fs');
if (fs.existsSync(path)) {
    // Do something
}

Itu sudah ditinggalkan selama beberapa tahun, tetapi tidak lagi. Dari dokumen:

Perhatikan itu fs.exists() sudah ditinggalkan, tapi fs.existsSync() tidak. (Itu   parameter panggilan balik ke fs.exists() menerima parameter yang   tidak konsisten dengan callback Node.js lainnya. fs.existsSync() tidak   gunakan panggilan balik.)

Anda telah secara khusus meminta sinkronis periksa, tetapi jika Anda bisa menggunakan asynchronous periksa saja (biasanya terbaik dengan I / O), gunakan fs.access (sejak exists sudah ditinggalkan).


Jawaban Sejarah

Inilah jawaban historis dalam urutan kronologis:

  • Jawaban asli dari 2010
    (stat/statSync atau lstat/lstatSync)
  • Perbarui September 2012
    (exists/existsSync)
  • Perbarui Februari 2015
    (Memperhatikan penghentian dari exists/existsSync, jadi kita mungkin kembali stat/statSync atau lstat/lstatSync)
  • Perbarui Desember 2015
    (Ada juga fs.access(path, fs.F_OK, function(){}) / fs.accessSync(path, fs.F_OK), tetapi perhatikan bahwa jika file / direktori tidak ada, ini adalah kesalahan; dokumen untuk fs.stat merekomendasikan menggunakan fs.access jika Anda perlu memeriksa keberadaan tanpa membuka)
  • Perbarui Desember 2016
    fs.exists() masih tidak digunakan lagi tetapi fs.existsSync() tidak lagi ditinggalkan. Jadi Anda bisa menggunakannya dengan aman sekarang.

Jawaban asli dari 2010:

Kamu dapat memakai statSync atau lstatSync (tautan dokumen), yang memberi Anda fs.Stats obyek. Secara umum, jika versi sinkron dari fungsi tersedia, itu akan memiliki nama yang sama dengan versi async dengan Sync pada akhirnya. Begitu statSync adalah versi sinkron dari stat; lstatSync adalah versi sinkron dari lstat, dll.

lstatSync memberi tahu Anda apakah ada sesuatu, dan jika ya, apakah itu file atau direktori (atau di beberapa sistem file, tautan simbolis, perangkat blokir, perangkat karakter, dll.), mis. jika Anda perlu tahu apakah itu ada dan direktori:

var fs = require('fs');
try {
    // Query the entry
    stats = fs.lstatSync('/the/path');

    // Is it a directory?
    if (stats.isDirectory()) {
        // Yes it is
    }
}
catch (e) {
    // ...
}

... dan juga jika itu file, ada isFile; jika itu perangkat blok, ada isBlockDevice, dll, dll. Perhatikan try/catch; itu melempar kesalahan jika entri tidak ada sama sekali.

Jika Anda tidak peduli apa entrinya aku s dan hanya ingin tahu apakah itu ada, bisa Anda gunakan path.existsSync (atau dengan yang terbaru, fs.existsSync) sebagai dicatat oleh user618408:

var path = require('path');
if (path.existsSync("/the/path")) { // or fs.existsSync
    // ...
}

Itu tidak membutuhkan try/catch, tetapi tidak memberi Anda informasi tentang apa masalahnya, hanya ada di sana.


1613
2017-12-19 11:26



Melihat sumbernya, ada versi sinkron dari path.exists - path.existsSync. Sepertinya itu terlewatkan dalam dokumen.

Memperbarui:

path.exists dan path.existsSync sekarang tidak lagi digunakan. Mohon gunakan fs.exists dan fs.existsSync.

Perbarui 2016:

fs.exists dan fs.existsSync juga sudah tidak digunakan lagi. Menggunakan fs.stat () atau fs.access ()sebagai gantinya.


114
2018-02-15 19:05



Menggunakan API yang saat ini direkomendasikan (per 2015) (per dokumen Node), inilah yang saya lakukan:

var fs = require('fs');

function fileExists(filePath)
{
    try
    {
        return fs.statSync(filePath).isFile();
    }
    catch (err)
    {
        return false;
    }
}

Menanggapi isu EPERM yang diajukan oleh @broadband di komentar, itu menunjukkan poin yang bagus. fileExists () mungkin bukan cara yang baik untuk memikirkan hal ini dalam banyak kasus, karena fileExists () tidak bisa menjanjikan pengembalian boolean. Anda mungkin dapat menentukan secara pasti bahwa file itu ada atau tidak ada, tetapi Anda mungkin juga mendapatkan kesalahan izin. Kesalahan perizinan tidak selalu berarti bahwa file tersebut ada, karena Anda tidak memiliki izin ke direktori yang berisi file yang Anda periksa. Dan tentu saja ada kemungkinan Anda dapat menemukan beberapa kesalahan lain dalam memeriksa keberadaan file.

Jadi kode saya di atas benar-benar doesFileExistAndDoIHaveAccessToIt (), tetapi pertanyaan Anda mungkin tidakFileNotExistAndCouldICreateIt (), yang akan menjadi logika yang sama sekali berbeda (yang perlu memperhitungkan kesalahan EPERM, antara lain).

Sementara jawaban fs.existsSync membahas pertanyaan yang diajukan di sini secara langsung, yang sering tidak akan menjadi apa yang Anda inginkan (Anda tidak hanya ingin tahu apakah "sesuatu" ada di jalan, Anda mungkin peduli apakah "hal" yang ada adalah file atau direktori).

Intinya adalah bahwa jika Anda memeriksa untuk melihat apakah file ada, Anda mungkin melakukan itu karena Anda berniat untuk mengambil beberapa tindakan berdasarkan hasil, dan bahwa logika (cek dan / atau tindakan selanjutnya) harus mengakomodasi ide bahwa hal yang ditemukan di jalur itu mungkin berupa file atau direktori, dan Anda mungkin mengalami EPERM atau kesalahan lain dalam proses pengecekan.


50
2017-09-23 21:12



Pembaruan Lain

Membutuhkan jawaban untuk pertanyaan ini sendiri saya mencari dokumentasi node, sepertinya Anda harus tidak menggunakan fs.exists, alih-alih gunakan fs.open dan gunakan kesalahan yang dihasilkan untuk mendeteksi apakah file tidak ada:

dari dokumen:

fs.eksists () adalah anakronisme dan hanya ada karena alasan historis.   Seharusnya hampir tidak pernah ada alasan untuk menggunakannya dalam kode Anda sendiri.

Secara khusus, memeriksa apakah file ada sebelum membukanya adalah file   anti-pola yang membuat Anda rentan terhadap kondisi balapan: lainnya   proses dapat menghapus file antara panggilan ke fs.eksists () dan   fs.open (). Buka saja file dan atasi kesalahan saat tidak   sana.

http://nodejs.org/api/fs.html#fs_fs_exists_path_callback


19
2018-06-07 04:13



Saya menggunakan fungsi di bawah ini untuk menguji apakah file ada. Ini juga menangkap pengecualian lainnya. Jadi jika ada masalah hak, mis. chmod ugo-rwx filename atau di Windows Right Click -> Properties -> Security -> Advanced -> Permission entries: empty list .. fungsi mengembalikan pengecualian sebagaimana mestinya. File ada tetapi kami tidak memiliki hak untuk mengaksesnya. Adalah salah untuk mengabaikan pengecualian semacam ini.

function fileExists(path) {

  try  {
    return fs.statSync(path).isFile();
  }
  catch (e) {

    if (e.code == 'ENOENT') { // no such file or directory. File really does not exist
      console.log("File does not exist.");
      return false;
    }

    console.log("Exception fs.statSync (" + path + "): " + e);
    throw e; // something else went wrong, we don't have rights, ...
  }
}

Output pengecualian, dokumentasi kesalahan nodejs dalam file kasus tidak ada:

{
  [Error: ENOENT: no such file or directory, stat 'X:\\delsdfsdf.txt']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'stat',
  path: 'X:\\delsdfsdf.txt'
}

Pengecualian jika kita tidak memiliki hak atas file tersebut, tetapi ada:

{
  [Error: EPERM: operation not permitted, stat 'X:\file.txt']
  errno: -4048,
  code: 'EPERM',
  syscall: 'stat',
  path: 'X:\\file.txt'
}

10
2018-01-26 14:37



fs.eksists () tidak digunakan lagi https://nodejs.org/api/fs.html#fs_fs_exists_path_callback

Anda dapat menerapkan cara nodes inti yang digunakan pada ini: https://github.com/nodejs/node-v0.x-archive/blob/master/lib/module.js#L86

function statPath(path) {
  try {
    return fs.statSync(path);
  } catch (ex) {}
  return false;
}

ini akan mengembalikan objek statistik setelah Anda mendapatkan objek statistik yang dapat Anda coba

var exist = statPath('/path/to/your/file.js');
if(exist && exist.isFile()) {
  // do something
}

4
2017-07-28 06:53



Beberapa jawaban di sini mengatakan itu fs.exists dan fs.existsSync keduanya tidak digunakan lagi. Menurut dokumen ini tidak lebih benar. Hanya fs.exists sudah tidak terpakai sekarang:

Perhatikan bahwa fs.exists () tidak digunakan lagi, tetapi fs.existsSync () tidak. (Itu   callback parameter ke fs.exists () menerima parameter yang   tidak konsisten dengan callback Node.js lainnya. fs.existsSync () tidak   gunakan panggilan balik.)

Jadi Anda bisa aman digunakan fs.existsSync () untuk menyelaraskan memeriksa apakah file ada.


4
2017-12-04 09:02