File System (fs) moduli
Node.js fayl tizimiga kirish
Node.js File System moduli (fs) kompyuteringizdagi fayl tizimi bilan ishlash uchun keng qamrovli metodlar to‘plamini taqdim etadi.
U fayllarni kiritish-chiqarish operatsiyalarini sinxron va asinxron usullarda bajarish imkonini beradi.
Eslatma: Fayl tizimi (fs) moduli asosiy Node.js modulidir, shuning uchun o‘rnatish talab qilinmaydi.
Fayl tizimi (fs) modulini import qilish
Fayl tizimi (fs) modulini CommonJS require() yoki ES modullari import sintaksisi yordamida import qilishingiz mumkin:
CommonJS (Node.js’da standart)
const fs = require('fs');
ES modullari ("turi" bilan Node.js 14+: package.json ichidagi "modul")
import fs from 'fs';
// Or for specific methods:
// import { readFile, writeFile } from 'fs/promises';
Promise-ga asoslangan API
Node.js zamonaviy ilovalar uchun tavsiya etilgan fs/promises nom maydonida File System API ning va’daga asoslangan versiyalarini taqdim etadi:
// Using promises (Node.js 10.0.0+)
const fs = require('fs').promises;
// Or with destructuring
const { readFile, writeFile } = require('fs').promises;
// Or with ES modules
// import { readFile, writeFile } from 'fs/promises';
Umumiy foydalanish holatlari
Fayl operatsiyalari
- Fayllarni o‘qish va yozish
- Fayllarni yaratish va o‘chirish
- Fayllarga qo‘shish
- Fayl nomini o‘zgartirish va ko‘chirish
- Fayl ruxsatlarini o‘zgartiring
Katalog operatsiyalari
- Kataloglarni yaratish va o‘chirish
- Katalog tarkibini ro‘yxatlash
- Fayl o‘zgarishlariga e’tibor bering
- Fayl/katalog statistikasini oling
- Fayl mavjudligini tekshiring
Kengaytirilgan xususiyatlar
- Fayl oqimlari
- Fayl deskriptorlari
- Ramziy havolalar
- Fayl tomosha qilish
- Fayl ruxsatnomalari bilan ishlash
Ishlash bo‘yicha maslahat: Katta hajmdagi fayllar uchun xotirani ko‘p ishlatmaslik uchun oqimlardan ( fs.createReadStream va fs.createWriteStream ) foydalanishni o‘ylab ko‘ring.
Fayllarni o‘qish
Node.js fayllarni o‘qish uchun bir nechta usullarni taqdim etadi, jumladan, callback funksiyasi qilish va Promise-ga asoslangan yondashuvlar.
Eng keng tarqalgan usul - fs.readFile() .
Eslatma: Ilovangiz ishdan chiqishiga yo‘l qo‘ymaslik uchun fayl operatsiyalari bilan ishlashda har doim xatolarni ko‘rib chiqing.
Callback-lar bilan fayllarni o‘qish
An’anaviy callback funksiyasi namunasi yordamida faylni qanday o‘qish mumkin:
myfile.txt
This is the content of myfile.txt
Matn faylini o‘qiydigan Node.js faylini yarating va tarkibni qaytaring:
Misol: Callback-lar bilan faylni o‘qish
const fs = require('fs');
// Read file asynchronously with callback
fs.readFile('myfile.txt', 'utf8', (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.log('File content:', data);
});
// For binary data (like images), omit the encoding
fs.readFile('image.png', (err, data) => {
if (err) throw err;
// data is a Buffer containing the file content
console.log('Image size:', data.length, 'bytes');
});
Misolni ishga tushirish »
Fayllarni Promise’lar bilan o‘qish (zamonaviy yondashuv)
Asink/kutish sintaksisini tozalash uchun fs.promises yoki util.promisify dan foydalanish:
Misol: async/await bilan faylni o‘qish
// Using fs.promises (Node.js 10.0.0+)
const fs = require('fs').promises;
async function readFileExample() {
try {
const data = await fs.readFile('myfile.txt', 'utf8');
console.log('File content:', data);
} catch (err) {
console.error('Error reading file:', err);
}
}
readFileExample();
// Or with util.promisify (Node.js 8.0.0+)
const { promisify } = require('util');
const readFileAsync = promisify(require('fs').readFile);
async function readWithPromisify() {
try {
const data = await readFileAsync('myfile.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}
readWithPromisify();
Misolni ishga tushirish »
Fayllarni sinxron o‘qish
Oddiy skriptlar uchun siz sinxron usullardan foydalanishingiz mumkin, ammo ishlab chiqarish serverlarida ulardan qoching, chunki ular voqea siklini bloklaydi:
Misol: Faylni sinxron o‘qish
const fs = require('fs');
try {
// Read file synchronously
const data = fs.readFileSync('myfile.txt', 'utf8');
console.log('File content:', data);
} catch (err) {
console.error('Error reading file:', err);
}
Eng yaxshi amaliyot: Matn fayllarini o‘qiyotganda, Buffer o‘rniga string olish uchun har doim belgilar kodlashni (“utf8” kabi) belgilang.
Fayllarni yaratish va yozish
Node.js fayllarni yaratish va ularga yozish uchun bir necha usullarni taqdim etadi.
Mana eng keng tarqalgan yondashuvlar:
1. fs.writeFile() dan foydalanish
Yangi fayl yaratadi yoki ko‘rsatilgan tarkibga ega mavjud faylning ustiga yozadi:
Misol: faylga yozish
const fs = require('fs').promises;
async function writeFileExample() {
try {
// Write text to a file
await fs.writeFile('myfile.txt', 'Hello, World!', 'utf8');
// Write JSON data
const data = { name: 'John', age: 30, city: 'New York' };
await fs.writeFile('data.json', JSON.stringify(data, null, 2), 'utf8');
console.log('Files created successfully');
} catch (err) {
console.error('Error writing files:', err);
}
}
writeFileExample();
Misolni ishga tushirish »
2. fs.appendFile() dan foydalanish
Faylga kontent qo‘shadi, agar u mavjud bo‘lmasa, uni yaratadi:
Misol: faylga qo‘shish
const fs = require('fs').promises;
async function appendToFile() {
try {
// Append a timestamped log entry
const logEntry = `${new Date().toISOString()}: Application started\n`;
await fs.appendFile('app.log', logEntry, 'utf8');
console.log('Log entry added');
} catch (err) {
console.error('Error appending to file:', err);
}
}
appendToFile();
Misolni ishga tushirish »
3. Fayl tutqichlaridan foydalanish
Fayl operatsiyalari ustidan ko‘proq nazorat qilish uchun siz fayl tutqichlaridan foydalanishingiz mumkin:
Misol: Fayl tutqichlaridan foydalanish
const fs = require('fs').promises;
async function writeWithFileHandle() {
let fileHandle;
try {
// Open a file for writing (creates if doesn't exist)
fileHandle = await fs.open('output.txt', 'w');
// Write content to the file
await fileHandle.write('First line\n');
await fileHandle.write('Second line\n');
await fileHandle.write('Third line\n');
console.log('Content written successfully');
} catch (err) {
console.error('Error writing to file:', err);
} finally {
// Always close the file handle
if (fileHandle) {
await fileHandle.close();
}
}
}
writeWithFileHandle();
Misolni ishga tushirish »
4. Katta fayllar uchun oqimlardan foydalanish
Katta hajmdagi ma’lumotlarni yozish uchun, ko‘p xotiradan foydalanishni oldini olish uchun oqimlardan foydalaning:
Misol: Streamlar bilan katta hajmdagi fayllarni yozish
const fs = require('fs');
const { pipeline } = require('stream/promises');
const { Readable } = require('stream');
async function writeLargeFile() {
// Create a readable stream (could be from HTTP request, etc.)
const data = Array(1000).fill().map((_, i) => `Line ${i + 1}: ${'x'.repeat(100)}\n`);
const readable = Readable.from(data);
// Create a writable stream to a file
const writable = fs.createWriteStream('large-file.txt');
try {
// Pipe the data from readable to writable
await pipeline(readable, writable);
console.log('Large file written successfully');
} catch (err) {
console.error('Error writing file:', err);
}
}
writeLargeFile();
Misolni ishga tushirish »
Fayl bayroqlari: Fayllarni ochishda siz turli rejimlarni belgilashingiz mumkin:
'w'- Yozish uchun ochish (fayl yaratiladi yoki mazmuni tozalanadi)'wx'- "w" kabi, lekin yo‘l mavjud bo‘lsa, bajarilmaydi'w+'- O‘qish va yozish uchun ochish (fayl yaratiladi yoki mazmuni tozalanadi)'a'- Qo‘shish uchun ochiq (fayl mavjud bo‘lmasa yaratiladi)'ax'- "a" kabi, lekin yo‘l mavjud bo‘lsa, muvaffaqiyatsiz bo‘ladi'r+'- O‘qish va yozish uchun ochish (fayl mavjud bo‘lishi shart)
Fayllar va kataloglarni o‘chirish
Node.js fayl va kataloglarni o‘chirishning bir necha usullarini taqdim etadi.
Turli xil o‘chirish stsenariylarini qanday boshqarish mumkin:
1. Bitta faylni o‘chirish
Faylni o‘chirish uchun fs.unlink() dan foydalaning:
Misol: faylni o‘chirish
const fs = require('fs').promises;
async function deleteFile() {
const filePath = 'file-to-delete.txt';
try {
// Check if file exists before deleting
await fs.access(filePath);
// Delete the file
await fs.unlink(filePath);
console.log('File deleted successfully');
} catch (err) {
if (err.code === 'ENOENT') {
console.log('File does not exist');
} else {
console.error('Error deleting file:', err);
}
}
}
deleteFile();
Misolni ishga tushirish »
2. Bir nechta fayllarni o‘chirish
Bir nechta fayllarni o‘chirish uchun Promise.all() dan fs.unlink() bilan foydalanishingiz mumkin:
Misol: bir nechta fayllarni o‘chirish
const fs = require('fs').promises;
const path = require('path');
async function deleteFiles() {
const filesToDelete = [
'temp1.txt',
'temp2.txt',
'temp3.txt'
];
try {
// Delete all files in parallel
await Promise.all(
filesToDelete.map(file =>
fs.unlink(file).catch(err => {
if (err.code !== 'ENOENT') {
console.error(`Error deleting ${file}:`, err);
}
})
)
);
console.log('Files deleted successfully');
} catch (err) {
console.error('Error during file deletion:', err);
}
}
deleteFiles();
Misolni ishga tushirish »
3. Kataloglarni o‘chirish
Kataloglarni o‘chirish uchun ehtiyojlaringizga qarab bir nechta variant mavjud:
Misol: kataloglarni o‘chirish
const fs = require('fs').promises;
const path = require('path');
async function deleteDirectory(dirPath) {
try {
// Check if the directory exists
const stats = await fs.stat(dirPath);
if (!stats.isDirectory()) {
console.log('Path is not a directory');
return;
}
// For Node.js 14.14.0+ (recommended)
await fs.rm(dirPath, { recursive: true, force: true });
// For older Node.js versions (deprecated but still works)
// await fs.rmdir(dirPath, { recursive: true });
console.log('Directory deleted successfully');
} catch (err) {
if (err.code === 'ENOENT') {
console.log('Directory does not exist');
} else {
console.error('Error deleting directory:', err);
}
}
}
// Usage
deleteDirectory('directory-to-delete');
Misolni ishga tushirish »
4. Katalogni o‘chirmasdan bo‘shatish
Katalogdagi barcha fayllar va pastki kataloglarni olib tashlash, lekin katalogning o‘zini saqlash uchun:
Misol: katalogni bo‘shatish
const fs = require('fs').promises;
const path = require('path');
async function emptyDirectory(dirPath) {
try {
// Read the directory
const files = await fs.readdir(dirPath, { withFileTypes: true });
// Delete all files and directories in parallel
await Promise.all(
files.map(file => {
const fullPath = path.join(dirPath, file.name);
return file.isDirectory()
? fs.rm(fullPath, { recursive: true, force: true })
: fs.unlink(fullPath);
})
);
console.log('Directory emptied successfully');
} catch (err) {
console.error('Error emptying directory:', err);
}
}
// Usage
emptyDirectory('directory-to-empty');
Misolni ishga tushirish »
Xavfsizlik bo‘yicha eslatma: Fayllarni o‘chirishda, ayniqsa rekursiv opsiyalardan yoki joker belgilardan foydalanganda juda ehtiyot bo‘ling. Kataloglar bo‘ylab hujumlarning oldini olish uchun har doim fayl yo‘llarini tekshiring va tozalang.
Fayl nomini o‘zgartirish va ko‘chirish
fs.rename() usuli fayllar nomini o‘zgartirish va ko‘chirish uchun ishlatilishi mumkin.
Bu fayl yo‘llarini o‘zgartirishni o‘z ichiga olgan fayl tizimi (fs) operatsiyalari uchun ko‘p qirrali usul.
1. Asosiy fayl nomini o‘zgartirish
Xuddi shu katalogdagi fayl nomini o‘zgartirish uchun:
Misol: fayl nomini o‘zgartirish
const fs = require('fs').promises;
async function renameFile() {
const oldPath = 'old-name.txt';
const newPath = 'new-name.txt';
try {
// Check if source file exists
await fs.access(oldPath);
// Check if destination file already exists
try {
await fs.access(newPath);
console.log('Destination file already exists');
return;
} catch (err) {
// Destination doesn't exist, safe to proceed
}
// Perform the rename
await fs.rename(oldPath, newPath);
console.log('File renamed successfully');
} catch (err) {
if (err.code === 'ENOENT') {
console.log('Source file does not exist');
} else {
console.error('Error renaming file:', err);
}
}
}
// Usage
renameFile();
Misolni ishga tushirish »
2. Fayllarni kataloglar orasiga ko‘chirish
Fayllarni kataloglar o‘rtasida ko‘chirish uchun fs.rename() dan foydalanishingiz mumkin:
Misol: faylni boshqa katalogga ko‘chirish
const fs = require('fs').promises;
const path = require('path');
async function moveFile() {
const sourceFile = 'source/file.txt';
const targetDir = 'destination';
const targetFile = path.join(targetDir, 'file.txt');
try {
// Ensure source file exists
await fs.access(sourceFile);
// Create target directory if it doesn't exist
await fs.mkdir(targetDir, { recursive: true });
// Move the file
await fs.rename(sourceFile, targetFile);
console.log('File moved successfully');
} catch (err) {
if (err.code === 'ENOENT') {
console.log('Source file does not exist');
} else if (err.code === 'EXDEV') {
console.log('Cross-device move detected, using copy+delete fallback');
await moveAcrossDevices(sourceFile, targetFile);
} else {
console.error('Error moving file:', err);
}
}
}
// Helper function for cross-device moves
async function moveAcrossDevices(source, target) {
try {
// Copy the file
await fs.copyFile(source, target);
// Delete the original
await fs.unlink(source);
console.log('File moved across devices successfully');
} catch (err) {
// Clean up if something went wrong
try { await fs.unlink(target); } catch (e) {}
throw err;
}
}
// Usage
moveFile();
Misolni ishga tushirish »
3. Fayllar nomini o‘zgartirish
Shaklga mos keladigan bir nechta fayl nomini o‘zgartirish uchun:
Misol: Fayllar nomini o‘zgartirish
const fs = require('fs').promises;
const path = require('path');
async function batchRename() {
const directory = 'images';
const pattern = /^image(\d+)\.jpg$/;
try {
// Read directory contents
const files = await fs.readdir(directory);
// Process each file
for (const file of files) {
const match = file.match(pattern);
if (match) {
const [_, number] = match;
const newName = `photo-${number.padStart(3, '0')}.jpg`;
const oldPath = path.join(directory, file);
const newPath = path.join(directory, newName);
// Skip if the new name is the same as the old name
if (oldPath !== newPath) {
await fs.rename(oldPath, newPath);
console.log(`Renamed: ${file} - ${newName}`);
}
}
}
console.log('Batch rename completed');
} catch (err) {
console.error('Error during batch rename:', err);
}
}
batchRename();
Misolni ishga tushirish »
4. Atom nomini o‘zgartirish operatsiyalari
Muhim operatsiyalar uchun atomiklikni ta’minlash uchun vaqtinchalik fayldan foydalaning:
Misol: Atom faylini yangilash
const fs = require('fs').promises;
const path = require('path');
const os = require('os');
async function updateFileAtomic(filePath, newContent) {
const tempPath = path.join(
os.tmpdir(),
`temp-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`
);
try {
// 1. Write to temp file
await fs.writeFile(tempPath, newContent, 'utf8');
// 2. Verify the temp file was written correctly
const stats = await fs.stat(tempPath);
if (stats.size === 0) {
throw new Error('Temporary file is empty');
}
// 3. Rename (atomic on most systems)
await fs.rename(tempPath, filePath);
console.log('File updated atomically');
} catch (err) {
// Clean up temp file if it exists
try { await fs.unlink(tempPath); } catch (e) {}
console.error('Atomic update failed:', err);
throw err;
}
}
// Usage
updateFileAtomic('important-config.json', JSON.stringify({ key: 'value' }, null, 2));
Platformalararo Eslatma: fs.rename() operatsiyasi Unix-ga o‘xshash tizimlarda atomik, lekin Windows-da bo‘lmasligi mumkin.
O‘zaro platformali atom operatsiyalari uchun yuqoridagi misolda ko‘rsatilganidek, vaqtinchalik fayl yondashuvidan foydalanishni ko‘rib chiqing.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
