2010-03-24 3 views
1

Я пытаюсь переместить файл, но я хочу убедиться, что он существует до того, как я это сделаю. Каков самый простой способ сделать это в Perl?Каков наилучший способ узнать, существует ли файл в каталоге?

Мой код такой. Я искал команду open, но я не уверен, что это самый простой способ или нет.

if #Parser.exe exist in directory of Debug 
{ 
    move ("bin/Debug/Parser.exe","Parser.exe"); 
} 
elsif #Parser.exe exist in directory of Release 
{ 
    move ("bin/Release/Parser.exe","Parser.exe"); 
} 
else 
{ 
    die "Can't find the Parser.exe."; 
} 

спасибо.

+0

жуткий, эти ответы почти одинаковы. – kenny

ответ

4

Что вам нужно, это file test operator, чтобы проверить, существует ли файл. В частности, вам нужен оператор -e, который проверяет, есть ли файл e xists.

if (-e "bin/Debug/Parser.exe") 
{ 
    move ("bin/Debug/Parser.exe","Parser.exe"); 
} 
elsif (-e "bin/Release/Parser.exe") 
    move ("bin/Release/Parser.exe","Parser.exe"); 
else 
{ 
    die "Can't find the Parser.exe." 
} 
+0

Я предпочитаю использовать ** move **. Храните уникальный файл Parser.exe. Большое спасибо. –

4

Вы можете использовать -e тестовый файл, чтобы проверить наличие файла:

use File::Copy; 

if(-e "bin/Debug/parser.exe") { 
copy("bin/Debug/parser.exe","Parser.exe") or die "Copy failed: $!"; 
} elsif(-e "bin/Release/Parser.exe") { 
copy("bin/Release/parser.exe","Parser.exe") or die "Copy failed: $!"; 
} else { 
die "Can't find the Parser.exe."; 
} 
+0

Спасибо тоже. :-) –

4

Лично мне не нравится дублирования имени файла/пути в этих решениях - говоря для себя я подозреваю, что я мог бы изменить случайно его

if(-e "pathone....")... { copy("pathtwo...","Parser.exe") 

Я хотел бы сделать что-то вроде

copy("bin/Debug/parser.exe","Parser.exe") or 
    copy("bin/Release/parser.exe","Parser.exe") or 
    die "Can't find the Parser.exe."; 

Или, если это немного рискованный

copy_parser("bin/Debug") or 
    copy_parser("bin/Release") or 
    die "Can't find the Parser.exe."; 

sub copy_parser { 
    my $path = shift ; 
    my $source = File::Spec-> catfile ($path, 'Parser.exe') ; 

    if (-e $source) { 
     copy($source, "Parser.exe") or die "Copy or $source failed: $!"; 
     return 1 ; 
    } 
    return 0 ; 
} 
+0

Это отличная помощь для меня. БЛАГОДАРЮ. –

2

justintime находится на правильном пути, когда он отмечает повторение и пытается его устранить. Я сделал шаг на шаг дальше, чем он.

Вместо того, чтобы инкапсулировать только часть копирования/перемещения кода, имеет смысл удалить все повторение путем инкапсуляции итерации списка.

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

use SearchMove; 

my $found = search_and_move( 
    src => 'Parser.exe', 
    dest => 'Parser.exe', 
    dirs => [ 
     "bin/Debug", 
     "bin/Release", 
    ], 
); 

die "Can't find the Parser.exe\n" 
    unless defined $found; 

print "Found Parser.exe in $found"; 

В SearchMove.pm

пакет SearchMove;

использование строгое; использовать предупреждения;

use Exporter 'import'; 

our @EXPORT_OK = qw(search_and_move); 
our @EXPORT = @EXPORT_OK;  

sub search_and_move { 
    my %arg = @_; 

    croak "No source file" unless exists $args{src}; 
    croak "No dest file" unless exists $args{dest}; 
    croak "No search paths" unless exists $args{dirs}; 

    my $got_file; 

    for my $dir (@{$arg{dirs}}) { 

     my $source = "$dir/$arg{src}"; 

     if(-e $source) { 
      move($source, $arg{dest}); 
      $got_file = $dir; 
      last; 
     } 

    } 

    return $got_file; 
} 

1; 

Теперь вы можете использовать search_and_move во многих проектах.

+0

Hi daotoad, Большое спасибо за ваше решение. –

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