Как я могу писать на NUL-устройство под Windows из node.js?

Меня это беспокоит уже несколько дней. Я знаю о стандартном перенаправлении потока на устройство NUL, но это не так. node.js использует CreateFileW в своих привязках fs native / libuv.

К сожалению, используя что-то вроде:

require('fs').writeFileSync('NUL', 'foo')

создает в cwd файл NUL, имеющий 3 байта.

Я пробовал писать в \ Device \ Null, но поскольку я в значительной степени тупица, где все является файлом, мне не удалось найти рабочий путь для \ Device \ Null. Например, \\. \ Device \ Null, который выдает ENOENT.

Есть идеи, как заставить это работать под Windows?

Кажется, это связано, но я не могу отследить весь поток из библиотеки /fs.js в uv / src / win / fs.c, чтобы проверить, что аргумент пути не страдает от какого-либо отношения к абсолютному разрешению пути.


person SaltwaterC    schedule 15.06.2012    source источник
comment
Убедитесь, что это сработает, но попробуйте «NUL:».   -  person Harry Johnston    schedule 16.06.2012
comment
Пробовал перед тем, как задавать вопрос. Не работает. Выдает какую-то ошибку отказа в доступе. На данный момент у вас нет компьютера с Windows, чтобы рассказать о деталях.   -  person SaltwaterC    schedule 17.06.2012


Ответы (2)


Допустимый путь к NUL устройству - "\\\\.\\NUL", а не NUL, поэтому используется: fs.writeFileSync("\\\\.\\NUL", "foo"). Эта проблема возникла в отношении Node.js на GitHub: https://github.com/nodejs/node-v0.x-archive/issues/9271

Поскольку NUL - это устройство, а не файл, доступ к нему должен осуществляться через пространство имен устройства - для этого необходимо поместить \\.\ в начало (другие косые черты предназначены для экранирования) - см. https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247.aspx#Win32_Device_Namespaces .

В NPM также есть простая dev-null библиотека, которую можно использовать с потоками: https://www.npmjs.com/package/dev-null (но не с .writeFile).

person Tomasz Lewowski    schedule 20.04.2016

Есть долгий обходной путь, например, напишите код самостоятельно. Но вы можете взять идею отсюда https://github.com/hanshuebner/node-hid/blob/master/src/HID.cc и напишите оболочку над библиотекой C.

person Eugene Hauptmann    schedule 17.06.2012
comment
Вместо того, чтобы передавать метод-оболочку для устройства NUL (которое определяет ОС и действует соответствующим образом), я просто исправил библиотеку, чтобы не подключать какие-либо прослушиватели событий data / end, если в качестве аргумента передается null. Я предполагаю, что это более простой способ сделать что-то, вместо того, чтобы позволять ОС сбрасывать данные. - person SaltwaterC; 18.06.2012
comment
Я рад, что вы нашли рабочее решение. Можете ли вы поделиться своим кодом с сообществом? :) - person Eugene Hauptmann; 18.06.2012