Ler um diretório realmente não acontece como um arquivo. Isso acontece com a chamada do sistema readdr . Veja man 2 readdir para a implementação antiga como uma chamada de sistema pura e man 3 readdir para o wrapper (por favor, não use a implementação antiga).
No entanto, o netrw do Vim não executa nada parecido. Ele simplesmente chama ls ou executa globbing (leia abaixo para entender quando ele faz um e quando o outro) e analisa a saída disso.
Configurando netrw você tem opções de como ele chama ls em sistemas remotos . Você pode definir o comando de listagem no seu vimrc para conexões SSH e FTP da seguinte forma (esses são os padrões):
let g:netrw_list_cmd = 'ssh HOSTNAME ls -Fa'
let g:netrw_ftp_list_cmd = 'ls -lF'
(Você pode até definir isso para algo diferente de ls para sistemas FTP que não têm ls , sim, existem alguns, raros, que não têm isso.)
Para listagens locais netrw executa globbing e chama getftype() para decorar o arquivo ( / para diretórios, @ para links, etc.). Em autoload/netrw.vim no procedimento s:LocalListing() , o seguinte é executado:
let dirname = b:netrw_curdir
let dirnamelen = strlen(b:netrw_curdir)
let filelist = s:NetrwGlob(dirname,"*",0) " here is the globbing of '*'
let filelist = filelist + s:NetrwGlob(dirname,".*",0) " and here '.*'
Em seguida, getftype() é chamado em todos os arquivos em filelist .
Em suma, netrw confia no fato de que o Vim tem a função glob() e o Vim, por sua vez, executa uma chamada glob ( man 3 glob ).