


# ComposedPseudoDir class






    *[<Null safety>](https://dart.dev/null-safety)*



<p>A <a href="../package-fuchsia_vfs_vfs/PseudoDir-class.md">PseudoDir</a> which will pass requests for inherited nodes to the underlying
<code>fidl_fuchsia_io.Directory</code>.</p>
<p>Inherited Nodes must be specified at time of creation. Any requests to open
nodes in the <code>inheritedNodes</code> list will be proxied to the provided
directory. If a request is made to a node not included in this list it will
attempt to open the node on the super class.</p>



**Inheritance**

- Object
- [Vnode](../package-fuchsia_vfs_vfs/Vnode-class.md)
- [PseudoDir](../package-fuchsia_vfs_vfs/PseudoDir-class.md)
- ComposedPseudoDir








## Constructors

[ComposedPseudoDir](../package-fuchsia_vfs_vfs/ComposedPseudoDir/ComposedPseudoDir.md) ({required dynamic directory, List&lt;String> inheritedNodes = const []})

Constructs the <a href="../package-fuchsia_vfs_vfs/ComposedPseudoDir-class.md">ComposedPseudoDir</a> and provides a list
of <code>inheritedServices</code> to proxy to the <code>directory</code>.   


## Properties

##### [hashCode](../package-fuchsia_vfs_vfs/Vnode/hashCode.md) &#8594; int



The hash code for this object.  
_<span class="feature read-only">read-only</span><span class="feature inherited">inherited</span>_



##### [runtimeType](../package-fuchsia_vfs_vfs/Vnode/runtimeType.md) &#8594; Type



A representation of the runtime type of the object.  
_<span class="feature read-only">read-only</span><span class="feature inherited">inherited</span>_





## Methods

##### [addNode](../package-fuchsia_vfs_vfs/ComposedPseudoDir/addNode.md)(String name, [Vnode](../package-fuchsia_vfs_vfs/Vnode-class.md) node) int



Adds a directory entry associating the given <code>name</code> with <code>node</code>.
It is ok to add the same Vnode multiple times with different names.  
_<span class="feature override">override</span>_



##### [close](../package-fuchsia_vfs_vfs/PseudoDir/close.md)() void



Close this node and all of its bindings and children.  
_<span class="feature inherited">inherited</span>_



##### [connect](../package-fuchsia_vfs_vfs/PseudoDir/connect.md)(dynamic flags, int mode, [InterfaceRequest](../package-fidl_fidl/InterfaceRequest-class.md) request, [dynamic parentFlags]) int



Connects to this instance of <a href="../package-fuchsia_vfs_vfs/PseudoDir-class.md">PseudoDir</a> and serves
<code>fidl_fuchsia_io.Directory</code> over fidl.  
_<span class="feature inherited">inherited</span>_



##### [filterForNodeReference](../package-fuchsia_vfs_vfs/Vnode/filterForNodeReference.md)(dynamic flags) dynamic



Filter flags when <code>OpenFlags.nodeReference</code> is passed.
This will maintain compatibility with c++ layer.  
_<span class="feature inherited">inherited</span>_



##### [inodeNumber](../package-fuchsia_vfs_vfs/PseudoDir/inodeNumber.md)() int



Inode number as defined in fuchsia.io.  
_<span class="feature inherited">inherited</span>_



##### [isEmpty](../package-fuchsia_vfs_vfs/PseudoDir/isEmpty.md)() bool



Checks if directory is empty.  
_<span class="feature inherited">inherited</span>_



##### [listNodeNames](../package-fuchsia_vfs_vfs/PseudoDir/listNodeNames.md)() List&lt;String>



Returns names of the the nodes present in this directory.  
_<span class="feature inherited">inherited</span>_



##### [lookup](../package-fuchsia_vfs_vfs/PseudoDir/lookup.md)(String name) [Vnode](../package-fuchsia_vfs_vfs/Vnode-class.md)?



Looks up a node for given <code>name</code>.  
_<span class="feature inherited">inherited</span>_



##### [noSuchMethod](../package-fuchsia_vfs_vfs/Vnode/noSuchMethod.md)(Invocation invocation) dynamic



Invoked when a non-existent method or property is accessed.  
_<span class="feature inherited">inherited</span>_



##### [open](../package-fuchsia_vfs_vfs/ComposedPseudoDir/open.md)(dynamic flags, int mode, String path, [InterfaceRequest](../package-fidl_fidl/InterfaceRequest-class.md) request, [dynamic parentFlags]) void



This function is called from <code>fidl_fuchsia_io.Directory#open</code>.
This function parses path and opens correct node.  
_<span class="feature override">override</span>_



##### [removeAllNodes](../package-fuchsia_vfs_vfs/PseudoDir/removeAllNodes.md)() void



Removes all directory entries.  
_<span class="feature inherited">inherited</span>_



##### [removeNode](../package-fuchsia_vfs_vfs/PseudoDir/removeNode.md)(String name) int



Removes a directory entry with the given <code>name</code>.  
_<span class="feature inherited">inherited</span>_



##### [sendErrorEvent](../package-fuchsia_vfs_vfs/Vnode/sendErrorEvent.md)(dynamic flags, int status, [InterfaceRequest](../package-fidl_fidl/InterfaceRequest-class.md) request) void



Create a error node to send onOpen event with failure status.  
_<span class="feature inherited">inherited</span>_



##### [serve](../package-fuchsia_vfs_vfs/PseudoDir/serve.md)([InterfaceRequest](../package-fidl_fidl/InterfaceRequest-class.md) request, {dynamic rights}) int



Serves this <code>request</code> directory over request channel.
Caller may specify the rights granted to the <code>request</code> connection.
If <code>rights</code> is omitted, it defaults to readable and writable.  
_<span class="feature inherited">inherited</span>_



##### [toString](../package-fuchsia_vfs_vfs/Vnode/toString.md)() String



A string representation of this object.  
_<span class="feature inherited">inherited</span>_



##### [type](../package-fuchsia_vfs_vfs/PseudoDir/type.md)() dynamic



  
_<span class="feature inherited">inherited</span>_





## Operators

##### [operator ==](../package-fuchsia_vfs_vfs/Vnode/operator_equals.md)(Object other) bool



The equality operator.  
_<span class="feature inherited">inherited</span>_















