内容

名称

File::Spec::Mac - Mac OS(经典)的 File::Spec

概要

require File::Spec::Mac; # Done internally by File::Spec if needed

描述

用于操作文件规范的方法。

方法

canonpath

在 Mac OS 上,无需执行任何操作。返回传入的值。

catdir()

将两个或多个目录名称连接起来,形成以冒号(":")分隔的路径,并以目录结尾。默认情况下,生成的路径是相对路径,但可以强制为绝对路径(但请避免这样做,见下文)。在完整路径的末尾自动添加一个尾随冒号(":"),因为这是 MacPerl 环境中的做法,有助于区分文件路径和目录路径。

重要说明:从该模块的 1.3 版开始,生成的路径默认情况下是相对路径,不是绝对路径。做出此决定是出于可移植性考虑。由于 File::Spec->catdir() 在所有其他操作系统上返回相对路径,因此它现在也将遵循 Mac OS 上的此约定。请注意,这可能会破坏某些现有脚本。

此例程的预期用途是连接目录名称。但由于 Macintosh 路径的性质,允许一些额外的可能性,以便使用此例程可以为一些常见情况提供合理的结果。换句话说,您也可以连接路径而不是目录名称(严格来说,像 ":a" 这样的字符串是路径,但不是名称,因为它包含标点符号 ":")。

因此,除了像

catdir("a") = ":a:"
catdir("a","b") = ":a:b:"
catdir() = ""                    (special case)

这样的调用之外,还允许像以下

catdir(":a:") = ":a:"
catdir(":a","b") = ":a:b:"
catdir(":a:","b") = ":a:b:"
catdir(":a:",":b:") = ":a:b:"
catdir(":") = ":"

这样的调用。

以下是 catdir() 中使用的规则;请注意,我们尽量与 Unix 保持尽可能的兼容性

  1. 默认情况下,生成的路径是相对路径,即生成的路径将以冒号开头。

  2. 在生成的路径末尾自动添加冒号,以表示目录。

  3. 通常,每个参数都会删除一个前导冒号和一个尾随冒号(如果有)。然后,它们通过冒号连接在一起。对于表示上级目录路径的参数(如 "::lib:"),请参见 (4),或者对于仅包含冒号的的参数(“冒号路径”),请参见 (5),将应用特殊处理。

  4. 当像 ":::lib::" 这样的上级目录路径作为参数传递时,将正确处理要向上爬升的目录数量,在必要时不会删除前导或尾随冒号。例如:

    catdir(":::a","::b","c")    = ":::a::b:c:"
    catdir(":::a::","::b","c")  = ":::a:::b:c:"
  5. 在路径的任何位置添加冒号 ":" 或空字符串 "" 不会改变路径,即这些参数会被忽略。(当 "" 作为第一个参数传递时,它具有特殊含义,请参见 (6))。这样,冒号 ":" 在 Unix 中的处理方式与 "."(当前目录)相同,而空字符串 "" 通常会被忽略(请参见 "File::Spec::Unix 中的 canonpath()")。同样,"::" 的处理方式与 ".."(上级目录)相同,":::" 的处理方式与 "../.." 等相同。例如:

    catdir("a",":",":","b")   = ":a:b:"
    catdir("a",":","::",":b") = ":a::b:"
  6. 如果第一个参数是空字符串 "" 或卷名,即匹配模式 /^[^:]+:/,则生成的路径为绝对路径

  7. 将空字符串 "" 作为第一个参数传递给 catdir() 等同于将 File::Spec->rootdir() 作为第一个参数传递,即:

    catdir("","a","b")          is the same as
    
    catdir(rootdir(),"a","b").

    这在 Unix 上是正确的,其中 catdir("","a","b") 生成 "/a/b",而 rootdir() 是 "/"。请注意,Mac OS 上的 rootdir() 是启动卷,它在概念上最接近 Unix 的 "/"。这将有助于运行最初为 Unix 编写的现有脚本。

  8. 对于绝对路径,会进行一些清理,以确保卷名后面不会立即跟着上级目录。这是无效的,因为这将超出“根目录”。通常,这些情况的处理方式与其 Unix 对应项相同。

    Unix:
       Unix->catdir("","")                 =  "/"
       Unix->catdir("",".")                =  "/"
       Unix->catdir("","..")               =  "/"        # can't go
                                                         # beyond root
       Unix->catdir("",".","..","..","a")  =  "/a"
    Mac:
       Mac->catdir("","")                  =  rootdir()  # (e.g. "HD:")
       Mac->catdir("",":")                 =  rootdir()
       Mac->catdir("","::")                =  rootdir()  # can't go
                                                         # beyond root
       Mac->catdir("",":","::","::","a")   =  rootdir() . "a:"
                                                       # (e.g. "HD:a:")

    但是,这种方法仅限于紧随“根目录”的第一个参数(同样,请参见 "File::Spec::Unix 中的 canonpath()"。如果还有更多参数向上移动目录树,则可能会创建超出根目录的无效路径。

如您所见,您可以通过传递空字符串或以卷名开头的路径作为第一个参数来强制 `catdir()` 创建绝对路径。但是,强烈建议您不要这样做,因为这仅是为了向后兼容。较新版本的 File::Spec 带有一个名为 `catpath()` 的方法(见下文),该方法旨在为创建绝对路径提供可移植的解决方案。它接受卷、目录和文件部分,并返回完整的路径。虽然 `catdir()` 仍然适用于连接 *目录名*,但建议您使用 `catpath()` 连接 *卷名* 和 *目录路径*。例如:

$dir      = File::Spec->catdir("tmp","sources");
$abs_path = File::Spec->catpath("MacintoshHD:", $dir,"");

产生

"MacintoshHD:tmp:sources:" .
catfile

连接一个或多个目录名和文件名以形成以文件名结尾的完整路径。默认情况下,生成的路径是 **相对** 的,但可以强制为绝对路径(但避免这样做)。

重要说明: 从该模块的 1.3 版开始,生成的路径默认情况下是相对的,而不是绝对的。做出此决定的原因是可移植性。由于 `File::Spec->catfile()` 在所有其他操作系统上返回相对路径,因此它现在也将遵循 Mac OS 上的此约定。请注意,这可能会破坏一些现有脚本。

最后一个参数始终被视为文件部分。由于 `catfile()` 使用 `catdir()`(见上文)来连接目录部分(如果有),因此关于相对路径和绝对路径的以下内容是正确的

catfile("")     = ""
catfile("file") = "file"

catfile("","")        = rootdir()         # (e.g. "HD:")
catfile("","file")    = rootdir() . file  # (e.g. "HD:file")
catfile("HD:","file") = "HD:file"

这意味着只有在有两个或多个参数时才会调用 `catdir()`,正如人们所预期的那样。

请注意,文件名中的前导 ":" 将被删除,因此

catfile("a","b","file")  = ":a:b:file"    and

catfile("a","b",":file") = ":a:b:file"

给出相同的答案。

要连接 *卷名*、*目录路径* 和 *文件名*,建议您使用 `catpath()`(见下文)。

curdir

返回表示当前目录的字符串。在 Mac OS 上,这是 ":"。

devnull

返回表示空设备的字符串。在 Mac OS 上,这是 "Dev:Null"。

rootdir

返回空字符串。Mac OS 没有真正的根目录。

tmpdir

返回 $ENV{TMPDIR} 的内容(如果该目录存在)或当前工作目录。在 MacPerl 下,$ENV{TMPDIR} 将包含类似 "MacintoshHD:Temporary Items:" 的路径,这是启动卷上的隐藏目录。

updir

返回表示父目录的字符串。在 Mac OS 上,这是 "::"。

file_name_is_absolute

该函数接受一个路径作为参数,如果该路径是绝对路径,则返回 true。如果路径以 ":" 开头,则为相对路径。否则,它是一个绝对路径,除非路径不包含任何冒号,即它是一个像 "a" 这样的名称。在这种特殊情况下,路径被认为是相对路径(即被认为是文件名)。如果要明确区分,请在路径中的适当位置使用 ":"。作为特殊情况,文件名 '' 始终被认为是绝对路径。请注意,在 File::Spec::Mac 的 1.2 版中,此函数不再咨询本地文件系统。

例如

File::Spec->file_name_is_absolute("a");         # false (relative)
File::Spec->file_name_is_absolute(":a:b:");     # false (relative)
File::Spec->file_name_is_absolute("MacintoshHD:");
                                                # true (absolute)
File::Spec->file_name_is_absolute("");          # true (absolute)
path

对于 MacPerl 应用程序,返回空列表,因为该概念在 Mac OS 下通常没有意义。但是,如果您在 MPW 下使用 MacPerl 工具,它会返回 $ENV{Commands},并适当地进行拆分,就像在 :lib:ExtUtils:MM_Mac.pm 中一样。

splitpath
($volume,$directories,$file) = File::Spec->splitpath( $path );
($volume,$directories,$file) = File::Spec->splitpath( $path,
                                                      $no_file );

将路径拆分为卷、目录和文件名部分。

在 Mac OS 上,假设路径的最后一部分是文件名,除非 $no_file 为真或存在尾部分隔符 ":"。

卷部分始终以尾部 ":" 返回。目录部分始终以开头(表示相对路径)和尾部 ":"(表示目录)返回。文件部分始终以开头 ":" 返回。空部分返回为空字符串 ''。

结果可以传递给 catpath() 以获取与原始路径等效(通常与原始路径相同)的路径。

splitdir

catdir() 的反函数。

@dirs = File::Spec->splitdir( $directories );

$directories 应该只是在具有卷概念或具有区分文件和目录的路径语法的系统上的路径的目录部分。否则,请考虑使用 splitpath()

与仅在分隔符上拆分目录不同,可以返回空目录名("")。由于 Mac OS 上的 catdir() 始终在尾部附加冒号以区分目录路径和文件路径,因此单个尾部冒号将被忽略,即在它之后没有空目录名。

因此,在 Mac OS 上,两者都

File::Spec->splitdir( ":a:b::c:" );    and
File::Spec->splitdir( ":a:b::c" );

产量

( "a", "b", "::", "c")

File::Spec->splitdir( ":a:b::c::" );

产生

( "a", "b", "::", "c", "::")
catpath
$path = File::Spec->catpath($volume,$directory,$file);

获取卷、目录和文件部分并返回完整路径。在 Mac OS 上,$volume、$directory 和 $file 会被连接起来。如果需要,会插入一个“:”。您可以为每个部分传递空字符串。如果所有部分都为空,则返回空字符串。如果 $volume 为空,则结果将是相对路径,以“:”开头。如果 $volume 和 $directory 为空,则会从 $file 中删除前导“:”(如果有)并返回其余部分。如果 $file 为空,则结果路径将以“:”结尾。

abs2rel

获取目标路径和可选的基路径,并返回从基路径到目标路径的相对路径

$rel_path = File::Spec->abs2rel( $path ) ;
$rel_path = File::Spec->abs2rel( $path, $base ) ;

请注意,这两个路径都假定具有区分目录路径(以“:”结尾)和文件路径(没有“:”结尾)的符号。

如果 $base 不存在或为“”,则使用当前工作目录。如果 $base 是相对路径,则使用 rel2abs() 将其转换为绝对形式。这意味着它被认为是相对于当前工作目录的。

如果 $path 和 $base 似乎位于两个不同的卷上,我们将不会尝试解析这两个路径,而是简单地返回 $path。请注意,此模块的先前版本忽略了 $base 的卷,这会导致部分时间出现垃圾结果。

如果 $base 没有尾随冒号,则 $base 的最后一个元素被假定为文件名。此文件名将被忽略。否则,所有路径组件都被假定为目录。

如果 $path 是相对路径,则使用 rel2abs() 将其转换为绝对形式。这意味着它被认为是相对于当前工作目录的。

基于 Shigio Yamaguchi 编写的代码。

rel2abs

将相对路径转换为绝对路径

$abs_path = File::Spec->rel2abs( $path ) ;
$abs_path = File::Spec->rel2abs( $path, $base ) ;

请注意,这两个路径都假定具有区分目录路径(以“:”结尾)和文件路径(没有“:”结尾)的符号。

如果 $base 不存在或为“”,则 $base 设置为当前工作目录。如果 $base 是相对路径,则使用 rel2abs() 将其转换为绝对形式。这意味着它被认为是相对于当前工作目录的。

如果 $base 没有尾随冒号,则 $base 的最后一个元素被假定为文件名。此文件名将被忽略。否则,所有路径组件都被假定为目录。

如果 $path 已经是绝对路径,则返回它,并忽略 $base。

基于 Shigio Yamaguchi 编写的代码。

作者

请参阅 File::Spec 中的作者列表。Mac OS 支持由 Paul Schinder <[email protected]> 和 Thomas Wegner <[email protected]> 提供。

版权

版权所有 (c) 2004 年,Perl 5 维护者。保留所有权利。

本程序是自由软件;您可以在 Perl 本身的相同条款下重新发布和/或修改它。

另请参阅

参见 File::SpecFile::Spec::Unix。此包覆盖了这些方法的实现,而不是语义。