Как лучше всего определить, существует ли файл в каталоге? - PullRequest
1 голос
/ 24 марта 2010

Я пытаюсь переместить файл, но я хочу убедиться, что он существует, прежде чем я это сделаю. Какой самый простой способ сделать это в 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.";
}

Спасибо.

Ответы [ 4 ]

4 голосов
/ 24 марта 2010

Вам нужен оператор проверки файлов , чтобы проверить, существует ли файл. В частности, вам нужен оператор -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."
}
4 голосов
/ 24 марта 2010

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

  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 ;
}
4 голосов
/ 24 марта 2010

Вы можете использовать -e file test для проверки существования файла:

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.";
}
2 голосов
/ 24 марта 2010

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";

In 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 во многих различных проектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...