dwww Home | Manual pages | Find package

URI::file(3pm)        User Contributed Perl Documentation       URI::file(3pm)

NAME
       URI::file - URI that maps to local file names

SYNOPSIS
        use URI::file;

        $u1 = URI->new("file:/foo/bar");
        $u2 = URI->new("foo/bar", "file");

        $u3 = URI::file->new($path);
        $u4 = URI::file->new("c:\\windows\\", "win32");

        $u1->file;
        $u1->file("mac");

DESCRIPTION
       The "URI::file" class supports "URI" objects belonging to the file URI
       scheme.  This scheme allows us to map the conventional file names found
       on various computer systems to the URI name space, see RFC 8089
       <https://www.rfc-editor.org/rfc/rfc8089.html>.

       If you simply want to construct file URI objects from URI strings, use
       the normal "URI" constructor.  If you want to construct file URI
       objects from the actual file names used by various systems, then use
       one of the following "URI::file" constructors:

       $u = URI::file->new( $filename, [$os] )
           Maps  a file name to the file: URI name space, creates a URI object
           and returns it.  The $filename is interpreted as belonging  to  the
           indicated  operating  system  ($os), which defaults to the value of
           the  $^O  variable.   The  $filename  can  be  either  absolute  or
           relative,  and  the  corresponding  type  of  URI object for $os is
           returned.

       $u = URI::file->new_abs( $filename, [$os] )
           Same as URI::file->new,  but  makes  sure  that  the  URI  returned
           represents  an  absolute  file  name.  If the $filename argument is
           relative, then  the  name  is  resolved  relative  to  the  current
           directory, i.e. this constructor is really the same as:

             URI::file->new($filename)->abs(URI::file->cwd);

       $u = URI::file->cwd
           Returns  a  file URI that represents the current working directory.
           See Cwd.

       The following methods are supported for file URI (in  addition  to  the
       common and generic methods described in URI):

       $u->file( [$os] )
           Returns  a  file name.  It maps from the URI name space to the file
           name space of the indicated operating system.

           It might return "undef" if the name can not be represented  in  the
           indicated file system.

       $u->dir( [$os] )
           Some systems use a different form for names of directories than for
           plain  files.  Use this method if you know you want to use the name
           for a directory.

       The "URI::file" module can be used to map generic file names  to  names
       suitable  for  the  current  system.   As  such,  it can work as a nice
       replacement for the "File::Spec" module.  For instance,  the  following
       code  translates the UNIX-style file name Foo/Bar.pm to a name suitable
       for the local system:

         $file = URI::file->new("Foo/Bar.pm", "unix")->file;
         die "Can't map filename Foo/Bar.pm for $^O" unless defined $file;
         open(FILE, $file) || die "Can't open '$file': $!";
         # do something with FILE

MAPPING NOTES
       Most computer systems today have hierarchically organized file systems.
       Mapping the names used in these  systems  to  the  generic  URI  syntax
       allows  us  to  work with relative file URIs that behave as they should
       when resolved using the generic algorithm for URIs  (specified  in  RFC
       3986  <https://www.rfc-editor.org/rfc/rfc3986.html>).   Mapping  a file
       name to the generic URI syntax  involves  mapping  the  path  separator
       character  to  "/"  and encoding any reserved characters that appear in
       the path segments of the file name.  If path segments consisting of the
       strings "." or ".." have a different meaning than what is specified for
       generic URIs, then these must be encoded as well.

       If the file system has device, volume or drive  specifications  as  the
       root  of  the  name  space,  then  it  makes  sense  to map them to the
       authority field of the  generic  URI  syntax.   This  makes  sure  that
       relative  URIs  can  not  be  resolved "above" them, i.e. generally how
       relative file names work in those systems.

       Another common use of the authority field is  to  encode  the  host  on
       which  this  file  name is valid.  The host name "localhost" is special
       and generally has the same meaning as  a  missing  or  empty  authority
       field.    This   use   is  in  conflict  with  using  it  as  a  device
       specification, but can often  be  resolved  for  device  specifications
       having characters not legal in plain host names.

       File name to URI mapping in normally not one-to-one.  There are usually
       many  URIs that map to any given file name.  For instance, an authority
       of "localhost" maps  the  same  as  a  URI  with  a  missing  or  empty
       authority.

       Example  1:  The  Mac  classic  (Mac OS 9 and earlier) used ":" as path
       separator, but not in the same way as  a  generic  URI.  ":foo"  was  a
       relative  name.   "foo:bar"  was an absolute name.  Also, path segments
       could contain the "/" character as well as the literal "." or "..".  So
       the mapping looks like this:

         Mac classic           URI
         ----------            -------------------
         :foo:bar     <==>     foo/bar
         :            <==>     ./
         ::foo:bar    <==>     ../foo/bar
         :::          <==>     ../../
         foo:bar      <==>     file:/foo/bar
         foo:bar:     <==>     file:/foo/bar/
         ..           <==>     %2E%2E
         <undef>      <==      /
         foo/         <==      file:/foo%2F
         ./foo.txt    <==      file:/.%2Ffoo.txt

       Note that if you want a relative URL, you *must* begin the path with  a
       :.  Any path that begins with [^:] is treated as absolute.

       Example  2:  The  UNIX  file system is easy to map, as it uses the same
       path separator as URIs, has a single root, and segments of "." and ".."
       have the same meaning.  URIs that have the character  "\0"  or  "/"  as
       part of any path segment can not be turned into valid UNIX file names.

         UNIX                  URI
         ----------            ------------------
         foo/bar      <==>     foo/bar
         /foo/bar     <==>     file:/foo/bar
         /foo/bar     <==      file://localhost/foo/bar
         file:         ==>     ./file:
         <undef>      <==      file:/fo%00/bar
         /            <==>     file:/

CONFIGURATION VARIABLES
       The  following  configuration variables influence how the class and its
       methods behave:

       %URI::file::OS_CLASS
           This hash maps OS identifiers to implementation classes.  You might
           want to add or modify this if you want to plug  in  your  own  file
           handler  class.   Normally  the keys should match the $^O values in
           use.

           If there is no mapping then the "Unix" implementation is used.

       $URI::file::DEFAULT_AUTHORITY
           This determines what "authority" string to include in absolute file
           URIs.  It defaults to "".  If you prefer verbose URIs you might set
           it to be "localhost".

           Setting this value to "undef" forces behaviour  compatible  to  URI
           v1.31  and earlier.  In this mode host names in UNC paths and drive
           letters are mapped to the authority component on Windows, while  we
           produce authority-less URIs on Unix.

SEE ALSO
       URI, File::Spec, perlport

COPYRIGHT
       Copyright 1995-1998,2004 Gisle Aas.

       This library is free software; you can redistribute it and/or modify it
       under the same terms as Perl itself.

perl v5.38.2                      2024-02-14                    URI::file(3pm)

Generated by dwww version 1.16 on Tue Dec 16 17:07:37 CET 2025.