2015-08-25 2 views
1

Я пытался использовать Perl's File: Найти рекурсивно найти все файлы на моем системном диске Windows. К сожалению, это ошибка во время выполнения до очень длинного пути к файлу. Я хотел бы знать, как обращаться с этим так, чтобы мой скрипт мог продолжать работать и сообщить мне, какие пути он должен был пропустить. В настоящее время я могу только считать файлы до тех пор, пока не встретит путь, который ему не нравится, после чего он останавливается.Как обращаться с файлом :: Найти в Windows с длинными путями

Что я основывая этот офф: http://www.perlmonks.org/?node_id=217166 Я нашел следующую статью, которая аналогичная проблема, но я не в состоянии применить его: http://www.perlmonks.org/?node_id=933849

#/usr/bin/perl 
use strict; 
use File::Find;  
my $superFileCount = 0; 
# first try find(\&print_name_if_dir, no_chdir=>1, "."); 

# second try 
eval { 
find(\&print_name, no_chdir=>1, ".") 
}; warn [email protected] if [email protected]; 
# end of second try 

sub print_name 
{ 
     $superFileCount++; 
} 
print "all files found: $superFileCount \n"; 

Первый запуск:

Can't cd to ../../../../../../../../../.. from ./Users/username/AppData/Roaming/ 
Macromedia/Flash Player/#SharedObjects/8Z5RPFSR/foxnewsplayer-a.akamaihd.net/[[I 
MPORT]]/players.edgesuite.net/flash/plugins/osmf/advanced-streaming-plugin/v3.6/ 
osmf2.0/AkamaiAdvancedStreamingPlugin.swf: No such file or directory at C:/Straw 
berryPerl/perl/lib/File/Find.pm line 812. 

Если я оберну его в eval, я получаю частичный файл, но он намного ниже, чем на самом деле на диске:

Can't cd to ../../../../../../../../../.. from ./Users/username/AppData/Roaming/ 
Macromedia/Flash Player/#SharedObjects/8Z5RPFSR/foxnewsplayer-a.akamaihd.net/[[I 
MPORT]]/players.edgesuite.net/flash/plugins/osmf/advanced-streaming-plugin/v3.6/ 
osmf2.0/AkamaiAdvancedStreamingPlugin.swf: No such file or directory at C:/Straw 
berryPerl/perl/lib/File/Find.pm line 812. 
all files found: 84730 
+0

Ваш скрипт отлично подходит для меня. Тем не менее, я запускаю Cygwin. – xxfelixxx

+0

Это может изменить ситуацию, я использую Strawberry Perl. Возможно, Cygwin обрабатывает путь по-разному. Я надеюсь, что есть способ более эффективно управлять ошибкой. – ColdSoda

ответ

1

Если вы хотите использовать параметр no_chdir (или любой параметр в этом отношении), вам необходимо приложить все свои параметры в хеш-ссылке. Это не так, поэтому no_chdir не вступает в силу. Попробуйте это:

find({ wanted => \&print_name, no_chdir => 1 }, '.'); 

я не знаю, однако, если это будет на самом деле решить вашу проблему, так как это может быть просто фактический путь не обрабатывается должным образом, и может не иметь ничего общего с делать cd ,

+1

Спасибо за исправление в отношении хеш-ссылки. В этом была проблема - когда он получал параметр no_chdir, он избегал/обрабатывал проблематичный путь. – ColdSoda

Смежные вопросы