Просматривая исходный код , существует конструктор, у которого not отмечен как Obsolete
:
public XmlSerializerInputFormatter(MvcOptions options)
Поскольку этот конструктор принимает экземпляр MvcOptions
, вы должны пройти через существующий аргумент options
следующим образом:
services.AddMvc(options =>
{
// allow xml format for input
options.InputFormatters.Add(new XmlSerializerInputFormatter(options));
}) ...
Вы хотите использовать массив process.argv
для доступа к аргументам командной строки, чтобы получить имя файла и модуль FileSystem (fs) , чтобы прочитать файл. Например:
// Make sure we got a filename on the command line.
if (process.argv.length < 3) {
console.log('Usage: node ' + process.argv[1] + ' FILENAME');
process.exit(1);
}
// Read the file and print its contents.
var fs = require('fs')
, filename = process.argv[2];
fs.readFile(filename, 'utf8', function(err, data) {
if (err) throw err;
console.log('OK: ' + filename);
console.log(data)
});
Чтобы немного сломать это для вас, process.argv
обычно имеет длину два, нулевой элемент - интерпретатор «узла», а первый - это скрипт, который в данный момент запущен , элементы после этого были переданы в командной строке. После того, как вы вытащили имя файла из argv, вы можете использовать функции файловой системы для чтения файла и делать все, что хотите, с его содержимым. Пример использования будет выглядеть так:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[Edit] Как упоминает @wtfcoder, использование метода «fs.readFile()
» может быть не лучшей идеей, поскольку оно будет буферизовать все содержимое файла до приведя его к функции обратного вызова. Эта буферизация может потенциально использовать большую часть памяти, но, что более важно, она не использует одну из основных функций node.js - асинхронный, вызываемый ввод / вывод.
Способ «узла» для обработки большой файл (или любой файл, действительно) должен был бы использовать fs.read()
и обрабатывать каждый доступный кусок, поскольку он доступен из операционной системы. Однако чтение файла как такового требует от вас собственного (возможно) инкрементного разбора / обработки файла, и некоторый объем буферизации может быть неизбежным.
IMHO, fs.readFile()
следует избегать, потому что он загружает ВСЕ файл в память и не будет вызывать обратный вызов до тех пор, пока все файлы не будут прочитаны.
Самый простой способ прочитать текстовый файл читать его по строкам. Я рекомендую BufferedReader :
new BufferedReader ("file", { encoding: "utf8" })
.on ("error", function (error){
console.log ("error: " + error);
})
.on ("line", function (line){
console.log ("line: " + line);
})
.on ("end", function (){
console.log ("EOF");
})
.read ();
. Для сложных структур данных, таких как .properties или json-файлов, вам нужно использовать парсер (внутри он также должен использовать буферный считыватель).
Я отправляю полный пример, который я, наконец, начал работать. Здесь я читаю файл rooms/rooms.txt
из сценария rooms/rooms.js
var fs = require('fs');
var path = require('path');
var readStream = fs.createReadStream(path.join(__dirname, '../rooms') + '/rooms.txt', 'utf8');
let data = ''
readStream.on('data', function(chunk) {
data += chunk;
}).on('end', function() {
console.log(data);
});
Вы можете использовать readstream и pipe для чтения файла строки за строкой, не считывая весь файл в память один раз.
var fs = require('fs'),
es = require('event-stream'),
os = require('os');
var s = fs.createReadStream(path)
.pipe(es.split())
.pipe(es.mapSync(function(line) {
//pause the readstream
s.pause();
console.log("line:", line);
s.resume();
})
.on('error', function(err) {
console.log('Error:', err);
})
.on('end', function() {
console.log('Finish reading.');
})
);