web-dev-qa-db-fra.com

Errno :: ENOENT (Aucun fichier ou répertoire de ce type @ rb_sysopen

Je veux écrire quelque chose dans un fichier.

# where userid is any intger [sic]
path = Rails.root + "public/system/users/#{user.id}/style/img.jpg" 
File.open(path, 'wb') do |file|
  file.puts f.read
end 

Lorsque ce code est exécuté, j'obtiens cette erreur. Je sais que ce dossier n'existe pas, mais File.open avec w le mode crée un nouveau fichier s'il n'existe pas.

Pourquoi ça ne marche pas?

21
ashwintastic

File.open(..., 'w') crée un fichier s'il n'existe pas. Personne n'a promis de créer une arborescence de répertoires.

Une autre chose, il faut utiliser File#join pour construire le chemin du répertoire, plutôt que la concaténation de chaînes muettes.

path = File.join Rails.root, 'public', 'system', 'users', user.id.to_s, 'style'

FileUtils.mkdir_p(path) unless File.exist?(path) 
File.open(File.join(path, 'img.jpg'), 'wb') do |file|
  file.puts f.read
end
23

Essayer d'utiliser gets dans une tâche de rake? Vous pouvez voir ce message d'erreur:

Errno :: ENOENT: Aucun fichier ou répertoire de ce type @ rb_sysopen

Avez-vous essayé de rechercher l’erreur et vous êtes retrouvé sur cette page? Cette réponse n'est pas pour le PO, mais pour vous.

Utilisation STDIN.gets. Problème résolu. C’est parce que le simple fait d’utiliser gets résout le problème de $stdin.gets and rake remplace la variable globale de sorte que gets essaie d'ouvrir un descripteur de fichier inexistant. Voici pourquoi:

Quelle est la différence entre gets.chomp () et STDIN.gets.chomp ()?

35