2008-10-23 32 views

Trả lời

27
use File::Path; 
use File::Copy; 

my $path = "tardir/dest1/dest2/"; 
my $file = "test.txt"; 

if (! -d $path) 
{ 
    my $dirs = eval { mkpath($path) }; 
    die "Failed to create $path: [email protected]\n" unless $dirs; 
} 

copy($file,$path) or die "Failed to copy $file: $!\n"; 
+1

File :: Path :: mkpath ném một ngoại lệ về lỗi để "hoặc chết" của bạn là không chính xác. – ysth

8
use File::Basename qw/dirname/; 
use File::Copy; 

sub mkdir_recursive { 
    my $path = shift; 
    mkdir_recursive(dirname($path)) if not -d dirname($path); 
    mkdir $path or die "Could not make dir $path: $!" if not -d $path; 
    return; 
} 

sub mkdir_and_copy { 
    my ($from, $to) = @_; 
    mkdir_recursive(dirname($to)); 
    copy($from, $to) or die "Couldn't copy: $!"; 
    return; 
} 
+0

Theo corelist File :: Đường dẫn đã là một phần của lõi từ 5,001. –

+0

Thú vị. Nó không phải trong 5,10, nhưng nó có mặt trong các phiên bản trước đó. –

+0

Corelist là một lỗi nhỏ về ký hiệu cho số phiên bản. Chạy "corelist -a File :: Path" và bạn sẽ thấy v2.04 được phát hành với perl "5.01" (thay vì 5.010). –

5

File::Copy::Recursive :: fcopy() là không cốt lõi nhưng kết hợp các File :: Đường dẫn :: mkpath() và File :: Sao chép :: copy() dung dịch vào một cái gì đó thậm chí ngắn hơn, và bảo tồn quyền không giống như Tệp :: Sao chép. Nó cũng chứa các chức năng tiện ích tiện lợi khác.

+0

Cách tiếp cận này được chứng minh là dễ nhất trong các lựa chọn có sẵn. Tôi đã chọn sử dụng chức năng dircopy của File :: Copy :: Recursive. Hai ưu điểm chính là File :: Copy :: chức năng của đệ quy sẽ tự động thực hiện bất kỳ thư mục nào. cấu trúc và cũng sẽ giữ quyền khi tạo bản sao. – slm

1

Xem câu trả lời khác để thực hiện việc sao chép, nhưng để tạo thư mục Path::Class là rất tốt đẹp để sử dụng:

use Path::Class; 

my $destination_file = file('tardir/dest1/dest2/test.txt'); 
$destination_file->dir->mkpath; 

# ... do the copying here 
Các vấn đề liên quan