Perl:dirhandle的坏符号

这是我的代码:

opendir(DIR, $directoryPath) or die "Cant open $directoryPath$!"; my @files = readdir(DIR); #Array of file names closedir (DIR) or die "Cant close $directoryPath$!"; 

我正在使用@files在目录中创build一个文件名的数组,以便稍后在程序中进行重命名

问题是:

  1. 我在closedir行收到错误“dirhandle的错误符号”。
  2. 如果我不想要这样做,我没有权限更改文件名(我正在使用Windows)。
  3. 我尝试了另一种重命名文件的方法(下面),通过以不同的方式在dirhandles中重命名文件来尝试不同的解决scheme,但这只是重复了权限错误。

     opendir(DIR, $directoryPath) or die "Cant open $directoryPath$!"; while( (my $filename = readdir(DIR))) { rename($filename, $nFileName . $i) or die "Cant rename file $filename$!"; i++; } closedir (DIR) or die "Cant close $directoryPath$!"; 

从一个简单的研究我认为权限错误是一个Windows安全function,所以你不能编辑一个文件,而它的开放,但我一直没能find一个解决scheme,足以让我明白。

对第1点或第3点的回答是可取的,但对第2点的回答也是有用的。

完整的代码在下面的1.和2.中使用

 use 5.16.3; use strict; print "Enter Directory: "; my $directoryPath = <>; chomp($directoryPath); chdir("$directoryPath") or die "Cant chdir to $directoryPath$!"; opendir(DIR, $directoryPath) or die "Cant open $directoryPath$!"; my @files = readdir(DIR); #Array of file names closedir (DIR) or die "Cant close $directoryPath$!"; my $fileName = "File "; for my $i (0 .. @files) { rename($files[$i], $fileName . ($i+1)) or die "Cant rename file $files[$i]$!"; } chdir; #return to home directory 

我可以正确inputpath,但是错误消息(正确复制)是:

 Can't rename file .Permission denied at C:\path\to\file\RenameFiles.pl line 19, <> line 1. 

Solutions Collecting From Web of "Perl:dirhandle的坏符号"

错误

 Can't rename file .Permission denied at C:\path\to\file\RenameFiles.pl line 19, <> line 1. 

说你正在尝试重命名文件. ,这是一个特殊的文件,是“当前目录”的快捷方式。 你应该在你的代码中添加异常,以便不重命名这个文件,而那个叫.. 。 就像是:

 next if $files[$i] =~ /^\./; 

会做。 这将跳过以句点开头的任何文件. 。 或者,您可以跳过目录:

 next if -d $files[$i]; # skip directories (includes . and ..) 

正如TLP已经指出的, readdir返回...对应的当前和父目录。

您需要将其过滤掉,以避免重命名目录。

 use strict; use warnings; use autodie; print "Enter Directory: "; chomp( my $dirpath = <> ); opendir my $dh, $dirpath or die "Can't open $dirpath: $!"; my $number = 0; while ( my $file = readdir($dh) ) { next if $file =~ /^\.+$/; my $newfile = "$dirpath/File " . ++$number; rename "$dirpath/$file", $newfile or die "Cant rename file $file -> $newfile: $!"; } closedir $dh; 

跨平台兼容使用Path :: Class

简化这个脚本和逻辑的一种方法是使用Path::Class来处理文件和目录操作。

 use strict; use warnings; use autodie; use Path::Class; print "Enter Directory: "; chomp( my $dirname = <> ); my $dir = dir($dirname); my $number = 0; for my $file ( $dir->children ) { next if $file->is_dir(); my $newfile = $dir->file( "File" . ++$number ); $file->move_to($newfile); }