Node.js හි ගොනුව / නාමාවලිය තිබේදැයි සමමුහුර්තව පරීක්ෂා කරන්න


1239

ගොනුවක් හෝ නාමාවලියක් තිබේ නම් node.js භාවිතා කර සමමුහුර්තව පරීක්ෂා කරන්නේ කෙසේද ?


61
මොඩියුලයක් ආපසු ලබා දීමට පෙර එක් වරක් ගොනු / නාමාවලි මෙහෙයුම් සිදු කිරීම සඳහා සමමුහුර්ත මෙහෙයුම් විශිෂ්ටයි. උදාහරණයක් ලෙස, වින්‍යාස ගොනුවක් ඇරඹීම.
jocull

1
උණුසුම් හැඹිලියක් සහිත පෝල් ඩ්‍රැපර් සෑම අවස්ථාවකම සත්‍ය නොවේ.
mikemaccana

14
කාර්ය සාධනය කුමක් වුවත්, සමහර විට ඔබට එය සංවර්ධක අත්දැකීම් සඳහා සමමුහුර්ත ආකාරයකින් ක්‍රියාත්මක කිරීමට අවශ්‍ය වේ. උදාහරණයක් ලෙස, ඔබ දත්ත සැකසුම් ස්ක්‍රිප්ටයක් සඳහා නෝඩ් භාවිතා කරන්නේ නම් එය සැලසුම් කිරීම අවහිර කළ යුතුය, එවැනි අවස්ථාවකදී අසින්ක් existsඅනවශ්‍ය ඇමතුම් ලබා ගනී.
කුනොක්

4
කුනෝක්ගේ ප්‍රකාශයට අනිවාර්යයෙන්ම +1 කරන්න. මගේ අනෙක් කේත වලදී මම කේතය වඩාත් සංකීර්ණ කරන්නේ එය වේගය සැබවින්ම වැදගත් වන බාධකයක් වූ විට පමණි. ලිපිගොනු කියවීම සඳහා මා එම මූලධර්මය අදාළ නොකරන්නේ ඇයි? බොහෝ වැඩසටහන් වල බොහෝ කොටස් වල කේතයේ සරල බව / කියවීමේ හැකියාව ක්‍රියාත්මක කිරීමේ වේගයට වඩා වැදගත් වේ. එය බාධක සහිත ප්‍රදේශයක් නම් මම තවදුරටත් කේත ක්‍රියාත්මක කිරීම නැවැත්වීමට අසින්ක් ක්‍රම භාවිතා කරමි. නැතිනම් ... සමමුහුර්තකරණය විශිෂ්ටයි. සමමුහුර්තකරණයට අන්ධ ලෙස වෛර නොකරන්න.
බ්‍රයන්ග්‍රෙස්සාක්

4
කරුණාකර ... "සඳහන් කිරීම වටී" නොවේ, මන්ද පරිශීලකයා එය සමමුහුර්තව කරන්නේ කෙසේදැයි පැහැදිලිව අසයි.
jClark

Answers:


2275

මෙම ප්රශ්නයට පිළිතුර වසර ගණනාවක් තිස්සේ වෙනස් වී ඇත. මෙම වත්මන් පිළිතුර කාලානුක්රමික පිළිවෙළකට නොව වසර පුරා විවිධ පිළිතුරු විසින් අනුගමනය, ඉහළ මෙතන:

වත්මන් පිළිතුර

ඔබට භාවිතා කළ හැකිය fs.existsSync():

const fs = require("fs"); // Or `import fs from "fs";` with ESM
if (fs.existsSync(path)) {
    // Do something
}

එය වසර ගණනාවක් තිස්සේ අවලංගු කරන ලද නමුත් තවදුරටත් එසේ නොවේ. ලියකියවිලි වලින්:

fs.exists()අවලංගු කර ඇති නමුත් fs.existsSync()එසේ නොවන බව සලකන්න . ( fs.exists()වෙනත් Node.js ඇමතුම් සඳහා නොගැලපෙන පරාමිතීන් පිළිගැනීමට ඇති ඇමතුම් ආපසු පරාමිතිය . ඇමතුමක් ලබා fs.existsSync()නොගනී.)

ඔබ විශේෂයෙන් සමමුහුර්ත චෙක්පතක් ඉල්ලා ඇත , නමුත් ඔබට ඒ වෙනුවට අසමමුහුර්ත චෙක්පතක් භාවිතා කළ හැකි නම් (සාමාන්‍යයෙන් I / O සමඟ හොඳම), fs.promises.accessඔබ asyncශ්‍රිත භාවිතා කරන්නේ නම් හෝ fs.access( අතහැර දැමූ බැවින් exists) :

තුළ සිටින asyncක්රියාව:

try {
    await fs.promises.access("somefile");
    // The check succeeded
} catch (error) {
    // The check failed
}

හෝ ඇමතුමක් සමඟ:

fs.access("somefile", error => {
    if (!error) {
        // The check succeeded
    } else {
        // The check failed
    }
});

Answer තිහාසික පිළිතුරු

කාලානුක්‍රමික පිළිවෙලින් historical තිහාසික පිළිතුරු මෙන්න:

  • 2010 සිට මුල් පිළිතුර
    ( stat/ statSyncහෝ lstat/ lstatSync)
  • 2012 සැප්තැම්බර් යාවත්කාලීන කරන්න
    ( exists/ existsSync)
  • 2015 පෙබරවාරි යාවත්කාලීන කරන්න
    (ඉදිරියේදී exists/ / existsSyncහි ක්ෂයවීම සටහන් කරමින් , එබැවින් අපි බොහෝ විට stat/ statSyncහෝ lstat/ වෙත ආපසු යන්නෙමු lstatSync)
  • 2015 යාවත්කාලීන දෙසැම්බර්
    (ද තිබෙන fs.access(path, fs.F_OK, function(){})/ fs.accessSync(path, fs.F_OK), නමුත් ගොනුව / බහලුම නොපවතියි නම්, එය දෝෂයක් බව, සටහන්, මූඩ්ල් ලේඛන fs.statභාවිතා කිරීම නිර්දේශ fs.accessඔබ විවෘත තොරව පැවැත්ම සඳහා පරීක්ෂා කිරීමට අවශ්ය නම්)
  • යාවත්කාලීන කිරීම 2016 දෙසැම්බර්
    fs.exists() තවමත් අතහැර දමා ඇති නමුත් fs.existsSync()තවදුරටත් අවලංගු කර නොමැත. එබැවින් ඔබට දැන් එය ආරක්ෂිතව භාවිතා කළ හැකිය.

2010 සිට මුල් පිළිතුර:

ඔබට වස්තුවක් ලබා දෙන statSyncහෝ lstatSync( docs link ) භාවිතා කළ හැකිය . පොදුවේ ගත් කල, ශ්‍රිතයක සමමුහුර්ත අනුවාදයක් තිබේ නම්, එය අවසානයේ ඇති අසින්ක් අනුවාදයට සමාන නමක් ඇත . ඒ නිසා ඇති සමමුහුර්ත අනුවාදය වේ ; යනාදියෙහි සමමුහුර්ත අනුවාදය වේ .fs.StatsSyncstatSyncstatlstatSynclstat

lstatSync යමක් තිබේද යන්නත්, එසේ නම් එය ගොනුවක් හෝ නාමාවලියක්ද යන්න (හෝ සමහර ගොනු පද්ධතිවල සංකේතාත්මක සබැඳියක්, බ්ලොක් උපාංගයක්, අක්ෂර උපාංගයක් යනාදිය) ඔබට කියයි, උදා. එය තිබේදැයි දැන ගැනීමට ඔබට අවශ්‍ය නම් නාමාවලිය:

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) {
    // ...
}

... ඒ හා සමානව, එය ගොනුවක් නම්, තිබේ isFile; එය බ්ලොක් උපාංගයක් නම් isBlockDevice, යනාදිය ඇත. ආදිය සටහන් කරන්න try/catch. ප්‍රවේශය කිසිසේත්ම නොපවතී නම් එය දෝෂයක් ඇති කරයි.

ප්‍රවේශය යනු කුමක්දැයි ඔබ නොසලකන්නේ නම් සහ එය පවතින්නේ දැයි දැන ගැනීමට පමණක් අවශ්‍ය නම් path.existsSync, පරිශීලක 618408 විසින් සටහන් කරfs.existsSync ඇති පරිදි ඔබට (හෝ නවතම ඒවා සමඟ ) භාවිතා කළ හැකිය :

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

එයට අවශ්‍ය නොවන try/catchනමුත් එය කුමක්ද යන්න පිළිබඳව ඔබට කිසිදු තොරතුරක් ලබා නොදේ . path.existsSyncබොහෝ කලකට පෙර ඉවත් කරන ලදි.


පැති සටහන: ඔබ පැහැදිලිවම සමමුහුර්තව පරීක්ෂා කරන්නේ කෙසේදැයි විමසා ඇත , එබැවින් මම xyzSyncඉහත ශ්‍රිතවල අනුවාදයන් භාවිතා කර ඇත්තෙමි . නමුත් හැකි සෑම තැනකම, I / O සමඟ, සමමුහුර්ත ඇමතුම් වළක්වා ගැනීම වඩාත් සුදුසුය. I / O උප පද්ධතියට කෙරෙන ඇමතුම් CPU හි දෘෂ්ටි කෝණයෙන් සැලකිය යුතු කාලයක් ගතවේ. ඇමතීම lstatවඩා පහසු බව සලකන්න lstatSync:

// Is it a directory?
lstat('/the/path', function(err, stats) {
    if (!err && stats.isDirectory()) {
        // Yes it is
    }
});

නමුත් ඔබට සමමුහුර්ත අනුවාදය අවශ්‍ය නම් එය එහි තිබේ.

2012 සැප්තැම්බර් යාවත්කාලීන කරන්න

මීට වසර කිහිපයකට පෙර ලබා දුන් පහත පිළිතුර දැන් යල්පැන ඇත. වර්තමාන ක්‍රමය වන්නේ fs.existsSyncලිපිගොනු / නාමාවලි පැවැත්ම සඳහා සමමුහුර්ත චෙක්පතක් කිරීම සඳහා භාවිතා කිරීමයි (හෝ ඇත්ත වශයෙන්ම fs.existsඅසමමුහුර්ත චෙක්පතක් සඳහා)path පහත අනුවාදයන්ට වඩා භාවිතා කිරීමයි.

උදාහරණයක්:

var fs = require('fs');

if (fs.existsSync(path)) {
    // Do something
}

// Or

fs.exists(path, function(exists) {
    if (exists) {
        // Do something
    }
});

යාවත්කාලීන කිරීම 2015 පෙබරවාරි

මෙන්න අපි 2015 දී වන අතර නෝඩ් ලියකියවිලි දැන් පවසන්නේ fs.existsSync(සහfs.exists ) "අවලංගු කරනු ඇති" බවයි. (නෝඩ් ජනයා සිතන්නේ එය විවෘත කිරීමට පෙර යමක් තිබේද යන්න පරීක්ෂා කිරීම ගොළු බවය, එය එය ය; නමුත් යමක් තිබේද යන්න පරීක්ෂා කිරීමට එකම හේතුව එය නොවේ!)

ඒ නිසා අපි බොහෝ විට විවිධ statක්‍රම වෙත ආපසු යමු ... මෙය නැවත වෙනස් වන තුරු / ඇත්ත වශයෙන්ම.

2015 දෙසැම්බර් යාවත්කාලීන කරන්න

එය කොපමණ කාලයක් ගත වී ඇත්දැයි නොදනී, නමුත් fs.access(path, fs.F_OK, ...)/fs.accessSync(path, fs.F_OK) . අවම වශයෙන් 2016 ඔක්තෝබර් වන විට, fs.statලේඛනfs.access පරීක්ෂා කිරීම සඳහා පැවැත්ම පරීක්ෂා කිරීම නිර්දේශ කරයි ( "ගොනුවක් පසුව හැසිරවීමකින් තොරව තිබේදැයි පරීක්ෂා fs.access()කිරීම රෙකමදාරු කරනු ලැබේ." ). නමුත් ප්‍රවේශය නොලැබීම දෝෂයක් ලෙස සලකන බව සලකන්න , එබැවින් ගොනුව ප්‍රවේශ විය හැකි යැයි ඔබ අපේක්ෂා කරන්නේ නම් මෙය වඩාත් සුදුසු වේ:

var fs = require('fs');

try {
    fs.accessSync(path, fs.F_OK);
    // Do something
} catch (e) {
    // It isn't accessible
}

// Or

fs.access(path, fs.F_OK, function(err) {
    if (!err) {
        // Do something
    } else {
        // It isn't accessible
    }
});

2016 දෙසැම්බර් යාවත්කාලීන කරන්න

ඔබට භාවිතා කළ හැකිය fs.existsSync():

if (fs.existsSync(path)) {
    // Do something
}

එය වසර ගණනාවක් තිස්සේ අවලංගු කරන ලද නමුත් තවදුරටත් එසේ නොවේ. ලියකියවිලි වලින්:

fs.exists()අවලංගු කර ඇති නමුත් fs.existsSync()එසේ නොවන බව සලකන්න . ( fs.exists()වෙනත් Node.js ඇමතුම් සඳහා නොගැලපෙන පරාමිතීන් පිළිගැනීමට ඇති ඇමතුම් ආපසු පරාමිතිය . ඇමතුමක් ලබා fs.existsSync()නොගනී.)


8
path.exists සහ path.existsSync යන දෙකම fs.exists සහ fs.existsSync
Drew

15
"නෝඩ් ජනයා සිතන්නේ එය විවෘත කිරීමට පෙර යමක් තිබේද යන්න පරීක්ෂා කිරීම ගොළු බවය, එය එයයි;" ගොනුවක් තිබේදැයි පරීක්ෂා කිරීම ගොළු වන්නේ ඇයි?
පීටර් හුර්තක්

32
EtPetrHurtak: එය සැමවිටම නොවේ ( පැවැත්ම පරීක්ෂා කිරීමට හේතු රාශියක් ඇති නිසා), නමුත් ඔබ ගොනුව විවෘත කිරීමට යන්නේ නම් , openඇමතුම නිකුත් කර ව්‍යතිරේකය හැසිරවීම හෝ ගොනුව නොතිබුනේ නම් කුමක් කළ යුතුද ? හමු විය. ඇත්ත වශයෙන්ම, සැබෑ ලෝකය අවුල් සහගත ය: ඔබ පළමුව පරීක්ෂා කර එය එහි තිබේ නම්, එයින් අදහස් වන්නේ ඔබ එය විවෘත කිරීමට උත්සාහ කරන විට එය තවමත් පවතිනු ඇති බවයි; ඔබ පළමුව පරීක්ෂා කර එය නොමැති නම්, එයින් අදහස් වන්නේ එය මොහොතකට පසුව එහි නොඑන බවයි. ඒ වගේ දේවල් කාලානුරූපව පෙනේ, නමුත් ඒවා සෑම විටම පැමිණේ . එබැවින් ඔබ විවෘත කිරීමට යන්නේ නම් , පළමුව පරීක්ෂා කිරීමෙන් පලක් නැත.
ටී. ජේ ක්‍රෝඩර්

14
පාලක ප්‍රවාහය සඳහා දෝෂ භාවිතා කිරීම ප්‍රති-රටාවක් යැයි මම සිතුවෙමි: සබැඳිය
ආර්ගයිල්

4
@ ජෙරෝමියර්ස්: ඔබට හැකි නමුත් අයොනික් දැනටමත් ඔබ වෙනුවෙන් එය කර ඇත ( ඉහත අදහස බලන්න ). :-)
ටී. ජේ. ක්‍රෝඩර්

123

මූලාශ්රය දෙස බලා, ක සම මුහුර්තක අනුවාදය තියෙනවා path.exists- path.existsSync. පෙනෙන ආකාරයට එය ලේඛනයේ මග හැරී ඇත.

යාවත්කාලීන කිරීම:

path.existsහා path.existsSyncදැන් සිටින නොසලකා හරිනු . කරුණාකර භාවිතා කරන්න fs.existsසහfs.existsSync .

යාවත්කාලීන 2016:

fs.exists හා fs.existsSyncද ඇත අතහැර දමා . භාවිතය () fs.stat හෝ fs.access () වෙනුවට.

යාවත්කාලීන කිරීම 2019:

භාවිතය fs.existsSync. එය අතහැර දමා නැත. https://nodejs.org/api/fs.html#fs_fs_existssync_path



22
ඇත්ත වශයෙන්ම, වඩාත් මෑත පිළිතුරක්: path.existsSync අවලංගු කර ඇත. එය දැන් හැඳින්වේ fs.existsSync.
ඔලිවියර් ලාලොන්ඩේ

9
දැන් ලේඛනය පවසන්නේ fs.exists ඉවත් කරනු ඇති බවයි. nodejs.org/api/fs.html#fs_fs_existssync_path
ග්‍රෙග්

පැරණි existsශ්‍රිතය ප්‍රතිස්ථාපනය කිරීම සඳහා මම කුඩා පුස්තකාලයක් is-there
ලිව්වෙමි

6
currenct docs (version 9 අනුවාදය) නොමැති විට පමණක් fs.existsඅතහැර දැමූ ඒවා ලෙස ලේබල් කර ඇත fs.existsSync!
කුනොක්

57

දැනට නිර්දේශිත (2015 වන විට) ඒපීඅයි භාවිතා කරමින් (නෝඩ් ලියකියවිලි අනුව), මම කරන්නේ මෙයයි:

var fs = require('fs');

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

අදහස් දැක්වීමේදී බ්‍රෝඩ්බෑන්ඩ් විසින් මතු කරන ලද ඊපර්ම් ප්‍රශ්නයට ප්‍රතිචාර වශයෙන් එය හොඳ කරුණක් ගෙන එයි. fileExists () බොහෝ විට මේ ගැන සිතීමට හොඳ ක්‍රමයක් නොවේ, මන්ද fileExists () හට සැබවින්ම බූලියන් ප්‍රතිලාභයක් පොරොන්දු විය නොහැක. ගොනුව තිබේද නැද්ද යන්න නිශ්චිතවම තීරණය කිරීමට ඔබට හැකි විය හැක, නමුත් ඔබට අවසර දෝෂයක්ද ලැබෙනු ඇත. අවසර දෝෂය අනිවාර්යයෙන්ම ගොනුව පවතින බව අඟවන්නේ නැත, මන්ද ඔබ පරීක්ෂා කරන ගොනුව අඩංගු නාමාවලියට ඔබට අවසර නොමැති විය හැකිය. ඇත්ත වශයෙන්ම ලිපිගොනු පැවැත්ම පරීක්ෂා කිරීමේදී ඔබට වෙනත් දෝෂයක් ඇතිවීමේ අවස්ථාව තිබේ.

එබැවින් ඉහත මගේ කේතය ඇත්ත වශයෙන්ම කරන්නේ FileExistAndDoIHaveAccessToIt (), නමුත් ඔබේ ප්‍රශ්නය විය හැක්කේ FileNotExistAndCouldICreateIt (), එය සම්පූර්ණයෙන්ම වෙනස් තර්කනයකි (එය ඊපර්ම් දෝෂයක් සඳහා ගණන් දිය යුතුය, වෙනත් දේ අතර).

Fs.existsSync පිළිතුර මෙහි කෙලින්ම ඇසූ ප්‍රශ්නයට ආමන්ත්‍රණය කරන අතර, එය බොහෝ විට ඔබට අවශ්‍ය දේ නොවනු ඇත (“යමක්” මාර්ගයක තිබේදැයි දැන ගැනීමට ඔබට අවශ්‍ය නැත, ඔබ බොහෝ විට “දෙය” ගැන සැලකිලිමත් වේ. පවතින ගොනුවක් හෝ නාමාවලියකි).

අවසාන කරුණ නම්, ඔබ ගොනුවක් තිබේදැයි බැලීමට පරික්ෂා කරන්නේ නම්, ඔබ බොහෝ විට එසේ කරන්නේ ඔබ ප්‍රති result ලය මත පදනම්ව යම් ක්‍රියාමාර්ගයක් ගැනීමට අදහස් කරන නිසා විය හැකි අතර, එම තර්කනය (චෙක්පත සහ / හෝ පසුව ක්‍රියා කිරීම) එම අදහසට අනුගත විය යුතුය. එම මාර්ගයේ සොයාගත් දෙයක් ගොනුවක් හෝ නාමාවලියක් විය හැකි අතර, පරීක්ෂා කිරීමේ ක්‍රියාවලියේදී ඔබට ඊපර්ම් හෝ වෙනත් දෝෂ ඇතිවිය හැකිය.


4
හොඳයි, මම එකතු කළා || isDirectory () එය ගොනුවක් / ෆෝල්ඩර පරීක්ෂකයෙකු බවට පත් කිරීම. var stats = fs.statSync (filePath); ආපසු stats.isFile () || stats.isDirectory ();
බොබ්

4
ගොනුවට ප්‍රවේශ වීමට ක්‍රමලේඛයට අයිතියක් නොමැති නම්, ගොනුව පැවතුනද එය තවමත් අසත්‍ය වේ. එනම් chmod ugo-rwx file.txt හෝ වින්ඩෝස් රයිට් ක්ලික් වෙතින් සියලුම රිග්ට් ඉවත් කරන්න ... ව්‍යතිරේක පණිවිඩය: ව්‍යතිරේකය fs.statSync (./ f.txt): දෝෂය: EPERM: ක්‍රියාත්මක වීමට අවසර නැත, 'X: \ f.txt' ප්‍ර stat ප්තිය. එබැවින් මෙම නඩුව ඉහළ කේතයෙන් ආවරණය නොවේ.
බ්‍රෝඩ්බෑන්ඩ්

2
වාව්, ජේඑස් සමහර විට පසුබසිනු ඇත. ඉතින් විශ්වාසයි, ඔබ ගොනුව භාවිතා කරන වේලාවෙන් 97% ක්, නමුත් file.exists()3% සඳහා සරල ප්‍රයෝජනයක් නොතිබීම සහ ඒ වෙනුවට මෙය උත්සාහක දිනුම් ඇදීමක් සඳහා අපට බල කිරීම? සැබෑ වන්න ... දවසේ බැච්.
නෙරපා හරින ලද

20

තවත් යාවත්කාලීන කිරීමක්

මෙම ප්‍රශ්නයට මා විසින්ම පිළිතුරක් අවශ්‍ය වූ විට මම නෝඩ් ඩොක්ස් දෙස බැලුවෙමි, ඔබ fs.exists භාවිතා නොකළ යුතු බව පෙනේ , ඒ වෙනුවට fs.open භාවිතා කර ගොනුවක් නොපවතින්නේ දැයි සොයා ගැනීමට ප්‍රතිදාන දෝෂ භාවිතා කරන්න:

ලේඛනයෙන්:

fs.exists () යනු අනුකම්පාවක් වන අතර එය පවතින්නේ historical තිහාසික හේතූන් මත පමණි. එය ඔබේම කේතයේ භාවිතා කිරීමට කිසි විටෙකත් හේතුවක් නොතිබිය යුතුය.

විශේෂයෙන්, ගොනුවක් විවෘත කිරීමට පෙර එය තිබේදැයි පරීක්ෂා කිරීම ඔබ ජාතියේ තත්වයන්ට ගොදුරු විය හැකි ප්‍රති-රටාවක් වේ: තවත් ක්‍රියාවලියක් මඟින් fs.exists () සහ fs.open () වෙත ඇමතුම් අතර ඇති ගොනුව ඉවත් කළ හැකිය. ගොනුව විවෘත කර එය නොමැති විට දෝෂය හසුරුවන්න.

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


1
විවෘත නොවී විවෘත සින්ක් සමඟ එය කිරීමට ක්‍රමයක් තිබේද
ග්‍රෙග්

1
Reg ග්‍රෙග් හෝර්න්බි මම සිතන්නේ එය විවෘත සින්ක් සමඟද ක්‍රියා කළ යුතු බවයි
මෙල්බර්න්

2
තවමත් අවශ්‍ය exists සහ existsSyncමම නිර්මාණය කළ අය සඳහා is-there.
අයොනික් බිෂු

6
මෙම ක්ෂයවීම මට දෝෂාරෝපණය කරයි. අවශ්‍ය වන්නේ ගොනුවේ පැවැත්ම පිළිබඳ දැනුම පමණක් වන විට දෝෂයක් විසි වී ඇත්දැයි බැලීමට ගොනුවක් විවෘත කිරීම සම්පත් නාස්තියක් සේ පෙනේ.
ජොෂ් හැන්සන්

11

ගොනුවක් තිබේදැයි පරීක්ෂා කිරීමට මම පහත ශ්‍රිතය භාවිතා කරමි. එය වෙනත් ව්‍යතිරේකයන් ද අල්ලා ගනී. එබැවින් අයිතිවාසිකම් ගැටළු තිබේ නම් උදා. chmod ugo-rwx filenameහෝ වින්ඩෝස් Right Click -> Properties -> Security -> Advanced -> Permission entries: empty list ..ශ්‍රිතයේ ව්‍යතිරේකය නැවත පැමිණිය යුතුය. ගොනුව පවතින නමුත් එයට ප්‍රවේශ වීමට අපට අයිතියක් නැත. මේ ආකාරයේ ව්‍යතිරේකයන් නොසලකා හැරීම වැරදිය.

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, ...
  }
}

ව්‍යතිරේක ප්‍රතිදානය, ගොනුව නොපවතින විට nodejs දෝෂ ප්‍රලේඛනය :

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

ව්‍යතිරේකය අපට ගොනුවට අයිතිවාසිකම් නොමැති නමුත් පවතී:

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

2
ඇත්ත වශයෙන්ම මේ හා සමානව, මෙය යාවත්කාලීන කර ඇති පිළිතුරු කිහිපයෙන් එකකි, මෙය සිදු කිරීමේ අවසාන ක්‍රම 37 නෝඩ් විසින් ඉවත් කර ඇත
1mike12

බාහ්, ඔබ මට එයට පහර දුන්නා. මෙය කියවා ඇත්නම් මට යම් කාලයක් ඉතිරි කර ගත හැකිව තිබුණි.
jgmjgm

5

fs.exists () ඉවත් කර ඇත එය භාවිතා නොකරන්න https://nodejs.org/api/fs.html#fs_fs_exists_path_callback

මෙහි භාවිතා වන මූලික nodejs ක්‍රමය ඔබට ක්‍රියාත්මක කළ හැකිය: 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;
}

මෙය සංඛ්‍යාලේඛන වස්තුව නැවත ලබා දෙනු ඇත, එවිට ඔබට උත්සාහ කළ හැකි සංඛ්‍යාන වස්තුව ලැබුනු පසු

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

4

මෙහි සමහර පිළිතුරු එය පවසන fs.existsඅතර fs.existsSyncඒවා දෙකම ප්‍රතික්ෂේප කරනු ලැබේ. ලේඛනයට අනුව මෙය තවදුරටත් සත්‍ය නොවේ. fs.existsදැන් පමණක් ක්ෂය වී ඇත:

Fs.exists () අවලංගු කර ඇති නමුත් fs.existsSync () එසේ නොවන බව සලකන්න. (Fs.exists () වෙත වන ඇමතුම් ආපසු පරාමිතිය වෙනත් Node.js ඇමතුම් වලට නොගැලපෙන පරාමිතීන් පිළිගනී. Fs.existsSync () ඇමතුමක් භාවිතා නොකරයි.)

ගොනුවක් තිබේදැයි සමමුහුර්තව පරීක්ෂා කිරීමට ඔබට ආරක්ෂිතව fs.existsSync () භාවිතා කළ හැකිය .


3

මෙම pathමොඩියුලය ක සම මුහුර්තක අනුවාදය ලබා දෙන්නේ නැත path.existsඔබ සමග පමණ ශුක්ෂමව ඇති නිසා fsමොඩියුලය.

මට සිතාගත හැකි වේගවත්ම දෙය නම් භාවිතා කිරීම fs.realpathSyncඔබට අල්ලා ගත යුතු දෝෂයක් ඇති කරයි, එබැවින් ඔබ උත්සාහ කිරීම / අල්ලා ගැනීම සමඟ ඔබේම එතීමේ ක්‍රියාකාරිත්වය කළ යුතුය.


1

ගොනු පද්ධති (fs) පරීක්ෂණ භාවිතා කිරීමෙන් දෝෂ සහිත වස්තූන් අවුලුවනු ඇත, එවිට ඔබට උත්සාහ / අල්ලා ගැනීමේ ප්‍රකාශයක් ඔතා ගත යුතුය. ඔබ යම් උත්සාහයක් ඉතිරි කර 0.4.x ශාඛාවේ හඳුන්වා දුන් අංගයක් භාවිතා කරන්න.

var path = require('path');

var dirs = ['one', 'two', 'three'];

dirs.map(function(dir) {
  path.exists(dir, function(exists) {
    var message = (exists) ? dir + ': is a directory' : dir + ': is not a directory';
    console.log(message);
  });
});

2
Path.exists දැන් fs යටතේ පවතින බැවින් එය fs.exists (path, callback)
ටොඩ් මෝසෙස්

0

ලේඛන fs.stat()fs.access()ඔබ ගොනුව හැසිරවීමට නොයන්නේ නම් භාවිතා කිරීමට සඳහන් වේ . එය සාධාරණීකරණය කිරීමක් ලබා දුන්නේ නැත, වේගවත් හෝ අඩු මතක භාවිතය විය හැකිද?

මම රේඛීය ස්වයංක්‍රීයකරණය සඳහා නෝඩ් භාවිතා කරමි, එබැවින් ගොනු පැවැත්ම පරීක්ෂා කිරීම සඳහා මා භාවිතා කරන ශ්‍රිතය බෙදා ගැනීමට සිතුවෙමි.

var fs = require("fs");

function exists(path){
    //Remember file access time will slow your program.
    try{
        fs.accessSync(path);
    } catch (err){
        return false;
    }
    return true;
}

0

'නිවැරදිව' එම පුද්ගලයින් සඳහා යාවත්කාලීන කරන ලද asnwer එය ප්‍රශ්නයට කෙලින්ම පිළිතුරු නොදෙන බව පෙන්වා දෙමින් විකල්ප විකල්පයක් ගෙන එයි.

විසඳුම සමමුහුර්ත කරන්න:

fs.existsSync('filePath')මෙහි ලියකියවිලිබලන්න .

මාර්ගය තිබේ නම් සත්‍ය වේ, වෙනත් ආකාරයකින් අසත්‍යය.

අසින්ක් පොරොන්දු විසඳුම

අසින්ක් සන්දර්භය තුළ ඔබට යතුරුපදය භාවිතා කරමින් සමමුහුර්ත ක්‍රමයේදී අසින්ක් අනුවාදය ලිවිය හැකිය await. ඔබට සරලවම අසින්ක් ඇමතුම් ක්‍රමය මෙවැනි පොරොන්දුවක් බවට පත් කළ හැකිය:

function fileExists(path){
  return new Promise((resolve, fail) => fs.access(path, fs.constants.F_OK, 
    (err, result) => err ? fail(err) : resolve(result))
  //F_OK checks if file is visible, is default does no need to be specified.

}

async function doSomething() {
  var exists = await fileExists('filePath');
  if(exists){ 
    console.log('file exists');
  }
}

ප්‍රවේශය පිළිබඳ ලියකියවිලි ().


1
OP ට සමමුහුර්ත විසඳුමක් අවශ්‍යයි
vdegenne

ඔබ ඔබේ කේතය යාවත්කාලීන කළ යුතුයfunction asyncFileExists(path) { //F_OK checks if file is visible, is default does no need to be specified. return new Promise(function (res, rej) { fs.access( path, fs.constants.F_OK, function (err) { err ? rej(err) : res(true); }, ); }); }
pery mimon

0

අවස්ථා තිබේ, ඔබට ගොනුවක් තිබේදැයි දැන ගැනීමට අවශ්‍ය නම්, එය අවශ්‍ය නම් එය අවශ්‍ය කිරීමට ඔබ සැලසුම් කරයි.

function getFile(path){
    try{
        return require(path);
    }catch(e){
        return false;
    }
}

-1

මෙන්න මේ සඳහා සරල එතීමේ විසඳුමක්:

var fs = require('fs')
function getFileRealPath(s){
    try {return fs.realpathSync(s);} catch(e){return false;}
}

භාවිතය:

  • නාමාවලි සහ ගොනු යන දෙකම සඳහා ක්‍රියා කරයි
  • අයිතමය තිබේ නම්, එය ගොනුව හෝ නාමාවලිය වෙත මාර්ගය නැවත ලබා දෙයි
  • අයිතමය නොපවතී නම්, එය සාවද්‍ය වේ

උදාහරණයක්:

var realPath,pathToCheck='<your_dir_or_file>'
if( (realPath=getFileRealPath(pathToCheck)) === false){
    console.log('file/dir not found: '+pathToCheck);
} else {
    console.log('file/dir exists: '+realPath);
}

නැවත පැමිණීම අසත්‍යදැයි පරීක්ෂා කිරීමට ඔබ === ක්‍රියාකරු භාවිතා කරන බවට වග බලා ගන්න. නිසි සේවා කොන්දේසි යටතේ fs.realpathSync () අසත්‍ය බවට පත්වීමට කිසිදු තර්කානුකූල හේතුවක් නොමැත, එබැවින් මෙය 100% ක් ක්‍රියාත්මක විය යුතු යැයි මම සිතමි.

දෝෂයක් ජනනය නොකරන සහ එහි ප්‍රති performance ලයක් ලෙස ක්‍රියාකාරීත්වයට පහර නොදෙන විසඳුමක් දැකීමට මම කැමැත්තෙමි. API දෘෂ්ටි කෝණයකින්, fs.exists () වඩාත් අලංකාර විසඳුමක් සේ පෙනේ.


1
An ඩෑන්, ස්තූතියි. මම කැපූ පෙළ ඉවත් කළා. සටහන කුමක්දැයි මට මතක නැත. එය මා වෙත පැමිණියහොත් මම සටහන් එකතු කරමි.
තිමෝති සී. ක්වින්

1
එන්.පී. මම මගේ අදහස මකා දමමි.
ඩෑන් ඩස්කල්ස්කු

-2

පිළිතුරු වලින් පෙනී යන්නේ මේ සඳහා නිල API සහාය නොමැති බවයි (සෘජු හා පැහැදිලි චෙක්පතක දී මෙන්). බොහෝ පිළිතුරු පවසන්නේ සංඛ්‍යා භාවිතා කරන ලෙසයි, කෙසේ වෙතත් ඒවා දැඩි නොවේ. සංඛ්‍යාලේඛන මගින් විසි කරන ඕනෑම දෝෂයක් යනු යමක් නොපවතින බව අපට උපකල්පනය කළ නොහැක.

නොපවතින දෙයක් සමඟ අපි එය උත්සාහ කරමු යැයි කියමු:

$ node -e 'require("fs").stat("god",err=>console.log(err))'
{ Error: ENOENT: no such file or directory, stat 'god' errno: -2, code: 'ENOENT', syscall: 'stat', path: 'god' }

පවතින නමුත් අපට ප්‍රවේශය නොමැති දෙයක් සමඟ එය උත්සාහ කරමු:

$ mkdir -p fsm/appendage && sudo chmod 0 fsm
$ node -e 'require("fs").stat("fsm/appendage",err=>console.log(err))'
{ Error: EACCES: permission denied, stat 'access/access' errno: -13, code: 'EACCES', syscall: 'stat', path: 'fsm/appendage' }

අවම වශයෙන් ඔබට අවශ්‍ය වනු ඇත:

let dir_exists = async path => {
    let stat;
    try {
       stat = await (new Promise(
           (resolve, reject) => require('fs').stat(path,
               (err, result) => err ? reject(err) : resolve(result))
       ));
    }
    catch(e) {
        if(e.code === 'ENOENT') return false;
        throw e;
    }

    if(!stat.isDirectory())
        throw new Error('Not a directory.');

    return true;
};

ඔබට එය සැබවින්ම සමමුහුර්ත වීමට අවශ්‍යද නැතිනම් එය සමමුහුර්ත ලෙස ලිවීමට අවශ්‍යද යන ප්‍රශ්නය පැහැදිලි නැත. මෙම උදාහරණය wait / async භාවිතා කරයි, එවිට එය සමකාලීනව ලියා ඇති නමුත් සමමුහුර්තව ක්‍රියාත්මක වේ.

මෙයින් අදහස් කරන්නේ ඔබ එය ඉහළ මට්ටමින් හැඳින්විය යුතු බවයි:

(async () => {
    try {
        console.log(await dir_exists('god'));
        console.log(await dir_exists('fsm/appendage'));
    }
    catch(e) {
        console.log(e);
    }
})();

විකල්පයක් නම්, ඔබට තව දුරටත් අවශ්‍ය නම්, අසින්ක් ඇමතුමෙන් ලැබෙන පොරොන්දුව මත .තන් සහ .කැච් භාවිතා කිරීමයි.

ඔබට යමක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍ය නම් එය නාමාවලියක් හෝ ගොනුවක් වැනි නිවැරදි වර්ගයක් බව සහතික කිරීම හොඳ පුරුද්දකි. මෙය උදාහරණයට ඇතුළත් කර ඇත. එය සිම්ලින්ක් වීමට ඉඩ නොදෙන්නේ නම්, සංඛ්‍යා ස්වයංක්‍රීයව සබැඳි හරහා ගමන් කරන බැවින් ඔබ සංඛ්‍යා වෙනුවට lstat භාවිතා කළ යුතුය.

ඔබට මෙහි ඇති සියලුම සමමුහුර්ත කේතය සමමුහුර්ත කිරීම සඳහා ප්‍රතිස්ථාපනය කර ඒ වෙනුවට statSync භාවිතා කළ හැකිය. කෙසේවෙතත්, සමමුහුර්තකරණය සහ විශ්වීය සහයෝගය ලබා ගැනීමට බලා සිටීම සමමුහුර්ත ඇමතුම් අවසානයේදී ක්ෂය වීමට අතිරික්ත වනු ඇතැයි අපේක්ෂා කරන්න (එසේ නොමැතිනම් ඔබට ඒවා සෑම තැනකම අර්ථ දැක්විය යුතු අතර දම්වැල ඉහළට ඔසවා තැබීම අර්ථ විරහිත කරයි).


1
මුල් ප්‍රශ්නය එය සඳහන් නොකරයි. මම නිසැකවම නිරූපණය කරන්නේ දේවල් නිසැකවම කරන්නේ කෙසේද යන්නයි. බොහෝ පිළිතුරු පැහැදිලි බවක් නොමැති වීම නිසා දෝෂ ඇති විය හැක. මිනිසුන්ට බොහෝ විට දේවල් ක්‍රමලේඛනය කිරීමට අවශ්‍ය වන බැවින් එය සමමුහුර්ත ලෙස පෙනෙන නමුත් සමමුහුර්තව ක්‍රියාත්මක කිරීමට අවශ්‍ය නොවේ. statSync මා නිරූපණය කළ කේතයට සමාන නොවේ. එක්කෝ සැබවින්ම අපේක්ෂා කරන දේ පිළිබඳ ගිණුම් අපැහැදිලි ය, එබැවින් ඔබ පනවන්නේ ඔබේ පුද්ගලික අර්ථ නිරූපණයන් පමණි. ඔබට පිළිතුරක් සොයාගත නොහැකි නම්, ඔබට අවශ්‍ය නොවන සංස්කරණ හෝ අගමැතිවරයාගෙන් විමසීම වඩා හොඳ විය හැකිය.
jgmjgm

1
ඔබට අවශ්‍ය නම් ඔබට මගේ කේත නියැදිය සොරකම් කළ හැකිය, සුදුසු ලෙස නම් කරන්න, එය ගිතබ් මත තබන්න, එය npm ට එක් කරන්න, එවිට පිළිතුර එක් පේළියක් / සබැඳියක් පමණක් වනු ඇත: D.
jgmjgm

උදාහරණ සඳහා කේතය කෙටි නමුත් &&! IsFile හෝ සිම්ලින්ක් සඳහා චෙක්පතක් ඇතුළත් කිරීම සඳහා සංස්කරණ යෝජනාවක් ඉදිරිපත් කිරීමට ඔබව සාදරයෙන් පිළිගනිමු. මම දැනටමත් පෙන්වා දී ඇති පරිදි, මගේ පිළිතුර ප්‍රශ්නයේ එක් අර්ථකථනයක් තෘප්තිමත් කරන අතර ඔබේ එක් පේළියේ යෝජනාව කරන දේම නොකරයි.
jgmjgm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.