0

我想以我喜欢的方式重新创建ls -AlF程序,并且我想使用 NoFlo 来完成它。

这是我制作的图表 ( graphs/ListDirectory.fbp):

ReadDir(filesystem/ReadDir)
Stat(filesystem/Stat)
SplitByStatType(SplitByStatType)
Display(core/Output)

ReadDir OUT -> IN Stat
ReadDir ERROR -> IN Display

Stat OUT -> IN SplitByStatType
Stat ERROR -> IN Display

SplitByStatType DIRECTORY -> IN Display
SplitByStatType FILE -> IN Display

'.' -> SOURCE ReadDir

这是组件components/SplitByStatType.js

const noflo = require('noflo')

exports.getComponent = () => {
  const component = new noflo.Component()

  component.description = 'Splits directories and files.'
  component.icon = 'directory'

  component.inPorts.add('in', {
    datatype: 'object',
  })
  component.outPorts.add('file', {
    datatype: 'object',
  })
  component.outPorts.add('directory', {
    datatype: 'object',
  })
  component.outPorts.add('blockdevice', {
    datatype: 'object',
  })
  component.outPorts.add('characterdevice', {
    datatype: 'object',
  })
  component.outPorts.add('fifo', {
    datatype: 'object',
  })
  component.outPorts.add('socket', {
    datatype: 'object',
  })
  component.outPorts.add('error', {
    datatype: 'object',
  })

  component.process((input, output) => {
    if (!input.hasData('in')) return

    const data = input.getData('in')

    const { isFile, isDirectory, isBlockDevice, isCharacterDevice, isFifo, isSocket } = data

    if (isFile) {
      output.send({
        file: data,
      })
    }

    if (isDirectory) {
      output.send({
        directory: data,
      })
    }

    if (isBlockDevice) {
      output.send({
        blockdevice: data,
      })
    }

    if (isCharacterDevice) {
      output.send({
        characterdevice: data,
      })
    }

    if (isFifo) {
      output.send({
        fifo: data,
      })
    }

    if (isSocket) {
      output.send({
        socket: data,
      })
    }

    // TODO: Else, error?

    output.done()
  })

  return component
}
  1. 你会怎么称呼这个组件和/或有人已经做了它?
  2. 我可以在不使用其他已经存在的组件实现我自己的组件的情况下做到这一点吗?
  3. 如何将文件名统计信息联系在一起,以便我可以在另一个组件中处理它并为每个组件打印一行?

我想要结束的是每个节点一行,首先是目录(排序并使用/),最后是文件(也排序,文件首先以'.'开头)。

4

1 回答 1

0

noflo-assembly 有一个 Merge 实用程序可以做到这一点。但是使用常规组件也很容易:

const noflo = require('noflo');
exports.getComponent = () => {
  const c = new noflo.Component();
  c.addInport('a');
  c.addInport('b');
  c.addOutport('out');
  return c.process((input, output) => {
    // Check that we have data for both A and B inputs
    if (!input.hasData('a', 'b')) {
      return;
    }
    // Read both inputs
    const [a, b] = input.getData('a', 'b');
    // Send combined data out
    output.sendDone({
      out: {
        a,
        b,
      }
    });
  });
};
于 2020-11-25T11:56:14.977 回答