NHFS – Nonhierarchical File System

This page is about NHFS, a nonhierarchical file system.
I developed NHFS for my bachelor’s thesis in Cognitive Science. In short, NHFS allows you to file any file into any number of directories. Likewise, you may place any directory into as many directories as you like. NHFS therefore allows you to create a nonhierarchical directory structure with polyhierarchically connected files. All this is mostly backward compatible – this means, you can use it from any file manager, any other application, and also the command line.

The idea behind NHFS is to enhance usability of the file system for basic file management tasks by allowing the same document to be categorized multiple times, without using impractical band-aid solutions, such as symbolic links.

NHFS has been tested on Linux. Compatibility with FreeBSD and Mac OS X is likely but untested. It requires FUSE (file system in user space), which allows to create a file system running as a user space program. FUSE is currently available for Linux, FreeBSD and Mac OS X.

Download NHFS 1.0 (includes source files)


5 Replies to “NHFS – Nonhierarchical File System”

  1. I got
    if gcc -DHAVE_CONFIG_H -I. -I. -I./include -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DFUSE_USE_VERSION=22 -Wall -W -g -O2 -lsqlite3 -lfuse -MT net.o -MD -MP -MF ".deps/net.Tpo" -c -o net.o net.c; \
    then mv -f ".deps/net.Tpo" ".deps/net.Po"; else rm -f ".deps/net.Tpo"; exit 1; fi
    net.c: In function 'nhfs_net_rename':
    net.c:43:5: error: variable-sized object may not be initialized
    net.c: In function 'nhfs_net_path_to_id':
    net.c:147:13: warning: pointer targets in passing argument 3 of 'nhfs_db_get_neighbor_id' differ in signedness [-Wpointer-sign]
    db.h:31:5: note: expected 'int *' but argument is of type 'unsigned int *'
    net.c: In function 'nhfs_net_path_to_id_dots':
    net.c:188:9: warning: pointer targets in passing argument 3 of 'nhfs_db_get_neighbor_id' differ in signedness [-Wpointer-sign]
    db.h:31:5: note: expected 'int *' but argument is of type 'unsigned int *'
    net.c:166:45: warning: variable 'tmp_max2' set but not used [-Wunused-but-set-variable]
    net.c:166:32: warning: variable 'tmp_max' set but not used [-Wunused-but-set-variable]
    make: *** [net.o] Error 1

    Can u decide under which license it’s published?

    1. Sorry about the compile error. This program is ages old (more than 7 years) and not maintained.

      This is also the reason that I’m not likely to change anything about the license. But if it is of any use to you, feel free to copy and use any of the code!

  2. Did you publish another paper on this filesystem? I recall a more technical paper on a similar non-hierarchical filesystem that describe a concrete implementation using hooks…. but now I can’t find anything.

  3. Partial answer to original question:
    Open net.c in a text editor. Go to line 43 and add // in front to comment it, like this:
    //char trash_name[strlen(TRASH_NAME)+1] = “/”;
    Now add the following lines:
    int lll = strlen(TRASH_NAME)+1;
    char trash_name[lll];
    memset( trash_name, ‘/’, lll*sizeof(char) );

Leave a Reply

Your email address will not be published. Required fields are marked *