Je veux écrire une application qui fonctionne sous windows et linux. mais j'ai un problème de chemin d'accès, car windows utilisez "\" et Linux utiliser "/" .comment puis-je résoudre ce problème.
grâce
En Ruby, il n'y a pas de différence entre les chemins d'accès sous Linux ou Windows. Le chemin doit être à l'aide de / indépendamment de l'environnement. Donc, pour utiliser n'importe quel chemin d'accès dans Windows, remplacez tous les \ avec /. File#join de travail pour à la fois 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"
Ohh si cela ne fonctionnait que lorsque vous souhaitez exécuter des commandes externes. ... pas vrai, dans windows il y a des préfixes comme"\\? \ (obligatoire pour les chemins >260bytes) qui se transforme en //?/ qui n'ont pas de sens du tout... Alors cette fonction est en effet un bug afaict Je n'ai pas dit c'est une fonction. Je l'ai dit File.join et en fait tous les chemins sont séparés par des / quel que soit l'environnement. C'est la façon dont les chemins sont représentés dans ruby et vous devez les utiliser / même dans le cas de Windows pour les chemins de fichier lors de l'initialisation d'un fichier. vous êtes de droite. Si rejoindre utilise un séparateur constante, il est codé en dur à /... à partir d'un fichier.c separator = rb_obj_freeze(rb_usascii_str_new2("/")); C'est tellement mauvais... Sur windows j'ai dû ajouter les deux points, le " c " chemin d'accès: ` "C:/Documents et Settings/Users/prince/Desktop/file.txt"`
Il semble à "rejoindre" la méthode pour linux T Comment puis-je utiliser la méthode join pour windows ? En fonction de votre plattform File.join vont utiliser des \ ou / comme séparateur. En fait File.join utilise / sur Windows.
Utiliser le Pathname classe de générer des chemins qui, alors, sera correct sur votre système:
a_path =Pathname.new("a_path_goes_here")
L'avantage de cela est qu'il vous permettra à la chaîne de répertoires à l'aide de la + opérateur:
a_path +"another_path"+"and another"
Appel a_path.to_s génère alors le chemin d'accès correct pour le système que vous êtes sur.
N'oubliez pas d'exiger "chemin d'accès", sauf si vous êtes en cours d'exécution sur un immense infrastructure de développement web. Cela ne fonctionne pas pour Ruby 2.0.0 sur Windows, sauf si je suis absent quelque chose: p = Chemin.nouvelle("") p = p + "pomme" + "banane" met p.to_s <-- "pomme/banane" Utiliser Le Fichier.joindre au lieu de cela, il est plus simple et moins ennuyeux que de chemin et il fonctionne très bien. nécessaire]. Pourquoi est-il moins "ennuyeux"? Je pense aussi que File.join continuent d'utiliser le / même sur les machines Windows. Pathname va utiliser quel que soit l'OS dit.
Tant que Ruby est en train de faire le travail, / dans les noms de chemin d'accès est ok sur Windows
Une fois que vous avez à envoyer un chemin pour un autre programme à utiliser, en particulier dans une ligne de commande ou quelque chose comme du chargement d'un fichier dans un navigateur, vous devez convertir les barres obliques de barres obliques inverses lors de l'exécution dans Windows.
C:/projects/a_project/some_file.rb'.gsub('/', '\\') fonctionne à merveille. (C'est censé être une double barre oblique inverse - cet éditeur ne voit en elle qu'un moyen d'échapper, même dans des guillemets simples.)
Utiliser quelque chose comme ceci juste avant l'envoi de la chaîne de caractères pour le nom de chemin d'accès de Ruby.
Vous devrez assurez-vous que votre programme ne sait quel système d'exploitation il est en cours d'exécution en tant qu'il peut décider quand cela est nécessaire. Une solution consiste à définir une constante au début de l'exécution du programme, quelque chose comme cela
(Je sais que cela fonctionne, mais je n'ai pas l'écrire donc je ne comprends pas le double bang...)
Je crois que le !! convertit une valeur de type boolean. En ruby true est généralement retourné comme non-néant, ou la non-falsification des objets (vous pouvez obtenir une Correspondance de l'objet dans votre cas). ! convertit l'objet de false et la deuxième ! convertit true.
Oui, c'est ennuyeux comme les utilisateurs de windows pour garder le remplacement de ces barres obliques inverses pour les barres obliques et vice-versa, si vous devez le chemin pour la copier dans votre gestionnaire de fichiers, ce que je fais comme sa.
Il n'y a aucun mal si vous êtes sous Linux ou Mac et permet d'économiser beaucoup de nuisance dans windows.
path ='I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/')Dir.glob("#{path}/**/*.epub").each do|file|
puts file
end
En Ruby, il n'y a pas de différence entre les chemins d'accès sous Linux ou Windows. Le chemin doit être à l'aide de
/
indépendamment de l'environnement. Donc, pour utiliser n'importe quel chemin d'accès dans Windows, remplacez tous les\
avec/
.File#join
de travail pour à la fois Windows et Linux. Par exemple, dans Windows:... pas vrai, dans windows il y a des préfixes comme"\\? \ (obligatoire pour les chemins >260bytes) qui se transforme en //?/ qui n'ont pas de sens du tout... Alors cette fonction est en effet un bug afaict
Je n'ai pas dit c'est une fonction. Je l'ai dit
File.join
et en fait tous les chemins sont séparés par des/
quel que soit l'environnement. C'est la façon dont les chemins sont représentés dans ruby et vous devez les utiliser/
même dans le cas de Windows pour les chemins de fichier lors de l'initialisation d'un fichier.vous êtes de droite. Si rejoindre utilise un séparateur constante, il est codé en dur à /... à partir d'un fichier.c
separator = rb_obj_freeze(rb_usascii_str_new2("/"));
C'est tellement mauvais...Sur windows j'ai dû ajouter les deux points, le " c " chemin d'accès: ` "C:/Documents et Settings/Users/prince/Desktop/file.txt"`
OriginalL'auteur rubyprince
Prendre un coup d'oeil au Fichier.joindre: http://www.ruby-doc.org/core/classes/File.html#M000031
En fonction de votre plattform
File.join
vont utiliser des \ ou / comme séparateur.En fait
File.join
utilise/
sur Windows.OriginalL'auteur Lennaert
Utiliser le
Pathname
classe de générer des chemins qui, alors, sera correct sur votre système:L'avantage de cela est qu'il vous permettra à la chaîne de répertoires à l'aide de la
+
opérateur:Appel
a_path.to_s
génère alors le chemin d'accès correct pour le système que vous êtes sur.Cela ne fonctionne pas pour Ruby 2.0.0 sur Windows, sauf si je suis absent quelque chose: p = Chemin.nouvelle("") p = p + "pomme" + "banane" met p.to_s <-- "pomme/banane"
Utiliser Le Fichier.joindre au lieu de cela, il est plus simple et moins ennuyeux que de chemin et il fonctionne très bien.
nécessaire]. Pourquoi est-il moins "ennuyeux"?
Je pense aussi que
File.join
continuent d'utiliser le/
même sur les machines Windows.Pathname
va utiliser quel que soit l'OS dit.OriginalL'auteur Ryan Bigg
Tant que Ruby est en train de faire le travail,
/
dans les noms de chemin d'accès est ok sur WindowsUne fois que vous avez à envoyer un chemin pour un autre programme à utiliser, en particulier dans une ligne de commande ou quelque chose comme du chargement d'un fichier dans un navigateur, vous devez convertir les barres obliques de barres obliques inverses lors de l'exécution dans Windows.
C:/projects/a_project/some_file.rb'.gsub('/', '\\')
fonctionne à merveille. (C'est censé être une double barre oblique inverse - cet éditeur ne voit en elle qu'un moyen d'échapper, même dans des guillemets simples.)Utiliser quelque chose comme ceci juste avant l'envoi de la chaîne de caractères pour le nom de chemin d'accès de Ruby.
Vous devrez assurez-vous que votre programme ne sait quel système d'exploitation il est en cours d'exécution en tant qu'il peut décider quand cela est nécessaire. Une solution consiste à définir une constante au début de l'exécution du programme, quelque chose comme cela
::USING_WINDOWS = !!((RUBY_PLATFORM =~ /(win|w)(32|64)$/) || (RUBY_PLATFORM=~ /mswin|mingw/))
(Je sais que cela fonctionne, mais je n'ai pas l'écrire donc je ne comprends pas le double bang...)
!!
convertit une valeur de type boolean. En ruby true est généralement retourné comme non-néant, ou la non-falsification des objets (vous pouvez obtenir une Correspondance de l'objet dans votre cas).!
convertit l'objet defalse
et la deuxième!
convertittrue
.OriginalL'auteur pmneve
Oui, c'est ennuyeux comme les utilisateurs de windows pour garder le remplacement de ces barres obliques inverses pour les barres obliques et vice-versa, si vous devez le chemin pour la copier dans votre gestionnaire de fichiers, ce que je fais comme sa.
Il n'y a aucun mal si vous êtes sous Linux ou Mac et permet d'économiser beaucoup de nuisance dans windows.
OriginalL'auteur peter