2009-11-13 19 views
1

Lorsque j'essaie un "chdir" avec un handle de fichier comme argument, "chdir" renvoie 0 et un pwd retourne toujours le même répertoire. Est-ce que cela devrait être le cas?Pourquoi mon chdir sur un handle de fichier ne fonctionne pas en Perl?

J'ai essayé, parce que dans la documentation à chdir je trouve.

« Sur les systèmes qui prennent en charge fchdir, vous peut passer un descripteur de fichier ou un répertoire poignée comme argument Sur les systèmes don » t support fchdir, en passant les poignées produit une erreur fatale à l'exécution. "

données plus loin:

#!/usr/bin/perl -w 
use 5.010; 
use strict; 
use Cwd; 

say cwd(); # /home/mm 
open(my $fh, '>', '/home/mm/Documents/foto.jpg') or die $!; 
say chdir $fh; # 0 
say cwd(); # /home/mm 

Je pensais que ce serait peut-être chdir dans le répertoire du fichier - mais pas dwim pour moi ici.

+0

De quel langage/environnement s'agit-il? – unwind

+0

perl 5.10.0/linux –

+0

Où est votre petit script de démonstration qui montre le problème? –

Répondre

8

Il dit aussi

 
It returns true upon success, false otherwise. 

qui signifie que votre appel à chdir a échoué. Vérifiez la variable $! pour un indice sur ce qui s'est passé. Comme vous n'avez pas eu une erreur d'exécution fatale, vous n'avez pas à vous soucier de ce dernier paragraphe à propos de fchdir.


Exécution quelques tests, je vois chdir FILEHANDLE œuvres quand FILEHANDLE fait référence à un répertoire, mais pas un fichier régulier. Hope qui aide:

open(FH, "<", "/tmp/file"); # assume this file exists 
    chdir FH and print "Success 1\n" or warn "Fail 1: $!\n"; 
    open(FH, "<", "/tmp"); 
    chdir FH and print "Success 2\n" or warn "Fail 2: $!\n"; 
    opendir(FH, "/tmp"); 
    chdir FH and print "Success 3\n" or warn "Fail 3: $!\n"; 

 

Fail 1: Not a directory 
    Success 2 
    Success 3 
+0

Tsk tsk, vous utilisez un typeglob global plutôt qu'un lexique local :) – Ether

+0

Je ne savais pas, ce handle de fichier peut se référer à un répertoire. –

+0

@sid_com Ce n'est pas une caractéristique utile, mais à un certain niveau d'abstraction d'un répertoire Un * x est juste un autre fichier – mob

0

Quelle version de perl? Quel système d'exploitation?

5.10.1 sur Windows:

#!/usr/bin/perl 

use strict; use warnings; 

# have to use a file because Windows does not let 
# open directories as files 
# only done so I can illustrate the fatal error on 
# a platform where fchdir is not implemented 

open my $fh, '<', 'e:/home/test.txt' 
    or die "Cannot open file: $!"; 

chdir $fh 
    or die "Cannot chdir using filehandle: $!"; 

Sortie:

 
C:\Temp> k 
The fchdir function is unimplemented at C:\Temp\k.pl line 9. 

5.10.1 sur Linux (/home/sinan/test est un répertoire):

$ cat k.pl 
#!/usr/bin/perl 

use strict; use warnings; 

use Cwd; 

open my $fh, '<', '/home/sinan/test' 
    or die "Cannot open file: $!"; 

chdir $fh 
    or die "Cannot chdir using filehandle: $!"; 

print getcwd, "\n"; 

$ ./k.pl 
/home/sinan/test 
0

Works pour moi. Windows ne prend pas en charge fchdir et il s'agit en fait d'une erreur fatale:

perl -we"opendir my $fh, 'temp'; chdir $fh or print 'foo'" 

génère une erreur fatale. Donc, il semble que sur les systèmes qui ne prennent pas en charge fchdir du tout cela fonctionne à spec. On dirait que le libellé pourrait être éclairci, en particulier le mot «pourrait».