2011-08-24 5 views

Répondre

17

Dans Ruby, il n'y a pas de différence entre les chemins dans Linux ou Windows. Le chemin doit utiliser / indépendamment de l'environnement. Donc, pour utiliser n'importe quel chemin dans Windows, remplacez tous \ par /. File#join fonctionnera pour Windows et Linux. Par exemple, dans Windows:

Dir.pwd 
=> "C/Documents and Settings/Users/prince" 

File.open(Dir.pwd + "/Desktop/file.txt", "r") 
=> #<File...> 

File.open(File.join(Dir.pwd, "Desktop", "file.txt"), "r") 
=> #<File...> 

File.join(Dir.pwd, "Desktop", "file.txt") 
=> "C/Documents and Settings/Users/prince/Desktop/file.txt" 
+2

Ohh si cela ne fonctionnait que lorsque vous vouliez exécuter des commandes externes. – Automatico

+0

... pas vrai, dans windows il y a des préfixes spéciaux comme \\? \ (Requis pour les chemins> 260bytes) qui sont convertis en //?/Qui n'ont aucun sens ... Donc la fonctionnalité est en effet un bug afaict – estani

+0

@estani Je n'ai pas dit que c'est une fonctionnalité. J'ai dit 'File.join' et tous les chemins sont séparés par'/'quel que soit l'environnement.C'est ainsi que les chemins sont représentés dans ruby ​​et vous devez utiliser '/' même dans le cas de Windows pour les chemins de fichiers lors de l'initialisation d'un fichier. – rubyprince

7

Utilisez la classe Pathname pour générer des chemins qui alors seront correctes sur votre système:

a_path = Pathname.new("a_path_goes_here") 

L'avantage est qu'il vous permettra de répertoires de chaînes par en utilisant l'opérateur +:

a_path + "another_path" + "and another" 

appel a_path.to_s produira alors le bon chemin pour le système que vous êtes.

+2

N'oubliez pas require "pathname" sauf si vous utilisez un framework de développement web gigantesque. –

+0

Cela ne fonctionne pas pour Ruby 2.0.0 sur Windows à moins que je ne manque quelque chose: p = Pathname.new ("") p = p + "pomme" + "banane" met p.to_s <- "apple/banana" –

+0

Utilisez File.join à la place, c'est plus simple et moins ennuyeux que pathname - et ça marchera très bien. – shevy

6

Tant que Ruby fait le travail, / dans les noms de chemin d'accès est correct sous Windows

Une fois que vous devez envoyer un chemin pour un autre programme à utiliser, en particulier dans une ligne de commande ou quelque chose comme un téléchargement de fichier dans un navigateur, vous devez convertir les barres obliques en barres obliques inverses lors de l'exécution dans Windows.

C:/projects/a_project/some_file.rb'.gsub('/', '\\') fonctionne un charme. (Ceci est censé être une double barre oblique inverse - cet éditeur le voit comme une évasion même dans des guillemets simples.)

Utilisez quelque chose comme ceci juste avant d'envoyer la chaîne pour le nom du chemin hors du contrôle de Ruby.

Vous devrez vous assurer que votre programme sait quel système d'exploitation il fonctionne afin qu'il puisse décider quand cela est nécessaire. La première consiste à définir une constante au début de l'exécution du programme, quelque chose comme ça

::USING_WINDOWS = !!((RUBY_PLATFORM =~ /(win|w)(32|64)$/) || (RUBY_PLATFORM=~ /mswin|mingw/))

(Je sais que cela fonctionne, mais je ne l'écris donc je ne comprends pas la double bang ..

+2

Je crois que le '!! 'le convertit en un booléen. Dans ruby, true est généralement renvoyé sous la forme d'objets non-nuls ou non-faux (vous obtiendrez un objet Match dans votre cas). '!' convertit l'objet en 'false' et le second'! 'le convertit en' true'. –

0

Oui, c'est ennuyeux en tant qu'utilisateurs Windows de continuer à remplacer ces barres obliques inversées par des barres obliques et vice-versa si vous avez besoin du chemin pour le copier vers votre gestionnaire de fichiers, donc je le fais comme le sien. Cela ne fait pas de mal si vous utilisez Linux ou Mac et vous évitez beaucoup de nuisances dans Windows.

path = 'I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/') 

Dir.glob("#{path}/**/*.epub").each do |file| 
    puts file 
end 
Questions connexes