diff options
Diffstat (limited to 'README')
-rw-r--r-- | README | 970 |
1 files changed, 970 insertions, 0 deletions
@@ -0,0 +1,970 @@ +NAME + Path::Tiny - File path utility + +VERSION + version 0.070 + +SYNOPSIS + use Path::Tiny; + + # creating Path::Tiny objects + + $dir = path("/tmp"); + $foo = path("foo.txt"); + + $subdir = $dir->child("foo"); + $bar = $subdir->child("bar.txt"); + + # stringifies as cleaned up path + + $file = path("./foo.txt"); + print $file; # "foo.txt" + + # reading files + + $guts = $file->slurp; + $guts = $file->slurp_utf8; + + @lines = $file->lines; + @lines = $file->lines_utf8; + + ($head) = $file->lines( {count => 1} ); + ($tail) = $file->lines( {count => -1} ); + + # writing files + + $bar->spew( @data ); + $bar->spew_utf8( @data ); + + # reading directories + + for ( $dir->children ) { ... } + + $iter = $dir->iterator; + while ( my $next = $iter->() ) { ... } + +DESCRIPTION + This module provide a small, fast utility for working with file paths. + It is friendlier to use than File::Spec and provides easy access to + functions from several other core file handling modules. It aims to be + smaller and faster than many alternatives on CPAN while helping people + do many common things in consistent and less error-prone ways. + + Path::Tiny does not try to work for anything except Unix-like and Win32 + platforms. Even then, it might break if you try something particularly + obscure or tortuous. (Quick! What does this mean: + "///../../..//./././a//b/.././c/././"? And how does it differ on Win32?) + + All paths are forced to have Unix-style forward slashes. Stringifying + the object gives you back the path (after some clean up). + + File input/output methods "flock" handles before reading or writing, as + appropriate (if supported by the platform). + + The *_utf8 methods ("slurp_utf8", "lines_utf8", etc.) operate in raw + mode. On Windows, that means they will not have CRLF translation from + the ":crlf" IO layer. Installing Unicode::UTF8 0.58 or later will speed + up *_utf8 situations in many cases and is highly recommended. + +CONSTRUCTORS + path + $path = path("foo/bar"); + $path = path("/tmp", "file.txt"); # list + $path = path("."); # cwd + $path = path("~user/file.txt"); # tilde processing + + Constructs a "Path::Tiny" object. It doesn't matter if you give a file + or directory path. It's still up to you to call directory-like methods + only on directories and file-like methods only on files. This function + is exported automatically by default. + + The first argument must be defined and have non-zero length or an + exception will be thrown. This prevents subtle, dangerous errors with + code like "path( maybe_undef() )->remove_tree". + + If the first component of the path is a tilde ('~') then the component + will be replaced with the output of "glob('~')". If the first component + of the path is a tilde followed by a user name then the component will + be replaced with output of "glob('~username')". Behaviour for + non-existent users depends on the output of "glob" on the system. + + On Windows, if the path consists of a drive identifier without a path + component ("C:" or "D:"), it will be expanded to the absolute path of + the current directory on that volume using "Cwd::getdcwd()". + + If called with a single "Path::Tiny" argument, the original is returned + unless the original is holding a temporary file or directory reference + in which case a stringified copy is made. + + $path = path("foo/bar"); + $temp = Path::Tiny->tempfile; + + $p2 = path($path); # like $p2 = $path + $t2 = path($temp); # like $t2 = path( "$temp" ) + + This optimizes copies without proliferating references unexpectedly if a + copy is made by code outside your control. + + Current API available since 0.017. + + new + $path = Path::Tiny->new("foo/bar"); + + This is just like "path", but with method call overhead. (Why would you + do that?) + + Current API available since 0.001. + + cwd + $path = Path::Tiny->cwd; # path( Cwd::getcwd ) + $path = cwd; # optional export + + Gives you the absolute path to the current directory as a "Path::Tiny" + object. This is slightly faster than "path(".")->absolute". + + "cwd" may be exported on request and used as a function instead of as a + method. + + Current API available since 0.018. + + rootdir + $path = Path::Tiny->rootdir; # / + $path = rootdir; # optional export + + Gives you "File::Spec->rootdir" as a "Path::Tiny" object if you're too + picky for "path("/")". + + "rootdir" may be exported on request and used as a function instead of + as a method. + + Current API available since 0.018. + + tempfile, tempdir + $temp = Path::Tiny->tempfile( @options ); + $temp = Path::Tiny->tempdir( @options ); + $temp = tempfile( @options ); # optional export + $temp = tempdir( @options ); # optional export + + "tempfile" passes the options to "File::Temp->new" and returns a + "Path::Tiny" object with the file name. The "TMPDIR" option is enabled + by default. + + The resulting "File::Temp" object is cached. When the "Path::Tiny" + object is destroyed, the "File::Temp" object will be as well. + + "File::Temp" annoyingly requires you to specify a custom template in + slightly different ways depending on which function or method you call, + but "Path::Tiny" lets you ignore that and can take either a leading + template or a "TEMPLATE" option and does the right thing. + + $temp = Path::Tiny->tempfile( "customXXXXXXXX" ); # ok + $temp = Path::Tiny->tempfile( TEMPLATE => "customXXXXXXXX" ); # ok + + The tempfile path object will be normalized to have an absolute path, + even if created in a relative directory using "DIR". + + "tempdir" is just like "tempfile", except it calls "File::Temp->newdir" + instead. + + Both "tempfile" and "tempdir" may be exported on request and used as + functions instead of as methods. + + Note: for tempfiles, the filehandles from File::Temp are closed and not + reused. This is not as secure as using File::Temp handles directly, but + is less prone to deadlocks or access problems on some platforms. Think + of what "Path::Tiny" gives you to be just a temporary file name that + gets cleaned up. + + Current API available since 0.018. + +METHODS + absolute + $abs = path("foo/bar")->absolute; + $abs = path("foo/bar")->absolute("/tmp"); + + Returns a new "Path::Tiny" object with an absolute path (or itself if + already absolute). Unless an argument is given, the current directory is + used as the absolute base path. The argument must be absolute or you + won't get an absolute result. + + This will not resolve upward directories ("foo/../bar") unless + "canonpath" in File::Spec would normally do so on your platform. If you + need them resolved, you must call the more expensive "realpath" method + instead. + + On Windows, an absolute path without a volume component will have it + added based on the current drive. + + Current API available since 0.001. + + append, append_raw, append_utf8 + path("foo.txt")->append(@data); + path("foo.txt")->append(\@data); + path("foo.txt")->append({binmode => ":raw"}, @data); + path("foo.txt")->append_raw(@data); + path("foo.txt")->append_utf8(@data); + + Appends data to a file. The file is locked with "flock" prior to + writing. An optional hash reference may be used to pass options. Valid + options are: + + * "binmode": passed to "binmode()" on the handle used for writing. + + * "truncate": truncates the file after locking and before appending + + The "truncate" option is a way to replace the contents of a file in + place, unlike "spew" which writes to a temporary file and then replaces + the original (if it exists). + + "append_raw" is like "append" with a "binmode" of ":unix" for fast, + unbuffered, raw write. + + "append_utf8" is like "append" with a "binmode" of + ":unix:encoding(UTF-8)". If Unicode::UTF8 0.58+ is installed, a raw + append will be done instead on the data encoded with "Unicode::UTF8". + + Current API available since 0.060. + + assert + $path = path("foo.txt")->assert( sub { $_->exists } ); + + Returns the invocant after asserting that a code reference argument + returns true. When the assertion code reference runs, it will have the + invocant object in the $_ variable. If it returns false, an exception + will be thrown. The assertion code reference may also throw its own + exception. + + If no assertion is provided, the invocant is returned without error. + + Current API available since 0.062. + + basename + $name = path("foo/bar.txt")->basename; # bar.txt + $name = path("foo.txt")->basename('.txt'); # foo + $name = path("foo.txt")->basename(qr/.txt/); # foo + $name = path("foo.txt")->basename(@suffixes); + + Returns the file portion or last directory portion of a path. + + Given a list of suffixes as strings or regular expressions, any that + match at the end of the file portion or last directory portion will be + removed before the result is returned. + + Current API available since 0.054. + + canonpath + $canonical = path("foo/bar")->canonpath; # foo\bar on Windows + + Returns a string with the canonical format of the path name for the + platform. In particular, this means directory separators will be "\" on + Windows. + + Current API available since 0.001. + + child + $file = path("/tmp")->child("foo.txt"); # "/tmp/foo.txt" + $file = path("/tmp")->child(@parts); + + Returns a new "Path::Tiny" object relative to the original. Works like + "catfile" or "catdir" from File::Spec, but without caring about file or + directories. + + Current API available since 0.001. + + children + @paths = path("/tmp")->children; + @paths = path("/tmp")->children( qr/\.txt$/ ); + + Returns a list of "Path::Tiny" objects for all files and directories + within a directory. Excludes "." and ".." automatically. + + If an optional "qr//" argument is provided, it only returns objects for + child names that match the given regular expression. Only the base name + is used for matching: + + @paths = path("/tmp")->children( qr/^foo/ ); + # matches children like the glob foo* + + Current API available since 0.028. + + chmod + path("foo.txt")->chmod(0777); + path("foo.txt")->chmod("0755"); + path("foo.txt")->chmod("go-w"); + path("foo.txt")->chmod("a=r,u+wx"); + + Sets file or directory permissions. The argument can be a numeric mode, + a octal string beginning with a "0" or a limited subset of the symbolic + mode use by /bin/chmod. + + The symbolic mode must be a comma-delimited list of mode clauses. + Clauses must match "qr/\A([augo]+)([=+-])([rwx]+)\z/", which defines + "who", "op" and "perms" parameters for each clause. Unlike /bin/chmod, + all three parameters are required for each clause, multiple ops are not + allowed and permissions "stugoX" are not supported. (See File::chmod for + more complex needs.) + + Current API available since 0.053. + + copy + path("/tmp/foo.txt")->copy("/tmp/bar.txt"); + + Copies a file using File::Copy's "copy" function. Upon success, returns + the "Path::Tiny" object for the newly copied file. + + Current API available since 0.070. + + digest + $obj = path("/tmp/foo.txt")->digest; # SHA-256 + $obj = path("/tmp/foo.txt")->digest("MD5"); # user-selected + $obj = path("/tmp/foo.txt")->digest( { chunk_size => 1e6 }, "MD5" ); + + Returns a hexadecimal digest for a file. An optional hash reference of + options may be given. The only option is "chunk_size". If "chunk_size" + is given, that many bytes will be read at a time. If not provided, the + entire file will be slurped into memory to compute the digest. + + Any subsequent arguments are passed to the constructor for Digest to + select an algorithm. If no arguments are given, the default is SHA-256. + + Current API available since 0.056. + + dirname (deprecated) + $name = path("/tmp/foo.txt")->dirname; # "/tmp/" + + Returns the directory portion you would get from calling + "File::Spec->splitpath( $path->stringify )" or "." for a path without a + parent directory portion. Because File::Spec is inconsistent, the result + might or might not have a trailing slash. Because of this, this method + is deprecated. + + A better, more consistently approach is likely + "$path->parent->stringify", which will not have a trailing slash except + for a root directory. + + Deprecated in 0.056. + + exists, is_file, is_dir + if ( path("/tmp")->exists ) { ... } # -e + if ( path("/tmp")->is_dir ) { ... } # -d + if ( path("/tmp")->is_file ) { ... } # -e && ! -d + + Implements file test operations, this means the file or directory + actually has to exist on the filesystem. Until then, it's just a path. + + Note: "is_file" is not "-f" because "-f" is not the opposite of "-d". + "-f" means "plain file", excluding symlinks, devices, etc. that often + can be read just like files. + + Use "-f" instead if you really mean to check for a plain file. + + Current API available since 0.053. + + filehandle + $fh = path("/tmp/foo.txt")->filehandle($mode, $binmode); + $fh = path("/tmp/foo.txt")->filehandle({ locked => 1 }, $mode, $binmode); + $fh = path("/tmp/foo.txt")->filehandle({ exclusive => 1 }, $mode, $binmode); + + Returns an open file handle. The $mode argument must be a Perl-style + read/write mode string ("<" ,">", "<<", etc.). If a $binmode is given, + it is set during the "open" call. + + An optional hash reference may be used to pass options. + + The "locked" option governs file locking; if true, handles opened for + writing, appending or read-write are locked with "LOCK_EX"; otherwise, + they are locked with "LOCK_SH". When using "locked", ">" or "+>" modes + will delay truncation until after the lock is acquired. + + The "exclusive" option causes the open() call to fail if the file + already exists. This corresponds to the O_EXCL flag to sysopen / + open(2). "exclusive" implies "locked" and will set it for you if you + forget it. + + See "openr", "openw", "openrw", and "opena" for sugar. + + Current API available since 0.066. + + is_absolute, is_relative + if ( path("/tmp")->is_absolute ) { ... } + if ( path("/tmp")->is_relative ) { ... } + + Booleans for whether the path appears absolute or relative. + + Current API available since 0.001. + + is_rootdir + while ( ! $path->is_rootdir ) { + $path = $path->parent; + ... + } + + Boolean for whether the path is the root directory of the volume. I.e. + the "dirname" is "q[/]" and the "basename" is "q[]". + + This works even on "MSWin32" with drives and UNC volumes: + + path("C:/")->is_rootdir; # true + path("//server/share/")->is_rootdir; #true + + Current API available since 0.038. + + iterator + $iter = path("/tmp")->iterator( \%options ); + + Returns a code reference that walks a directory lazily. Each invocation + returns a "Path::Tiny" object or undef when the iterator is exhausted. + + $iter = path("/tmp")->iterator; + while ( $path = $iter->() ) { + ... + } + + The current and parent directory entries ("." and "..") will not be + included. + + If the "recurse" option is true, the iterator will walk the directory + recursively, breadth-first. If the "follow_symlinks" option is also + true, directory links will be followed recursively. There is no + protection against loops when following links. If a directory is not + readable, it will not be followed. + + The default is the same as: + + $iter = path("/tmp")->iterator( { + recurse => 0, + follow_symlinks => 0, + } ); + + For a more powerful, recursive iterator with built-in loop avoidance, + see Path::Iterator::Rule. + + See also "visit". + + Current API available since 0.016. + + lines, lines_raw, lines_utf8 + @contents = path("/tmp/foo.txt")->lines; + @contents = path("/tmp/foo.txt")->lines(\%options); + @contents = path("/tmp/foo.txt")->lines_raw; + @contents = path("/tmp/foo.txt")->lines_utf8; + + @contents = path("/tmp/foo.txt")->lines( { chomp => 1, count => 4 } ); + + Returns a list of lines from a file. Optionally takes a hash-reference + of options. Valid options are "binmode", "count" and "chomp". + + If "binmode" is provided, it will be set on the handle prior to reading. + + If a positive "count" is provided, that many lines will be returned from + the start of the file. If a negative "count" is provided, the entire + file will be read, but only "abs(count)" will be kept and returned. If + "abs(count)" exceeds the number of lines in the file, all lines will be + returned. + + If "chomp" is set, any end-of-line character sequences ("CR", "CRLF", or + "LF") will be removed from the lines returned. + + Because the return is a list, "lines" in scalar context will return the + number of lines (and throw away the data). + + $number_of_lines = path("/tmp/foo.txt")->lines; + + "lines_raw" is like "lines" with a "binmode" of ":raw". We use ":raw" + instead of ":unix" so PerlIO buffering can manage reading by line. + + "lines_utf8" is like "lines" with a "binmode" of ":raw:encoding(UTF-8)". + If Unicode::UTF8 0.58+ is installed, a raw UTF-8 slurp will be done and + then the lines will be split. This is actually faster than relying on + ":encoding(UTF-8)", though a bit memory intensive. If memory use is a + concern, consider "openr_utf8" and iterating directly on the handle. + + Current API available since 0.065. + + mkpath + path("foo/bar/baz")->mkpath; + path("foo/bar/baz")->mkpath( \%options ); + + Like calling "make_path" from File::Path. An optional hash reference is + passed through to "make_path". Errors will be trapped and an exception + thrown. Returns the list of directories created or an empty list if the + directories already exist, just like "make_path". + + Current API available since 0.001. + + move + path("foo.txt")->move("bar.txt"); + + Just like "rename". + + Current API available since 0.001. + + openr, openw, openrw, opena + $fh = path("foo.txt")->openr($binmode); # read + $fh = path("foo.txt")->openr_raw; + $fh = path("foo.txt")->openr_utf8; + + $fh = path("foo.txt")->openw($binmode); # write + $fh = path("foo.txt")->openw_raw; + $fh = path("foo.txt")->openw_utf8; + + $fh = path("foo.txt")->opena($binmode); # append + $fh = path("foo.txt")->opena_raw; + $fh = path("foo.txt")->opena_utf8; + + $fh = path("foo.txt")->openrw($binmode); # read/write + $fh = path("foo.txt")->openrw_raw; + $fh = path("foo.txt")->openrw_utf8; + + Returns a file handle opened in the specified mode. The "openr" style + methods take a single "binmode" argument. All of the "open*" methods + have "open*_raw" and "open*_utf8" equivalents that use ":raw" and + ":raw:encoding(UTF-8)", respectively. + + An optional hash reference may be used to pass options. The only option + is "locked". If true, handles opened for writing, appending or + read-write are locked with "LOCK_EX"; otherwise, they are locked for + "LOCK_SH". + + $fh = path("foo.txt")->openrw_utf8( { locked => 1 } ); + + See "filehandle" for more on locking. + + Current API available since 0.011. + + parent + $parent = path("foo/bar/baz")->parent; # foo/bar + $parent = path("foo/wibble.txt")->parent; # foo + + $parent = path("foo/bar/baz")->parent(2); # foo + + Returns a "Path::Tiny" object corresponding to the parent directory of + the original directory or file. An optional positive integer argument is + the number of parent directories upwards to return. "parent" by itself + is equivalent to parent(1). + + Current API available since 0.014. + + realpath + $real = path("/baz/foo/../bar")->realpath; + $real = path("foo/../bar")->realpath; + + Returns a new "Path::Tiny" object with all symbolic links and upward + directory parts resolved using Cwd's "realpath". Compared to "absolute", + this is more expensive as it must actually consult the filesystem. + + If the parent path can't be resolved (e.g. if it includes directories + that don't exist), an exception will be thrown: + + $real = path("doesnt_exist/foo")->realpath; # dies + + However, if the parent path exists and only the last component (e.g. + filename) doesn't exist, the realpath will be the realpath of the parent + plus the non-existent last component: + + $real = path("./aasdlfasdlf")->realpath; # works + + The underlying Cwd module usually worked this way on Unix, but died on + Windows (and some Unixes) if the full path didn't exist. As of version + 0.064, it's safe to use anywhere. + + Current API available since 0.001. + + relative + $rel = path("/tmp/foo/bar")->relative("/tmp"); # foo/bar + + Returns a "Path::Tiny" object with a relative path name. Given the + trickiness of this, it's a thin wrapper around "File::Spec->abs2rel()". + + Current API available since 0.001. + + remove + path("foo.txt")->remove; + + This is just like "unlink", except for its error handling: if the path + does not exist, it returns false; if deleting the file fails, it throws + an exception. + + Current API available since 0.012. + + remove_tree + # directory + path("foo/bar/baz")->remove_tree; + path("foo/bar/baz")->remove_tree( \%options ); + path("foo/bar/baz")->remove_tree( { safe => 0 } ); # force remove + + Like calling "remove_tree" from File::Path, but defaults to "safe" mode. + An optional hash reference is passed through to "remove_tree". Errors + will be trapped and an exception thrown. Returns the number of + directories deleted, just like "remove_tree". + + If you want to remove a directory only if it is empty, use the built-in + "rmdir" function instead. + + rmdir path("foo/bar/baz/"); + + Current API available since 0.013. + + sibling + $foo = path("/tmp/foo.txt"); + $sib = $foo->sibling("bar.txt"); # /tmp/bar.txt + $sib = $foo->sibling("baz", "bam.txt"); # /tmp/baz/bam.txt + + Returns a new "Path::Tiny" object relative to the parent of the + original. This is slightly more efficient than + "$path->parent->child(...)". + + Current API available since 0.058. + + slurp, slurp_raw, slurp_utf8 + $data = path("foo.txt")->slurp; + $data = path("foo.txt")->slurp( {binmode => ":raw"} ); + $data = path("foo.txt")->slurp_raw; + $data = path("foo.txt")->slurp_utf8; + + Reads file contents into a scalar. Takes an optional hash reference may + be used to pass options. The only option is "binmode", which is passed + to "binmode()" on the handle used for reading. + + "slurp_raw" is like "slurp" with a "binmode" of ":unix" for a fast, + unbuffered, raw read. + + "slurp_utf8" is like "slurp" with a "binmode" of + ":unix:encoding(UTF-8)". If Unicode::UTF8 0.58+ is installed, a raw + slurp will be done instead and the result decoded with "Unicode::UTF8". + This is just as strict and is roughly an order of magnitude faster than + using ":encoding(UTF-8)". + + Note: "slurp" and friends lock the filehandle before slurping. If you + plan to slurp from a file created with File::Temp, be sure to close + other handles or open without locking to avoid a deadlock: + + my $tempfile = File::Temp->new(EXLOCK => 0); + my $guts = path($tempfile)->slurp; + + Current API available since 0.004. + + spew, spew_raw, spew_utf8 + path("foo.txt")->spew(@data); + path("foo.txt")->spew(\@data); + path("foo.txt")->spew({binmode => ":raw"}, @data); + path("foo.txt")->spew_raw(@data); + path("foo.txt")->spew_utf8(@data); + + Writes data to a file atomically. The file is written to a temporary + file in the same directory, then renamed over the original. An optional + hash reference may be used to pass options. The only option is + "binmode", which is passed to "binmode()" on the handle used for + writing. + + "spew_raw" is like "spew" with a "binmode" of ":unix" for a fast, + unbuffered, raw write. + + "spew_utf8" is like "spew" with a "binmode" of ":unix:encoding(UTF-8)". + If Unicode::UTF8 0.58+ is installed, a raw spew will be done instead on + the data encoded with "Unicode::UTF8". + + NOTE: because the file is written to a temporary file and then renamed, + the new file will wind up with permissions based on your current umask. + This is a feature to protect you from a race condition that would + otherwise give different permissions than you might expect. If you + really want to keep the original mode flags, use "append" with the + "truncate" option. + + Current API available since 0.011. + + stat, lstat + $stat = path("foo.txt")->stat; + $stat = path("/some/symlink")->lstat; + + Like calling "stat" or "lstat" from File::stat. + + Current API available since 0.001. + + stringify + $path = path("foo.txt"); + say $path->stringify; # same as "$path" + + Returns a string representation of the path. Unlike "canonpath", this + method returns the path standardized with Unix-style "/" directory + separators. + + Current API available since 0.001. + + subsumes + path("foo/bar")->subsumes("foo/bar/baz"); # true + path("/foo/bar")->subsumes("/foo/baz"); # false + + Returns true if the first path is a prefix of the second path at a + directory boundary. + + This does not resolve parent directory entries ("..") or symlinks: + + path("foo/bar")->subsumes("foo/bar/../baz"); # true + + If such things are important to you, ensure that both paths are resolved + to the filesystem with "realpath": + + my $p1 = path("foo/bar")->realpath; + my $p2 = path("foo/bar/../baz")->realpath; + if ( $p1->subsumes($p2) ) { ... } + + Current API available since 0.048. + + touch + path("foo.txt")->touch; + path("foo.txt")->touch($epoch_secs); + + Like the Unix "touch" utility. Creates the file if it doesn't exist, or + else changes the modification and access times to the current time. If + the first argument is the epoch seconds then it will be used. + + Returns the path object so it can be easily chained with other methods: + + # won't die if foo.txt doesn't exist + $content = path("foo.txt")->touch->slurp; + + Current API available since 0.015. + + touchpath + path("bar/baz/foo.txt")->touchpath; + + Combines "mkpath" and "touch". Creates the parent directory if it + doesn't exist, before touching the file. Returns the path object like + "touch" does. + + Current API available since 0.022. + + visit + path("/tmp")->visit( \&callback, \%options ); + + Wraps the "iterator" method to execute a callback for each directory + entry. It returns a hash reference with any state accumulated during + iteration. + + The options are the same as for "iterator": "recurse" and + "follow_symlinks". Both default to false. + + The callback function will receive a "Path::Tiny" object as the first + argument and a hash reference to accumulate state as the second + argument. For example: + + # collect files sizes + my $sizes = path("/tmp")->visit( + sub { + my ($path, $state) = @_; + return if $path->is_dir; + $state->{$path} = -s $path; + }, + { recurse => 1 } + ); + + For convenience, the "Path::Tiny" object will also be locally aliased as + the $_ global variable: + + # print paths matching /foo/ + path("/tmp")->visit( sub { say if /foo/ }, { recurse => 1} ); + + If the callback returns a reference to a false scalar value, iteration + will terminate. This is not the same as "pruning" a directory search; + this just stops all iteration and returns the state hash reference. + + # find up to 10 files larger than 100K + my $files = path("/tmp")->visit( + sub { + my ($path, $state) = @_; + $state->{$path}++ if -s $path > 102400 + return \0 if keys %$state == 10; + }, + { recurse => 1 } + ); + + If you want more flexible iteration, use a module like + Path::Iterator::Rule. + + Current API available since 0.062. + + volume + $vol = path("/tmp/foo.txt")->volume; # "" + $vol = path("C:/tmp/foo.txt")->volume; # "C:" + + Returns the volume portion of the path. This is equivalent equivalent to + what File::Spec would give from "splitpath" and thus usually is the + empty string on Unix-like operating systems or the drive letter for an + absolute path on "MSWin32". + + Current API available since 0.001. + +EXCEPTION HANDLING + Simple usage errors will generally croak. Failures of underlying Perl + functions will be thrown as exceptions in the class "Path::Tiny::Error". + + A "Path::Tiny::Error" object will be a hash reference with the following + fields: + + * "op" — a description of the operation, usually function call and any + extra info + + * "file" — the file or directory relating to the error + + * "err" — hold $! at the time the error was thrown + + * "msg" — a string combining the above data and a Carp-like short + stack trace + + Exception objects will stringify as the "msg" field. + +CAVEATS + File locking + If flock is not supported on a platform, it will not be used, even if + locking is requested. + + See additional caveats below. + + NFS and BSD + On BSD, Perl's flock implementation may not work to lock files on an NFS + filesystem. Path::Tiny has some heuristics to detect this and will warn + once and let you continue in an unsafe mode. If you want this failure to + be fatal, you can fatalize the 'flock' warnings category: + + use warnings FATAL => 'flock'; + + AIX and locking + AIX requires a write handle for locking. Therefore, calls that normally + open a read handle and take a shared lock instead will open a read-write + handle and take an exclusive lock. If the user does not have write + permission, no lock will be used. + + utf8 vs UTF-8 + All the *_utf8 methods use ":encoding(UTF-8)" -- either as + ":unix:encoding(UTF-8)" (unbuffered) or ":raw:encoding(UTF-8)" + (buffered) -- which is strict against the Unicode spec and disallows + illegal Unicode codepoints or UTF-8 sequences. + + Unfortunately, ":encoding(UTF-8)" is very, very slow. If you install + Unicode::UTF8 0.58 or later, that module will be used by some *_utf8 + methods to encode or decode data after a raw, binary input/output + operation, which is much faster. + + If you need the performance and can accept the security risk, + "slurp({binmode => ":unix:utf8"})" will be faster than + ":unix:encoding(UTF-8)" (but not as fast as "Unicode::UTF8"). + + Note that the *_utf8 methods read in raw mode. There is no CRLF + translation on Windows. If you must have CRLF translation, use the + regular input/output methods with an appropriate binmode: + + $path->spew_utf8($data); # raw + $path->spew({binmode => ":encoding(UTF-8)"}, $data; # LF -> CRLF + + Consider PerlIO::utf8_strict for a faster PerlIO layer alternative to + ":encoding(UTF-8)", though it does not appear to be as fast as the + "Unicode::UTF8" approach. + + Default IO layers and the open pragma + If you have Perl 5.10 or later, file input/output methods ("slurp", + "spew", etc.) and high-level handle opening methods ( "filehandle", + "openr", "openw", etc. ) respect default encodings set by the "-C" + switch or lexical open settings of the caller. For UTF-8, this is almost + certainly slower than using the dedicated "_utf8" methods if you have + Unicode::UTF8. + +TYPE CONSTRAINTS AND COERCION + A standard MooseX::Types library is available at + MooseX::Types::Path::Tiny. A Type::Tiny equivalent is available as + Types::Path::Tiny. + +SEE ALSO + These are other file/path utilities, which may offer a different feature + set than "Path::Tiny". + + * File::chmod + + * File::Fu + + * IO::All + + * Path::Class + + These iterators may be slightly faster than the recursive iterator in + "Path::Tiny": + + * Path::Iterator::Rule + + * File::Next + + There are probably comparable, non-Tiny tools. Let me know if you want + me to add a module to the list. + + This module was featured in the 2013 Perl Advent Calendar + <http://www.perladvent.org/2013/2013-12-18.html>. + +SUPPORT + Bugs / Feature Requests + Please report any bugs or feature requests through the issue tracker at + <https://github.com/dagolden/Path-Tiny/issues>. You will be notified + automatically of any progress on your issue. + + Source Code + This is open source software. The code repository is available for + public review and contribution under the terms of the license. + + <https://github.com/dagolden/Path-Tiny> + + git clone https://github.com/dagolden/Path-Tiny.git + +AUTHOR + David Golden <dagolden@cpan.org> + +CONTRIBUTORS + * Alex Efros <powerman@powerman.name> + + * Chris Williams <bingos@cpan.org> + + * David Steinbrunner <dsteinbrunner@pobox.com> + + * Doug Bell <madcityzen@gmail.com> + + * Gabor Szabo <szabgab@cpan.org> + + * Gabriel Andrade <gabiruh@gmail.com> + + * George Hartzell <hartzell@cpan.org> + + * Geraud Continsouzas <geraud@scsi.nc> + + * Goro Fuji <gfuji@cpan.org> + + * Graham Knop <haarg@haarg.org> + + * James Hunt <james@niftylogic.com> + + * Karen Etheridge <ether@cpan.org> + + * Martin Kjeldsen <mk@bluepipe.dk> + + * Michael G. Schwern <mschwern@cpan.org> + + * Philippe Bruhat (BooK) <book@cpan.org> + + * Regina Verbae <regina-verbae@users.noreply.github.com> + + * regina-verbae <regina-verbae@users.noreply.github.com> + + * Smylers <Smylers@stripey.com> + + * Tatsuhiko Miyagawa <miyagawa@bulknews.net> + + * Toby Inkster <tobyink@cpan.org> + + * Yanick Champoux <yanick@babyl.dyndns.org> + + * 김도형 - Keedi Kim <keedi@cpan.org> + +COPYRIGHT AND LICENSE + This software is Copyright (c) 2014 by David Golden. + + This is free software, licensed under: + + The Apache License, Version 2.0, January 2004 + |