سؤال

لقد كنت أحاول إيجاد طريقة للكتابة إلى ملف عند استخدام Node.js ، ولكن بدون نجاح. كيف أقوم بذلك؟

هل كانت مفيدة؟

المحلول

هناك الكثير من التفاصيل في ملفات ملفات ملفات ملفات. الطريقة الأكثر شيوعا هي:

const fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        return console.log(err);
    }

    console.log("The file was saved!");
}); 

نصائح أخرى

حاليا هناك ثلاث طرق لكتابة ملف:

  1. fs.write(fd, buffer, offset, length, position, callback)

    تحتاج إلى انتظار رد الاتصال للتأكد من كتابة المخزن المؤقت إلى القرص. انها ليست مخزنة.

  2. fs.writeFile(filename, data, [encoding], callback)

    يجب تخزين جميع البيانات في نفس الوقت ؛ لا يمكنك إجراء عمليات الكتابة المتسلسلة.

  3. fs.createWriteStream(path, [options])

    يخلق أ WriteStream, ، وهو مريح لأنك لا تحتاج إلى انتظار رد الاتصال. ولكن مرة أخرى ، لم يتم تخزينها.

أ WriteStream, ، كما يقول الاسم ، هو دفق. الدفق بحكم التعريف هو "عازلة" تحتوي على بيانات تتحرك في اتجاه واحد (المصدر ► الوجهة). لكن الدفق القابل للكتابة ليس بالضرورة "مخزنة". دفق "مخزنة" عند الكتابة n مرات ، وفي الوقت المناسب n+1, ، يرسل الدفق المخزن المؤقت إلى kernel (لأنه ممتلئ ويحتاج إلى مسح).

بعبارات أخرى: "المخزن المؤقت" هو الكائن. ما إذا كان "مخزنة" أم لا هي خاصية لهذا الكائن.

إذا نظرت إلى الكود ، WriteStream يرث من كتاب قابل للكتابة Stream هدف. إذا كنت تولي اهتمامًا ، فسترى كيف يقومون بتدفق المحتوى ؛ ليس لديهم أي نظام تخزين مؤقت.

إذا كتبت سلسلة ، فسيتم تحويلها إلى مخزن مؤقت ، ثم يتم إرسالها إلى الطبقة الأصلية وكتبت على القرص. عند كتابة الأوتار ، لا يملأون أي مخزن مؤقت. لذا ، إذا فعلت:

write("a")
write("b")
write("c")

أنتم تفعلون:

fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))

هذا ثلاثة مكالمات إلى طبقة I/O. على الرغم من أنك تستخدم "المخازن المؤقتة" ، إلا أن البيانات ليست مخزنة. دفق مخزنة سيفعل: fs.write(new Buffer ("abc")), ، مكالمة واحدة إلى طبقة I/O.

اعتبارًا من الآن ، في node.js v0.12 (تم الإعلان عن إصدار مستقر في 02/06/2015) يدعم الآن وظيفتين:cork() وuncork(). يبدو أن هذه الوظائف ستسمح لك أخيرًا بتخزين/تدفق مكالمات الكتابة.

على سبيل المثال ، في Java هناك بعض الفصول التي توفر تدفقات مخزنة (BufferedOutputStream, BufferedWriter...). إذا كتبت ثلاثة بايت ، فسيتم تخزين هذه البايتات في المخزن المؤقت (الذاكرة) بدلاً من إجراء مكالمة I/O فقط لثلاثة بايتات. عندما يكون المخزن المؤقت ممتلئًا ، يتم مسح المحتوى وحفظه على القرص. هذا يحسن الأداء.

أنا لا أكتشف أي شيء ، فقط أتذكر كيف ينبغي الوصول إلى القرص.

يمكنك بالطبع جعلها أكثر تقدمًا قليلاً. عدم الحظر ، كتابة القطع والقطع ، لا تكتب الملف بأكمله في وقت واحد:

var fs = require('fs');
var stream = fs.createWriteStream("my_file.txt");
stream.once('open', function(fd) {
  stream.write("My first row\n");
  stream.write("My second row\n");
  stream.end();
});
var path = 'public/uploads/file.txt',
buffer = new Buffer("some content\n");

fs.open(path, 'w', function(err, fd) {
    if (err) {
        throw 'error opening file: ' + err;
    }

    fs.write(fd, buffer, 0, buffer.length, null, function(err) {
        if (err) throw 'error writing file: ' + err;
        fs.close(fd, function() {
            console.log('file written');
        })
    });
});

كتابة متزامنة

fs.writeFilesync (ملف ، بيانات [، خيارات])

fs = require('fs');

fs.writeFileSync("synchronous.txt", "synchronous write!")

الكتابة غير المتزامنة

fs.writefile (ملف ، بيانات [، خيارات] ، رد اتصال)

fs = require('fs');

fs.writeFile('asynchronous.txt', 'asynchronous write!', (err) => {
  if (err) throw err;
  console.log('The file has been saved!');
});

أين

file <string> | <Buffer> | <URL> | <integer> filename or file descriptor
data <string> | <Buffer> | <Uint8Array>
options <Object> | <string>
callback <Function>

يستحق قراءة نظام الملفات غير المرغوب فيه (FS) مستندات.

أحببت فهرس ./articles/file-system.

عملت معي.

أنظر أيضا كيف يمكنني كتابة الملفات في node.js؟.

fs = require('fs');
fs.writeFile('helloworld.txt', 'Hello World!', function (err) {
    if (err) 
        return console.log(err);
    console.log('Wrote Hello World in file helloworld.txt, just check it');
});

محتويات HelloWorld.txt:

Hello World!

تحديث:
كما هو الحال في Linux Node اكتب في الدليل الحالي ، يبدو في بعض الآخرين ، لذلك أضيف هذا التعليق فقط في حالة:
باستخدام هذا ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH); للوصول إلى حيث يتم كتابة الملف.

أعلم أن السؤال المطروح حول "الكتابة" ولكن بمعنى أكثر عمومية "إلحاق" قد يكون مفيدًا في بعض الحالات لأنه من السهل استخدامه في حلقة لإضافة نص إلى ملف (سواء كان الملف موجودًا أم لا). استخدم " n" إذا كنت تريد إضافة خطوط على سبيل المثال:

var fs = require('fs');
for (var i=0; i<10; i++){
    fs.appendFileSync("junk.csv", "Line:"+i+"\n");
}
 var fs = require('fs');
 fs.writeFile(path + "\\message.txt", "Hello", function(err){
 if (err) throw err;
  console.log("success");
}); 

على سبيل المثال: اقرأ الملف واكتب إلى ملف آخر:

  var fs = require('fs');
    var path = process.cwd();
    fs.readFile(path+"\\from.txt",function(err,data)
                {
                    if(err)
                        console.log(err)
                    else
                        {
                            fs.writeFile(path+"\\to.text",function(erro){
                                if(erro)
                                    console.log("error : "+erro);
                                else
                                    console.log("success");
                            });
                        }
                });

الإجابات المقدمة مؤرخة وطريقة أحدث للقيام بذلك هي:

const fsPromises = require('fs').promises
await fsPromises.writeFile('/path/to/file.txt', 'data to write')

انظر المستندات هنا لمزيد من المعلومات

حسنًا ، الأمر بسيط للغاية لأن العقدة لديها وظائف مدمجة لهذا ، يطلق عليها fs و التي تعني نظام الملفات وبشكل أساسي ، وحدة نظام ملفات NodeJS...

لذا طلب ذلك أولاً في الخاص بك server.js ملف مثل هذا:

var fs = require('fs');

fs لديها طرق قليلة للقيام بالكتابة إلى ملف ، ولكن طريقتي المفضلة هي استخدام appendFile, ، سيؤدي ذلك إلى إلحاق الأشياء بالملف ، وإذا لم يكن الملف موجودًا ، فسيقوم بإنشاء واحد ، فقد يكون الرمز كما يلي:

fs.appendFile('myFile.txt', 'Hi Ali!', function (err) {
  if (err) throw err;
  console.log('Thanks, It\'s saved to the file!');
});

يمكنك الكتابة إلى ملف باستخدام FS (نظام الملفات) الوحدة النمطية.

إليك مثال على كيفية القيام بذلك:

const fs = require('fs');

const writeToFile = (fileName, callback) => {
  fs.open(fileName, 'wx', (error, fileDescriptor) => {
    if (!error && fileDescriptor) {
      // Do something with the file here ...
      fs.writeFile(fileDescriptor, newData, (error) => {
        if (!error) {
          fs.close(fileDescriptor, (error) => {
            if (!error) {
              callback(false);
            } else {
              callback('Error closing the file');
            }
          });
        } else {
          callback('Error writing to new file');
        }
      });
    } else {
      callback('Could not create new file, it may already exists');
    }
  });
};

قد ترغب أيضًا في التخلص من بنية رمز الاتصال بالرد هذا عن طريق الاستخدام وعود و async/await صياغات. هذا سيجعل بنية الكود غير المتزامن أكثر مسطحًا. للقيام بذلك هناك مفيد util.promisify (الأصل) يمكن استخدام الوظيفة. يسمح لنا بالتبديل من عمليات الاسترجاعات إلى الوعود. ألقِ نظرة على المثال fs الوظائف أدناه:

// Dependencies.
const util = require('util');
const fs = require('fs');

// Promisify "error-back" functions.
const fsOpen = util.promisify(fs.open);
const fsWrite = util.promisify(fs.writeFile);
const fsClose = util.promisify(fs.close);

// Now we may create 'async' function with 'await's.
async function doSomethingWithFile(fileName) {
  const fileDescriptor = await fsOpen(fileName, 'wx');
  
  // Do something with the file here...
  
  await fsWrite(fileDescriptor, newData);
  await fsClose(fileDescriptor);
}

هنا نستخدم W+ لقراءة/كتابة كلا الإجراءين وإذا لم يتم العثور على مسار الملف ، فسيتم إنشاءه تلقائيًا.

fs.open(path, 'w+', function(err, data) {
    if (err) {
        console.log("ERROR !! " + err);
    } else {
        fs.write(data, 'content', 0, 'content length', null, function(err) {
            if (err)
                console.log("ERROR !! " + err);
            fs.close(data, function() {
                console.log('written success');
            })
        });
    }
});

المحتوى يعني ما عليك أن تكتبه إلى الملف وطوله ، "content.length".

فيما يلي عينة من كيفية قراءة ملف CSV من ملف CSV المحلي إلى محلي.

var csvjson = require('csvjson'),
    fs = require('fs'),
    mongodb = require('mongodb'),
    MongoClient = mongodb.MongoClient,
    mongoDSN = 'mongodb://localhost:27017/test',
    collection;

function uploadcsvModule(){
    var data = fs.readFileSync( '/home/limitless/Downloads/orders_sample.csv', { encoding : 'utf8'});
    var importOptions = {
        delimiter : ',', // optional 
        quote     : '"' // optional 
    },ExportOptions = {
        delimiter   : ",",
        wrap        : false
    }
    var myobj = csvjson.toSchemaObject(data, importOptions)
    var exportArr = [], importArr = [];
    myobj.forEach(d=>{
        if(d.orderId==undefined || d.orderId=='') {
            exportArr.push(d)
        } else {
            importArr.push(d)
        }
    })
    var csv = csvjson.toCSV(exportArr, ExportOptions);
    MongoClient.connect(mongoDSN, function(error, db) {
        collection = db.collection("orders")
        collection.insertMany(importArr, function(err,result){
            fs.writeFile('/home/limitless/Downloads/orders_sample1.csv', csv, { encoding : 'utf8'});
            db.close();
        });            
    })
}

uploadcsvModule()

fs.createWriteStream(path[,options])

options قد تشمل أيضا أ start خيار للسماح لكتابة البيانات في مكان ما بعد بداية الملف. قد يتطلب تعديل ملف بدلاً من استبداله flags طريقة r+ بدلا من الوضع الافتراضي w. يمكن أن يكون الترميز أيًا من تلك المقبولة متعادل.

لو autoClose تم تعيينه على True (السلوك الافتراضي) على 'error' أو 'finish' سيتم إغلاق واصف الملف تلقائيًا. لو autoClose كاذب ، فلن يتم إغلاق واصف الملف ، حتى لو كان هناك خطأ. تقع على عاتق التطبيق مسؤولية إغلاقه والتأكد من عدم وجود تسرب واصف ملف.

مثل ReadStream, ، لو fd محدد، Writestream سوف يتجاهل path وسيطة وسوف تستخدم واصف الملف المحدد. هذا يعني أنه لا 'open' سينبعث الحدث. fd يجب أن يحجب عدم الحظر fdيجب أن يتم تمرير S إلى net.socket.

لو options هي سلسلة ، ثم تحدد الترميز.

بعد قراءة هذا المقال الطويل. يجب أن تفهم كيف يعمل. لذا ، إليك مثال على createWriteStream().

/* The fs.createWriteStream() returns an (WritableStream {aka} internal.Writeable) and we want the encoding as 'utf'-8 */
/* The WriteableStream has the method write() */
fs.createWriteStream('out.txt', 'utf-8')
.write('hello world');

يمكنك الكتابة في ملف بواسطة مثال الرمز التالي:

  var data = [{'test': '123', 'test2': 'Lorem Ipsem '}];        
  fs.open(datapath + '/data/topplayers.json', 'wx', function(error, fileDescriptor){        
    if(!error && fileDescriptor){        
        var stringData = JSON.stringify(data);        
        fs.writeFile(fileDescriptor, stringData, function(error){        
            if(!error){        
                fs.close(fileDescriptor, function(error){        
                    if(!error){        
                        callback(false);        
                    }else{        
                        callback('Error in close file');        
                    }        
                });        
            }else{        
                callback('Error in writing file.');        
            }        
        });        
    }        
}        

يمكنك استخدام المكتبة easy-file-manager

تثبيت أولاً من NPMnpm install easy-file-manager

عينة لتحميل الملفات وإزالتها

var filemanager = require('easy-file-manager')
var path = "/public"
var filename = "test.jpg"
var data; // buffered image

filemanager.upload(path,filename,data,function(err){
    if (err) console.log(err);
});

filemanager.remove(path,"aa,filename,function(isSuccess){
    if (err) console.log(err);
});

حاول القيام بما يلي:

fs.readFile(`${__dirname}/fileName`, 'utf-8',(err, contents) => {
    if (err) throw Error(err){
        console.log(contents)
    }
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top