2015-09-30 3 views
8

existiert ich ein Array von Strings haben, und ich will nur diese Strings auszuwählen, die Pfade zu Dateien sind:Wie kann man überprüfen, ob eine Datei

Mein Weg "~/dlds/some_file.ics" ist, wo ~/dlds einen Symlink auf meinem System zu ~/archive/downloads ist. Die Datei hat folgende Berechtigungen:

-rw-r--r-- 

Mein Code (Ich habe versucht, mehrere Varianten):

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

Ich weiß nicht, was anderes zu versuchen.

Ich laufe Ruby 2.2.0 oder 2.2.2.

+0

Zeigen Sie Ihre 'ARGV' bitte –

+1

Ich denke, der Grund ist im' ~/'Verzeichnis. Um es zu überprüfen, versuchen Sie den vollständigen Pfad zu übergeben, zB '/ home/user/dlds/some_file.ics' –

+0

ARGV:' ["--debug", "~/dlds/some_file"] '. Die Verwendung eines vollständigen Pfades funktioniert nicht so gut. – musicmatze

Antwort

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

Beachten Sie, dass dies true zurückgibt, wenn der Pfad auch ein Verzeichnis ist. Details hier: http://stackoverflow.com/questions/8590098/ruby-function-to-check-file-existence – Crashalot

0

Ich denke, File.readlink ist, was Sie für

suchen Gibt den Namen der Datei mit dem gegebenen Link verwiesen wird. Nicht verfügbar auf allen Plattformen.

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

Ergebnisse in 'Errno :: ENOENT: Keine solche Datei oder Verzeichnis @ rb_readlink - ~/dlds/some_file' – musicmatze

+0

Dies sollte funktionieren. Von dem Fehler, den Sie anzeigen, haben Sie den falschen Dateinamen angegeben. – nathanvda

+0

Der Dateiname wurde automatisch abgeschlossen, als ich in irb versuchte, also nein, ich weiß, dass die Datei existiert und der Pfad korrekt ist. – musicmatze

2

ist Ihre Frage ein wenig verwirrend. Wenn Sie, ob die Datei vorhanden überprüfen möchten, sollten Sie nur tun, was Sie getan haben:

Pathname.new(file_name).file? 

Wenn Sie mit der ~ Sie zuerst den Pfad erweitern müssen, so schreiben:

Pathname.new(file_name).expand_path.file? 

wenn Sie, ob die angegebene file_name überprüfen möchten ein symbolischer Link ist, können Sie einfach tun

Pathname.new(file_name).expand_path.symlink? 

wenn Sie die Datei mit den Symlink auf finden wollen, müssen Sie dem Link folgen:

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

, die den Dateinamen der verknüpften Datei angezeigt werden können, wenn Sie also wirklich wollte, könnte man so etwas wie:

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

um sicherzustellen, dass der Symlink an eine vorhandene Datei verweist.