2015-09-30 24 views
8

Ho un array di stringhe e voglio selezionare solo queste stringhe che sono i percorsi per i file:Come verificare se esiste un file

Il mio percorso è "~/dlds/some_file.ics" dove ~/dlds è un link simbolico a ~/archive/downloads sul mio sistema. Il file ha autorizzazioni seguenti:

-rw-r--r-- 

Il mio codice (ho provato diverse varianti):

ARGV.select do |string| 
    File.file? string # returns false 
    Pathname.new(string).file? # returns false 
    Pathname.new(string).expand_path.file? # returns false 
end 

Non so che altro per provare.

Sto utilizzando Ruby 2.2.0 o 2.2.2.

+0

Mostra il tuo 'ARGV' per favore –

+1

Penso che il motivo sia nella directory' ~/'. Per controllarlo, prova a passare il percorso completo cioè '/ home/utente/dlds/some_file.ics' –

+0

ARGV:' ["--debug", "~/dlds/some_file"] '. L'utilizzo di un percorso completo non funziona altrettanto bene. – musicmatze

risposta

15
File.exist? File.expand_path "~/dlds/some_file.ics" 
+3

nota questo restituisce true se il percorso è anche una directory. dettagli qui: http://stackoverflow.com/questions/8590098/ruby-function-to-check-file-existence – Crashalot

0

penso File.readlink è quello che state cercando

restituisce il nome del file indicato nel link indicato. Non disponibile su tutte le piattaforme.

File.readlink("path/to/symlink") 
+0

Risultati in 'Errno :: ENOENT: nessun file o directory @ rb_readlink - ~/dlds/some_file' – musicmatze

+0

Questo dovrebbe funzionare. Dall'errore che mostri hai fornito il nome file errato. – nathanvda

+0

Il nome file è stato completato automaticamente quando ho provato in irb, quindi no, so che il file esiste e il percorso è corretto. – musicmatze

2

La tua domanda è un po 'di confusione. Se si vuole verificare se il file esiste, si deve solo fare come hai fatto:

Pathname.new(file_name).file? 

Se si utilizza il ~ dovrai prima per espandere il percorso, in modo da scrivere:

Pathname.new(file_name).expand_path.file? 

Se si desidera controllare se il dato file_name è un link simbolico, si può solo fare

Pathname.new(file_name).expand_path.symlink? 

Se si desidera trovare il file il link simbolico punta a, si deve seguire il link:

File.readlink(Pathname.new(file_name).expand_path) 

che restituirà il nome del file collegato, quindi se si voleva davvero si potrebbe fare qualcosa di simile:

Pathname.new(File.readlink(Pathname.new(file_name).expand_path)).file? 

per assicurarsi che il link simbolico punta a un file esistente.

Problemi correlati