উত্তর:
var fs = require('fs');
var dir = './tmp';
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
Syncপদ্ধতিগুলি ব্যবহার করা সাধারণত একটি নো:
না, একাধিক কারণে
pathমডিউল একটি নেই exists/ existsSyncপদ্ধতি। এটি fsমডিউলে রয়েছে। (সম্ভবত আপনি আপনার প্রশ্নে টাইপ করেছেন?)
ডকস স্পষ্টভাবে আপনাকে ব্যবহার থেকে নিরুৎসাহিত করে exists।
fs.exists()একটি অ্যানক্রোনজম এবং এটি কেবল historicalতিহাসিক কারণে বিদ্যমান। এটি নিজের কোডে ব্যবহার করার কারণ নেই almostবিশেষত, ফাইলটি খোলার আগে উপস্থিত রয়েছে কিনা তা পরীক্ষা করা একটি অ্যান্টি-প্যাটার্ন যা আপনাকে জাতিগত অবস্থার জন্য ঝুঁকির মধ্যে ফেলে: অন্য কোনও প্রক্রিয়া কল
fs.exists()এবং এর মধ্যে ফাইলটিকে সরিয়ে ফেলতে পারেfs.open()। কেবল ফাইলটি খুলুন এবং ত্রুটিটি সেখানে উপস্থিত না হলে পরিচালনা করুন।
যেহেতু আমরা একটি ফাইলের পরিবর্তে ডিরেক্টরি সম্পর্কে কথা বলছি, এই পরামর্শটি বোঝায় যে আপনার কেবল শর্তযুক্ত কল করা mkdirএবং উপেক্ষা করা উচিত EEXIST।
সাধারণভাবে, আপনার * Syncপদ্ধতিগুলি এড়ানো উচিত । তারা অবরুদ্ধ করছে, যার অর্থ আপনি ডিস্কে যাওয়ার সময় আপনার প্রোগ্রামের আর কিছুই ঘটতে পারে না। এটি একটি খুব ব্যয়বহুল অপারেশন, এবং নোডের ইভেন্ট লুপটির মূল অনুমানটি ভেঙে যাওয়ার সময়টি।
* Syncপদ্ধতিগুলি একক-উদ্দেশ্যমূলক দ্রুত স্ক্রিপ্টগুলিতে সাধারণত সূক্ষ্ম হয় (সেগুলি যা একটি কাজ করে এবং তারপরে প্রস্থান করে) তবে আপনি যখন সার্ভারটি লিখছেন তখন কখনই ব্যবহার করা উচিত নয়: আপনার সার্ভার পুরো সময়কালে কারও প্রতিক্রিয়া জানাতে অক্ষম হবে I / O অনুরোধগুলির। যদি একাধিক ক্লায়েন্টের অনুরোধের I / O ক্রিয়াকলাপগুলির প্রয়োজন হয় তবে আপনার সার্ভারটি খুব দ্রুত থামতে হবে ha
আমি যখন Syncসার্ভার অ্যাপ্লিকেশনটিতে * পদ্ধতিগুলি ব্যবহার করার বিষয়টি বিবেচনা করব তখন একবারে (এবং কেবল একবারেই) একবার সঞ্চালনের সময় ঘটে operation উদাহরণস্বরূপ, মডিউলগুলি লোড করতে require আসলে ব্যবহারreadFileSync করে।
তারপরেও, আপনাকে এখনও সতর্ক থাকতে হবে কারণ প্রচুর সিঙ্ক্রোনাস I / O অকারণে আপনার সার্ভারের প্রারম্ভকালীন সময়কে ধীর করতে পারে।
পরিবর্তে, আপনার অ্যাসিনক্রোনাস আই / ও পদ্ধতি ব্যবহার করা উচিত।
সুতরাং আমরা যদি সেই পরামর্শগুলির টুকরাগুলি একসাথে রাখি তবে আমরা এরকম কিছু পাই:
function ensureExists(path, mask, cb) {
if (typeof mask == 'function') { // allow the `mask` parameter to be optional
cb = mask;
mask = 0777;
}
fs.mkdir(path, mask, function(err) {
if (err) {
if (err.code == 'EEXIST') cb(null); // ignore the error if the folder already exists
else cb(err); // something else went wrong
} else cb(null); // successfully created folder
});
}
এবং আমরা এটি এর মতো ব্যবহার করতে পারি:
ensureExists(__dirname + '/upload', 0744, function(err) {
if (err) // handle folder creation error
else // we're all good
});
অবশ্যই, এটি প্রান্তের মতো মামলার জন্য অ্যাকাউন্ট করে না
0744 == 484।
আমি খুঁজে পেয়েছি এবং এনপিএম মডিউল যা এর জন্য কবজির মতো কাজ করে। এটি যখন প্রয়োজন হয় তখন কেবল পুনরাবৃত্তভাবে mkdir করে, যেমন "এমকেডির-পি"।
mkdirপদ্ধতি করার ক্ষমতা থাকবে যাও recursively তৈরি একটি পাথ না যে বিদ্যমান যে কোন ডিরেক্টরি, এবং বেশী যে উপেক্ষা করি।
থেকে নোড V10 / 11 ডক্স :
// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
if (err) throw err;
});
দ্রষ্টব্য: আপনাকে fsপ্রথমে বিল্ট-ইন মডিউলটি আমদানি করতে হবে ।
এখন এখানে আরও কয়েকটি দৃ example় উদাহরণ যা নেটিভ ইএস মডিউলগুলি (ফ্ল্যাগ সক্ষম ও .mjs এক্সটেনশন সহ) উপার্জন করে, অ-রুট পাথগুলি পরিচালনা করে এবং পুরো পথের নামগুলির জন্য অ্যাকাউন্টগুলি:
import fs from 'fs';
import path from 'path';
createDirectories(pathname) {
const __dirname = path.resolve();
pathname = pathname.replace(/^\.*\/|\/?[^\/]+\.[a-z]+|\/$/g, ''); // Remove leading directory markers, and remove ending /file-name.extension
fs.mkdir(path.resolve(__dirname, pathname), { recursive: true }, e => {
if (e) {
console.error(e);
} else {
console.log('Success');
}
});
}
আপনি এটি ব্যবহার করতে পারেন createDirectories('/components/widget/widget.js');।
এবং অবশ্যই, আপনি সম্ভবত async এর সাথে প্রতিশ্রুতি ব্যবহার করে / ডিরেক্টরিগুলি তৈরি হওয়ার সময় আরও বেশি পঠনযোগ্য সিঙ্ক্রোনাস-চেহারা পদ্ধতিতে ফাইল তৈরির জন্য অপেক্ষা করতে চেয়ে আরও অভিনবতা পেতে চান; কিন্তু, এটি প্রশ্নের ক্ষেত্রের বাইরে।
কেবলমাত্র যদি কেউ এক লাইনের সংস্করণে আগ্রহী। :)
//or in typescript: import * as fs from 'fs';
const fs = require('fs');
!fs.existsSync(dir) && fs.mkdirSync(dir);
mkdirফোল্ডারটি উপস্থিত থাকলে আপনি কেবল ত্রুটিটি ব্যবহার করতে এবং ধরতে পারেন।
এটি async (তাই সেরা অনুশীলন) এবং নিরাপদ।
fs.mkdir('/path', err => {
if (err && err.code != 'EEXIST') throw 'up'
.. safely do your stuff here
})
(Ptionচ্ছিকভাবে মোডের সাথে একটি দ্বিতীয় যুক্তি যুক্ত করুন))
অন্যান্য চিন্তা:
আপনি তখন ব্যবহার করতে পারেন বা দেশীয় প্রতিশ্রুতি ব্যবহার করে অপেক্ষা করতে পারেন ।
const util = require('util'), fs = require('fs');
const mkdir = util.promisify(fs.mkdir);
var myFunc = () => { ..do something.. }
mkdir('/path')
.then(myFunc)
.catch(err => { if (err.code != 'EEXIST') throw err; myFunc() })আপনি নিজের প্রতিশ্রুতি পদ্ধতিটি তৈরি করতে পারেন, এর মতো কিছু (অনির্ধারিত):
let mkdirAsync = (path, mode) => new Promise(
(resolve, reject) => mkdir (path, mode,
err => (err && err.code !== 'EEXIST') ? reject(err) : resolve()
)
)সিঙ্ক্রোনাস চেকিংয়ের জন্য, আপনি ব্যবহার করতে পারেন:
fs.existsSync(path) || fs.mkdirSync(path)অথবা আপনি একটি লাইব্রেরি ব্যবহার করতে পারেন, দুটি সবচেয়ে জনপ্রিয় সত্তা
mkdir('/path').catch(err => { if (err.code != 'EEXIST') throw err;}).then(myFunc);
!==পরিবর্তে ব্যবহার করুন!=
সঙ্গে FS-অতিরিক্ত প্যাকেজ আপনার সাথে এটা করতে পারেন একটি এক মাছ ধরার নৌকা :
const fs = require('fs-extra');
const dir = '/tmp/this/path/does/not/exist';
fs.ensureDirSync(dir);
সবচেয়ে ভাল সমাধান হ'ল নোড-এফএস-এক্সট্রা নামক এনপিএম মডিউলটি ব্যবহার করা । এটির একটি পদ্ধতি রয়েছে mkdirযা আপনার উল্লিখিত ডিরেক্টরিটি তৈরি করে। আপনি যদি একটি দীর্ঘ ডিরেক্টরি পাথ দেন তবে এটি প্যারেন্ট ফোল্ডারগুলি স্বয়ংক্রিয়ভাবে তৈরি করবে। মডিউলটি এনপিএম মডিউলের একটি দুর্দান্ত সেট fs, সুতরাং আপনি fsএই মডিউলটি যুক্ত করলে আপনি সমস্ত ফাংশনও ব্যবহার করতে পারেন ।
var dir = 'path/to/dir';
try {
fs.mkdirSync(dir);
} catch(e) {
if (e.code != 'EEXIST') throw e;
}
fs.exists()তবে fs.existsSync()তা নয়। আপনি কি কোনও রিসোর্সের সাথে একটি লিঙ্ক যুক্ত করতে পারেন যা অবহিত হয়েছে fs.existsSync()?
var filessystem = require('fs');
var dir = './path/subpath/';
if (!filessystem.existsSync(dir)){
filessystem.mkdirSync(dir);
}else
{
console.log("Directory already exist");
}
এটি আপনাকে সাহায্য করতে পারে :)
উদ্দীপনা: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
সমাধান
const fs = require('fs') // in javascript
import * as fs from "fs" // in typescript
import fs from "fs" // in typescript
// it will create the directory if it does not exist.
!fs.existsSync(`./assets/`) && fs.mkdirSync(`./assets/`, { recursive: true })
আমি josh3736 এর উত্তরের একটি টাইপস্ক্রিপ্ট প্রতিশ্রুতি সংশোধক যুক্ত করতে চাই ।
এটি একই কাজ করে এবং একই প্রান্তের কেস রয়েছে, এটি কেবল প্রতিশ্রুতি, টাইপস্ক্রিপ্ট টাইপডেফগুলি ব্যবহার করতে ঘটে এবং "ব্যবহার কঠোর" সাথে কাজ করে।
// https://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation
const allRWEPermissions = parseInt("0777", 8);
function ensureFilePathExists(path: string, mask: number = allRWEPermissions): Promise<void> {
return new Promise<void>(
function(resolve: (value?: void | PromiseLike<void>) => void,
reject: (reason?: any) => void): void{
mkdir(path, mask, function(err: NodeJS.ErrnoException): void {
if (err) {
if (err.code === "EEXIST") {
resolve(null); // ignore the error if the folder already exists
} else {
reject(err); // something else went wrong
}
} else {
resolve(null); // successfully created folder
}
});
});
}
নোড 10 + ইএস 6 সহ:
import path from 'path';
import fs from 'fs';
(async () => {
const dir = path.join(__dirname, 'upload');
try {
await fs.promises.mkdir(dir);
} catch (error) {
if (error.code === 'EEXIST') {
// Something already exists, but is it a file or directory?
const lstat = await fs.promises.lstat(dir);
if (!lstat.isDirectory()) {
throw error;
}
} else {
throw error;
}
}
})();
আপনি নোড ব্যবহার করতে পারেন ফাইল সিস্টেম কমান্ড fs.stat যদি Dir বিদ্যমান এবং চেক করতে fs.mkdir কলব্যাক সঙ্গে একটি সংকলন তৈরি করা, অথবা fs.mkdirSync এই উদাহরণে মত কলব্যাক ছাড়া একটি সংকলন তৈরি করা:
//first require fs
const fs = require('fs');
// Create directory if not exist (function)
const createDir = (path) => {
// check if dir exist
fs.stat(path, (err, stats) => {
if (stats.isDirectory()) {
// do nothing
} else {
// if the given path is not a directory, create a directory
fs.mkdirSync(path);
}
});
};
পুনরাবৃত্তভাবে ডিরেক্টরিগুলি তৈরি করতে এখানে একটি ছোট ফাংশন রয়েছে:
const createDir = (dir) => {
// This will create a dir given a path such as './folder/subfolder'
const splitPath = dir.split('/');
splitPath.reduce((path, subPath) => {
let currentPath;
if(subPath != '.'){
currentPath = path + '/' + subPath;
if (!fs.existsSync(currentPath)){
fs.mkdirSync(currentPath);
}
}
else{
currentPath = subPath;
}
return currentPath
}, '')
}
অ্যাসিঙ্ক ব্যবহার / অপেক্ষা করুন:
const mkdirP = async (directory) => {
try {
return await fs.mkdirAsync(directory);
} catch (error) {
if (error.code != 'EEXIST') {
throw e;
}
}
};
আপনাকে প্রতিশ্রুতি দিতে হবে fs:
import nodeFs from 'fs';
import bluebird from 'bluebird';
const fs = bluebird.promisifyAll(nodeFs);