חיפוש קובץ ב node.js
-
אני מנסה לכתוב תוכנית קטנה לחיפוש קובץ באמצעות המודול המובנה
fs
. התוכנית מקבלת את השם של הקובץ כארגומנט, ומחזירה את הנתיב הראשון שבו היא מוצאת קובץ עם אותו שם.את החיפוש עצמו, חשבתי לעשות עם פונקציה רקורסיבית כזאת (אם למישהו יש רעיון יותר טוב אשמח לשמוע):
function readdir(directory) { fs.readdir(directory, function (err, res) { if (err) console.log(err); console.log(res); for (let f of res) { if (f == arg) { console.log('Found! in', directory); process.exit(0); } else { fs.stat(path.join(directory, f), function (err, stat) { if (err) console.log(err); if (stat.isDirectory()) { readdir(path.join(directory, f)); } }) } } }) } readdir('C:/');
כמובן שבתחילת התוכנית אני מייבא את המודולים הנצרכים ומקבל את הארגומנט באמצעות
process.argv
:const fs = require('fs'); const path = require('path'); const arg = process.argv[2];
הבעיה היא שהעסק משום מה לא כל כך עובד... כלומר, זה נראה שהוא נתקע די בהתחלה של הבדיקה של התיקיות. ממה שהצלחתי להבין, זה בעיה בהרשאות, שהתוכנית לא מצליחה לקבל
stat
של קבצים מסויימים בשביל להבין אם הם תיקייה או קובץ, והיא קורסת. השאלה שלי היא: האם באמת זאת הבעיה? ואם כן, איך ניתן להתגבר עליה (אולי לבדוק לפני הstat
גם את ההרשאות של הקובץ..) בקיצור, אשמח לעזרה. -
@מוטי-אורן יש בעיה בשורה 3 ו-11 של הקוד. אתה בודק אם יש שגיאה, ואם יש אתה מדפיס לקונסול, אבל הקוד ממשיך לרוץ למרות השגיאה. זה גורם לשגיאות בהמשך הפונקציה בשורה 5 יש בעיה שבמקרה של שגיאה
res
הואundefined
ובשורה 8 יש בעיה שבמקרה של שגיאהstat
הואundefined
. אתה צריך לעשותreturn
אחרי ההדפסה לקונסול כאשר יש שגיאה. -
@yossiz יפה מאוד, לא הצלחתי למצוא את זה..
אפשר בטריק להדפיס ולצאת מהפונקציה באותה פקודה, ככה:function readdir(directory) { fs.readdir(directory, function (err, res) { if (err) return console.log(err); for (let f of res) { if (f == arg) { console.log('Found! in', directory); process.exit(0); } else { fs.stat(path.join(directory, f), function (err, stat) { if (err) return console.log(err); if (stat?.isDirectory()) { readdir(path.join(directory, f)); } }) } } }) }
-
@dovid אמר בחיפוש קובץ ב node.js:
אפשר בטריק להדפיס ולצאת מהפונקציה באותה פקודה
אני יודע. אבל בד"כ אני נמנע מזה (כאשר העצלות לא גוברת...) כי זה נראה שאתה רוצה להחזיר ערך. זו לא עבירה גדולה. אבל שווה לי המחיר של הסוגריים (שבכל מקרה אני נוהג להכניס גם עבור שורה אחת) כדי שהקוד יבטא יותר טוב את כוונת המשורר.