2017-08-31 2 views
0

voici mon code:Obtenir « Type de fichier inconnu » Ruby

> !#usr/bin/ruby 

require 'fileutils' 

Dir.chdir "/home/john/Documents" 

if (Dir.exist?("Photoshoot") === false) then 
    Dir.mkdir "Photoshoot" 
    puts "Directory: 'Photoshoot' created" 
end 

Dir.chdir "/run/user/1000/gvfs" 

camdirs = Dir.glob('*') 
numcams = camdirs.length 
camnum = 0 
campath = [] 

while camnum < numcams do 
    campath.push("/run/user/1000/gvfs/#{camdirs[camnum]}/DCIM") 
    puts campath[camnum] 

    camnum += 1 
end 

campath.each do |path| 
    Dir.chdir (path) 
    foldnum = 0 
    foldir = Dir.glob('*') 
    puts foldir 
    Dir.entries("#{path}/#{foldir[foldnum]}").each do |filename| 
     filetype = File.extname(filename) 
     if filetype == ".JPG" 
      FileUtils.mv("#{path}/#{foldir[foldnum]}/#{filename}", "/home/john/Documents/Photoshoot") 
     end 
     foldnum += 1 
    end 


end 
puts "#{numcams} cameras detected" 

J'essaie juste d'entrer dans certains appareils photo, je l'ai connecté et extraire toutes les images dans un fichier, mais sa me donner cette erreur. L'une des choses qui me gêne, c'est que les images sont stockées dans des sous-dossiers sous DCIM. Quand j'utilise simplement .entries, il me donne les dossiers dans lesquels se trouvent les images ainsi que les images.

/usr/lib/ruby/2.3.0/fileutils.rb:1387:in `copy': unknown file type: /run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C021%5D/DCIM//IMG_0092.JPG (RuntimeError) 
    from /usr/lib/ruby/2.3.0/fileutils.rb:472:in `block in copy_entry' 
    from /usr/lib/ruby/2.3.0/fileutils.rb:1498:in `wrap_traverse' 
    from /usr/lib/ruby/2.3.0/fileutils.rb:469:in `copy_entry' 
    from /usr/lib/ruby/2.3.0/fileutils.rb:530:in `rescue in block in mv' 
    from /usr/lib/ruby/2.3.0/fileutils.rb:527:in `block in mv' 
    from /usr/lib/ruby/2.3.0/fileutils.rb:1571:in `block in fu_each_src_dest' 
    from /usr/lib/ruby/2.3.0/fileutils.rb:1585:in `fu_each_src_dest0' 
    from /usr/lib/ruby/2.3.0/fileutils.rb:1569:in `fu_each_src_dest' 
    from /usr/lib/ruby/2.3.0/fileutils.rb:517:in `mv' 
    from /home/john/Desktop/TestExtract.rb:34:in `block (2 levels) in <main>' 
    from /home/john/Desktop/TestExtract.rb:31:in `each' 
    from /home/john/Desktop/TestExtract.rb:31:in `block in <main>' 
    from /home/john/Desktop/TestExtract.rb:26:in `each' 
    from /home/john/Desktop/TestExtract.rb:26:in `<main>' 
/run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C022%5D/DCIM 
/run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C021%5D/DCIM 
/run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C020%5D/DCIM 
104___03 
105___04 
106___05 
102___01 
[Finished in 0.1s with exit code 1] 
[shell_cmd: ruby "/home/john/Desktop/TestExtract.rb"] 
[dir: /home/john/Desktop] 
[path: /home/john/bin:/home/john/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin] 

Un conseil? Je ne peux pas comprendre ce qui ne va pas.

Répondre

0

La raison pour laquelle le chemin vers vos fichiers semble étrange est que le stockage de votre caméra a été monté à l'aide de FUSE. Si vous regardez de très près, vous verrez qu'il recherche:

/run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C021%5D/DCIM//IMG_0092.JPG 

Vous avez deux barres obliques avant le nom de fichier final. Essayez de corriger cela à la ligne 34 de votre application. Si le problème persiste, il est possible que l'utilisateur qui exécute l'opération dans Ruby n'ait pas l'autorisation de ce système de fichiers ou que la manière dont les chemins sont construits par FUSE n'est pas compatible avec Ruby FileUtils.

Vous pouvez essayer d'exécuter:

cat /run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C021%5D/DCIM/IMG_0092.JPG 

le même utilisateur qui exécute le processus Ruby pour vous assurer d'avoir la permission de lecture du système de fichiers.

+0

J'ai supprimé la barre oblique supplémentaire à la ligne 34, mais cela me donne toujours l'erreur. Quand je lance votre commande cat dans la console, elle me dit "Il n'y a pas de fichier ou de répertoire". –

+0

C'est le problème, alors. Vous utilisez une superposition de système de fichiers pour parler à la caméra et ces chemins ne sont pas utilisables par les outils standard. Vous pouvez essayer [convertir les valeurs] (https://stackoverflow.com/questions/9966053/what-does-5b-et-5d-in-post-recupations-stand-for) en leurs homologues de chaînes réelles et voir si cela vous permet d'accéder au chemin, mais je doute que cela fonctionne. – anothermh