1. ホーム
  2. perl

[解決済み] ディレクトリで終わるパスに対してcatfileを使用した場合の危険性?

2022-02-02 16:18:37

質問

File::Spec モジュールは、クロスOSの有効なパスを作成する方法を提供します。これは期待通りに動作します。

use strict;
use warnings;

use File::Spec;

my $file = 'ghi.xml';
my $path = File::Spec->catfile(('abc', 'def'), $file);
print $path;
# Windows: abc/def/ghi.xml

メソッド catdir は、ファイルへのパスではなく、ディレクトリを生成することもできます。

私の問題点は、事前に $file はファイル名なのかディレクトリ名なのか。私がテストした限りでは、代わりにdirnameを使用しても結果は正しいです、例えば。

use strict;
use warnings;

use File::Spec;

my $file = 'ghi';
my $path = File::Spec->catfile(('abc', 'def'), $file);
print $path;
# Windows: abc/def/ghi

しかし、これではいずれにせよ問題が発生するのではないか。私が想定しているのは はい なぜなら、モジュールの作成者がなぜ同じ機能のために2つのインターフェイスを構築したのか理解できないからです。しかし、ドキュメントにはそれ以上の説明が見当たりません。

を使っても大丈夫ですか? catfile を使用して、ディレクトリだけでなく、ファイルへのパスも作成できますか?そうでない場合、注意点は何ですか?

解決方法は?

の違いは catdircatfile は通常非常に小さい( 使用するOSに依存します ). UNIXでは catfile が行います。 catdir の場合は、とにかく ディレクトリ 要素を追加し (例えば、最後の (file) の部分を除いて)、その後に ファイル の部分です。また catdir は、パスクリーンのロジックを実行します。Windowsプラットフォームでは、その差はさらに小さくなります。

を確認することができます。 異なるOSのモジュールのソースコード を自分で作る。

これらのルーチンは、ファイルシステムへのアクセスは行わず、論理パスのクリーニングを行うだけということです。


代替品です。

他のOS-esをUNIXライクに気にしない場合(例:Linux、FreeBSD、Mac OS X etc..) そして Windowsは、個人的には パス::タイニー モジュールです。そのドキュメントから。

このモジュールは、ファイル パスがあります。File::Specよりも使い勝手がよく、また簡単に 他のいくつかのコアファイル処理モジュールの関数にアクセスすることができます。それは は、CPAN上の多くの代替品よりも小さく高速であることを目指し、同時に は、多くの一般的な事柄を一貫して、より少なく行えるよう支援します。 エラーを起こしやすい方法です。

Path::Tiny は、Unix 系と Win32プラットフォーム。

IMHO - これはCPANの中で最高のモジュールの一つで、本当の宝物です。例えば、パスの作成には child メソッドがあります。

$file = path("/tmp")->child("foo.txt"); # "/tmp/foo.txt"
$file = path("/tmp")->child(@parts);

元のオブジェクトからの相対的な新しい Path::Tiny オブジェクトを返します。次のように動作します。 catfile または catdir は、File::Spec から、ファイルを気にせずに またはディレクトリを指定します。

上記以外の パス::タイニー モジュールは、ファイルの内容への簡単なアクセス、(ユニコード処理も可能)、そして一般的に必要とされるすべての "path"の操作を提供します。欠点:残念ながらCOREモジュールではないので、例えばCPANからインストールする必要があります。

EDIT

安全に使用できますか? catfile をディレクトリに使用することはできますか?私の場合 はい (ただし、専門家の中にはもっと別のことをご存知の方もいらっしゃるかもしれません)。unixで。

  • catdir が呼び出されます。 canonpath (論理的なパスのクリーニングを行う)。
  • その catfilecanonpath を2回、1回は ファイル の部分と ディレクトリ (提供されている場合)、2つの結果を連結します。連結の結果、奇妙な形のパスが生成されることがありますが、一般的には無害です。

Windowsでは、違いはさらに少なく、どちらもパスクリーニングルーチンを呼び出します。

デモ - 次のスクリプトは、異なるパーツの組み合わせを多数生成し、その中から catdircatfile (の2つのバリエーションがあります(さらに Path::Tiny )

use strict;
use warnings;

use File::Spec::Functions;
use Path::Tiny;

my @parts = qw(x / /x /x/ /x// // //x //x/ //x// /./ /./x /x/./ );
my $cwidth=16;
print pr(qw(first second catdir catfile path-child path-list)), "\n";
print '-' x ($cwidth*6),"\n";
for my $first (map { s/x/first/r } @parts) {
    for my $second ( map { s/x/second/r } @parts) {
        print pr(
            $first,
            $second,
            catdir($first,$second),
            catfile($first,$second),
            path($first)->child($second),
            path($first,$second),
        ), "\n";
    }
}
sub pr {
    my $str;
    $str .= sprintf "%-${cwidth}s",$_ for @_;
    return $str;
}

長い結果が表示されます。以下に示すように、すべてのパスはディレクトリやファイルとして安全に使用できますが、一部のパスは catfile は、"nice"ではないですね。

両方の "Path::Tiny" の結果は、明確で一貫しています。逆に catfilecatdir を使うと、未定義の部分(デモでは表示されていません)を使用することができます - そして、このような間違った引数でも は何らかの結果をもたらします。 の場合、Path::Tinyの 死ぬ にundefまたはnull-stringを渡した場合、その child メソッドを使用します。

first           second          catdir          catfile         path-child      path-list       
------------------------------------------------------------------------------------------------
first           second          first/second    first/second    first/second    first/second    
first           /               first           first//         first           first           
first           /second         first/second    first//second   first/second    first/second    
first           /second/        first/second    first//second   first/second    first/second    
first           /second//       first/second    first//second   first/second    first/second    
first           //              first           first//         first           first           
first           //second        first/second    first//second   first/second    first/second    
first           //second/       first/second    first//second   first/second    first/second    
first           //second//      first/second    first//second   first/second    first/second    
first           /./             first           first//         first           first           
first           /./second       first/second    first//second   first/second    first/second    
first           /second/./      first/second    first//second   first/second    first/second    
/               second          /second         /second         /second         /second         
/               /               /               //              /               /               
/               /second         /second         //second        /second         /second         
/               /second/        /second         //second        /second         /second         
/               /second//       /second         //second        /second         /second         
/               //              /               //              /               /               
/               //second        /second         //second        /second         /second         
/               //second/       /second         //second        /second         /second         
/               //second//      /second         //second        /second         /second         
/               /./             /               //              /               /               
/               /./second       /second         //second        /second         /second         
/               /second/./      /second         //second        /second         /second         
/first          second          /first/second   /first/second   /first/second   /first/second   
/first          /               /first          /first//        /first          /first          
/first          /second         /first/second   /first//second  /first/second   /first/second   
/first          /second/        /first/second   /first//second  /first/second   /first/second   
/first          /second//       /first/second   /first//second  /first/second   /first/second   
/first          //              /first          /first//        /first          /first          
/first          //second        /first/second   /first//second  /first/second   /first/second   
/first          //second/       /first/second   /first//second  /first/second   /first/second   
/first          //second//      /first/second   /first//second  /first/second   /first/second   
/first          /./             /first          /first//        /first          /first          
/first          /./second       /first/second   /first//second  /first/second   /first/second   
/first          /second/./      /first/second   /first//second  /first/second   /first/second   
/first/         second          /first/second   /first/second   /first/second   /first/second   
/first/         /               /first          /first//        /first          /first          
/first/         /second         /first/second   /first//second  /first/second   /first/second   
/first/         /second/        /first/second   /first//second  /first/second   /first/second   
/first/         /second//       /first/second   /first//second  /first/second   /first/second   
/first/         //              /first          /first//        /first          /first          
/first/         //second        /first/second   /first//second  /first/second   /first/second   
/first/         //second/       /first/second   /first//second  /first/second   /first/second   
/first/         //second//      /first/second   /first//second  /first/second   /first/second   
/first/         /./             /first          /first//        /first          /first          
/first/         /./second       /first/second   /first//second  /first/second   /first/second   
/first/         /second/./      /first/second   /first//second  /first/second   /first/second   
/first//        second          /first/second   /first/second   /first/second   /first/second   
/first//        /               /first          /first//        /first          /first          
/first//        /second         /first/second   /first//second  /first/second   /first/second   
/first//        /second/        /first/second   /first//second  /first/second   /first/second   
/first//        /second//       /first/second   /first//second  /first/second   /first/second   
/first//        //              /first          /first//        /first          /first          
/first//        //second        /first/second   /first//second  /first/second   /first/second   
/first//        //second/       /first/second   /first//second  /first/second   /first/second   
/first//        //second//      /first/second   /first//second  /first/second   /first/second   
/first//        /./             /first          /first//        /first          /first          
/first//        /./second       /first/second   /first//second  /first/second   /first/second   
/first//        /second/./      /first/second   /first//second  /first/second   /first/second   
//              second          /second         /second         /second         /second         
//              /               /               //              /               /               
//              /second         /second         //second        /second         /second         
//              /second/        /second         //second        /second         /second         
//              /second//       /second         //second        /second         /second         
//              //              /               //              /               /               
//              //second        /second         //second        /second         /second         
//              //second/       /second         //second        /second         /second         
//              //second//      /second         //second        /second         /second         
//              /./             /               //              /               /               
//              /./second       /second         //second        /second         /second         
//              /second/./      /second         //second        /second         /second         
//first         second          /first/second   /first/second   /first/second   /first/second   
//first         /               /first          /first//        /first          /first          
//first         /second         /first/second   /first//second  /first/second   /first/second   
//first         /second/        /first/second   /first//second  /first/second   /first/second   
//first         /second//       /first/second   /first//second  /first/second   /first/second   
//first         //              /first          /first//        /first          /first          
//first         //second        /first/second   /first//second  /first/second   /first/second   
//first         //second/       /first/second   /first//second  /first/second   /first/second   
//first         //second//      /first/second   /first//second  /first/second   /first/second   
//first         /./             /first          /first//        /first          /first          
//first         /./second       /first/second   /first//second  /first/second   /first/second   
//first         /second/./      /first/second   /first//second  /first/second   /first/second   
//first/        second          /first/second   /first/second   /first/second   /first/second   
//first/        /               /first          /first//        /first          /first          
//first/        /second         /first/second   /first//second  /first/second   /first/second   
//first/        /second/        /first/second   /first//second  /first/second   /first/second   
//first/        /second//       /first/second   /first//second  /first/second   /first/second   
//first/        //              /first          /first//        /first          /first          
//first/        //second        /first/second   /first//second  /first/second   /first/second   
//first/        //second/       /first/second   /first//second  /first/second   /first/second   
//first/        //second//      /first/second   /first//second  /first/second   /first/second   
//first/        /./             /first          /first//        /first          /first          
//first/        /./second       /first/second   /first//second  /first/second   /first/second   
//first/        /second/./      /first/second   /first//second  /first/second   /first/second   
//first//       second          /first/second   /first/second   /first/second   /first/second   
//first//       /               /first          /first//        /first          /first          
//first//       /second         /first/second   /first//second  /first/second   /first/second   
//first//       /second/        /first/second   /first//second  /first/second   /first/second   
//first//       /second//       /first/second   /first//second  /first/second   /first/second   
//first//       //              /first          /first//        /first          /first          
//first//       //second        /first/second   /first//second  /first/second   /first/second   
//first//       //second/       /first/second   /first//second  /first/second   /first/second   
//first//       //second//      /first/second   /first//second  /first/second   /first/second   
//first//       /./             /first          /first//        /first          /first          
//first//       /./second       /first/second   /first//second  /first/second   /first/second   
//first//       /second/./      /first/second   /first//second  /first/second   /first/second   
/./             second          /second         /second         /second         /second         
/./             /               /               //              /               /               
/./             /second         /second         //second        /second         /second         
/./             /second/        /second         //second        /second         /second         
/./             /second//       /second         //second        /second         /second         
/./             //              /               //              /               /               
/./             //second        /second         //second        /second         /second         
/./             //second/       /second         //second        /second         /second         
/./             //second//      /second         //second        /second         /second         
/./             /./             /               //              /               /               
/./             /./second       /second         //second        /second         /second         
/./             /second/./      /second         //second        /second         /second         
/./first        second          /first/second   /first/second   /first/second   /first/second   
/./first        /               /first          /first//        /first          /first          
/./first        /second         /first/second   /first//second  /first/second   /first/second   
/./first        /second/        /first/second   /first//second  /first/second   /first/second   
/./first        /second//       /first/second   /first//second  /first/second   /first/second   
/./first        //              /first          /first//        /first          /first          
/./first        //second        /first/second   /first//second  /first/second   /first/second   
/./first        //second/       /first/second   /first//second  /first/second   /first/second   
/./first        //second//      /first/second   /first//second  /first/second   /first/second   
/./first        /./             /first          /first//        /first          /first          
/./first        /./second       /first/second   /first//second  /first/second   /first/second   
/./first        /second/./      /first/second   /first//second  /first/second   /first/second   
/first/./       second          /first/second   /first/second   /first/second   /first/second   
/first/./       /               /first          /first//        /first          /first          
/first/./       /second         /first/second   /first//second  /first/second   /first/second   
/first/./       /second/        /first/second   /first//second  /first/second   /first/second   
/first/./       /second//       /first/second   /first//second  /first/second   /first/second   
/first/./       //              /first          /first//        /first          /first          
/first/./       //second        /first/second   /first//second  /first/second   /first/second   
/first/./       //second/       /first/second   /first//second  /first/second   /first/second   
/first/./       //second//      /first/second   /first//second  /first/second   /first/second   
/first/./       /./             /first          /first//        /first          /first          
/first/./       /./second       /first/second   /first//second  /first/second   /first/second   
/first/./       /second/./      /first/second   /first//second  /first/second   /first/second