File::Spec - 可移植地对文件名执行操作
use File::Spec;
my $x = File::Spec->catfile('a', 'b', 'c');
在 Unix 下返回“a/b/c”。或者
use File::Spec::Functions;
my $x = catfile('a', 'b', 'c');
此模块旨在支持通常对文件规范(通常称为“文件名”,但不要与文件内容或 Perl 的文件句柄混淆)执行的操作,例如将多个目录和文件名连接成一个路径,或确定路径是否已植根。它基于直接从 MakeMaker 5.17 提取的代码,由 Andreas König、Andy Dougherty、Charles Bailey、Ilya Zakharevich、Paul Schinder 等人编写的代码。
由于这些函数在大多数操作系统中不同,因此每组特定于操作系统的例程都可在单独的模块中获得,包括
File::Spec::Unix
File::Spec::Mac
File::Spec::OS2
File::Spec::Win32
File::Spec::VMS
File::Spec 会自动加载适用于当前操作系统的模块。由于某些模块(如 VMS)使用仅在该操作系统下可用的功能,因此可能无法在所有操作系统下加载所有模块。
由于 File::Spec 是面向对象的,因此不应直接调用子例程,如
File::Spec::catfile('a','b');
而应作为类方法调用
File::Spec->catfile('a','b');
对于简单的用法,File::Spec::Functions 提供了这些方法的便捷函数形式。
不对文件系统进行物理检查,而是对路径进行逻辑清理。
$cpath = File::Spec->canonpath( $path ) ;
请注意,这*不会*将 x/../y 部分折叠为 y。这是设计使然的。如果系统上的 /foo 是指向 /bar/baz 的符号链接,那么 /foo/../quux 实际上是 /bar/quux,而不是朴素的 ../ 删除会给你的 /quux。如果你想进行这种处理,你可能希望使用 Cwd
的 realpath()
函数来实际遍历文件系统,清理这样的路径。
连接两个或多个目录名以形成以目录结尾的完整路径。但从结果字符串中删除尾部斜杠,因为它看起来不好,没有必要,而且会混淆 OS/2。当然,如果这是根目录,不要切断尾部斜杠 :-)
$path = File::Spec->catdir( @directories );
连接一个或多个目录名和一个文件名以形成以文件名结尾的完整路径
$path = File::Spec->catfile( @directories, $filename );
返回当前目录的字符串表示形式。
$curdir = File::Spec->curdir();
返回空设备的字符串表示形式。
$devnull = File::Spec->devnull();
返回根目录的字符串表示形式。
$rootdir = File::Spec->rootdir();
从可能的临时目录列表中返回第一个可写目录的字符串表示形式。如果没有找到可写的临时目录,则返回当前目录。检查的目录列表取决于平台;例如,File::Spec::Unix 检查 $ENV{TMPDIR}
(除非启用 taint)和 /tmp。
$tmpdir = File::Spec->tmpdir();
返回父目录的字符串表示形式。
$updir = File::Spec->updir();
给定目录中的文件列表(例如来自 readdir()
),剔除 '.'
和 '..'
。
安全注意事项:这不会过滤包含 '..'
的路径,例如 '../../../../etc/passwd'
,只会过滤与 '.'
和 '..'
完全匹配的路径。
@paths = File::Spec->no_upwards( readdir $dirhandle );
分别返回 true 或 false 值,表示在比较文件规范时字母大小写不重要或很重要。Cygwin 和 Win32 接受一个可选的驱动器参数。
$is_case_tolerant = File::Spec->case_tolerant();
以路径作为参数,如果它是绝对路径,则返回 true。
$is_absolute = File::Spec->file_name_is_absolute( $path );
在 Unix、Win32、OS/2 或 Mac OS(经典版)中,此操作不会咨询本地文件系统。它会咨询 VMS 的工作环境(请参阅 File::Spec::VMS 中的“file_name_is_absolute”)。
不接受参数。将环境变量 PATH
(或本地平台的等效项)作为列表返回。
@PATH = File::Spec->path();
join 与 catfile 相同。
将路径拆分为卷、目录和文件名部分。在没有卷概念的系统上,返回卷的 ''。
($volume,$directories,$file) =
File::Spec->splitpath( $path );
($volume,$directories,$file) =
File::Spec->splitpath( $path, $no_file );
对于没有语法来区分文件名和目录的系统,假设最后一个文件是一个路径,除非 $no_file
为 true 或存在尾随分隔符或 /. 或 /..。在 Unix 上,这意味着 $no_file
为 true 会使此操作返回 ( '', $path, '' )。
目录部分可能或可能不会以尾随 '/' 返回。
结果可以传递给 "catpath()" 以获取与原始路径等效(通常相同)的路径。
"catdir" 的相反操作。
@dirs = File::Spec->splitdir( $directories );
在有卷概念或有路径语法来区分文件和目录的系统上,$directories
必须仅为路径的目录部分。
与仅在分隔符上拆分目录不同,可以返回空目录名 (''
),因为这些目录名在某些操作系统上很重要。
接受卷、目录和文件部分,并返回一个完整路径。在 Unix 下,$volume
被忽略,目录和文件被连接。如果需要,将插入 '/'。在其他操作系统上,$volume
很重要。
$full_path = File::Spec->catpath( $volume, $directory, $file );
接受一个目标路径和一个可选的基本路径,返回从基本路径到目标路径的相对路径
$rel_path = File::Spec->abs2rel( $path ) ;
$rel_path = File::Spec->abs2rel( $path, $base ) ;
如果 $base
不存在或为 '',则使用 Cwd::cwd()。如果 $base
是相对的,则使用 "rel2abs()" 将其转换为绝对形式。这意味着它被视为相对于 Cwd::cwd()。
在有卷概念的系统上,如果 $path
和 $base
似乎位于两个不同的卷上,我们将不会尝试解析这两个路径,而是简单地返回 $path
。请注意,此模块的先前版本忽略了 $base
的卷,这会导致部分时间出现垃圾结果。
在具有指示文件名的语法系统上,此操作也会忽略 $base
文件名。否则,所有路径组件都假定为目录。
如果 $path
是相对的,则使用 "rel2abs()" 将其转换为绝对形式。这意味着它被视为相对于 Cwd::cwd()。
不会对文件系统进行任何检查。在 VMS 上,由于逻辑和宏得到扩展,因此会与工作环境进行交互。
基于 Shigio Yamaguchi 编写的代码。
将相对路径转换为绝对路径。
$abs_path = File::Spec->rel2abs( $path ) ;
$abs_path = File::Spec->rel2abs( $path, $base ) ;
如果 $base
不存在或为 '',则使用 Cwd::cwd()。如果 $base
是相对的,则使用 "rel2abs()" 将其转换为绝对形式。这意味着它被视为相对于 Cwd::cwd()。
在有卷概念的系统上,如果 $path
和 $base
似乎位于两个不同的卷上,我们将不会尝试解析这两个路径,而是简单地返回 $path
。请注意,此模块的先前版本忽略了 $base
的卷,这会导致部分时间出现垃圾结果。
在具有指示文件名的语法系统上,此操作也会忽略 $base
文件名。否则,所有路径组件都假定为目录。
如果 $path
是绝对的,则使用 "canonpath" 对其进行清理并返回。
不会对文件系统进行任何检查。在 VMS 上,由于逻辑和宏得到扩展,因此会与工作环境进行交互。
基于 Shigio Yamaguchi 编写的代码。
有关详细信息,请参阅 File::Spec::Unix、File::Spec::Mac、File::Spec::OS2、File::Spec::Win32 或 File::Spec::VMS。
File::Spec::Unix、File::Spec::Mac、File::Spec::OS2、File::Spec::Win32、File::Spec::VMS、File::Spec::Functions、ExtUtils::MakeMaker
由 perl5-porters <[email protected]> 维护。
绝大部分代码由 Kenneth Albanowski <[email protected]>
、Andy Dougherty <[email protected]>
、Andreas König <[email protected]>
、Tim Bunce <[email protected]>
编写。VMS 支持由 Charles Bailey <[email protected]>
提供。OS/2 支持由 Ilya Zakharevich <[email protected]>
提供。Mac 支持由 Paul Schinder <[email protected]>
和 Thomas Wegner <[email protected]>
提供。abs2rel() 和 rel2abs() 由 Shigio Yamaguchi <[email protected]>
编写,由 Barrie Slaymaker <[email protected]>
修改。splitpath()、splitdir()、catpath() 和 catdir() 由 Barrie Slaymaker 编写。
版权所有 (c) 2004-2013 Perl 5 Porters。保留所有权利。
本程序是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。