#!/usr/bin/perl -w use 5.011; ## inspired by https://perlmonks.org/?node_id=1223819 ## my old link to a junction post => https://perlmonks.org/?node_id=1178059 ## found https://github.com/dagolden/Path-Tiny/issues/160 (which is where these functions came from) ## added the -d and -l tests use Path::Tiny; use Win32API::File qw'GetFileAttributes :FILE_ATTRIBUTE_'; for my $p (glob('C:/Users/tblaz/*'), glob('C:/Strawberry/*') ) { print is_junction($p) ? "J" : " "; print -d($p) ? "d" : " "; print -l($p) ? "l" : " "; #print f32attr($p); #print isjunc($p) ? " j " : " "; print " $p\n" } sub is_junction { my ($dir) = @_; state $last_parent; state $junction_by; my $path = path($dir); if (! $path->is_dir || $path->is_rootdir) { return 0; } if (! defined $last_parent || $path->parent ne $last_parent) { $junction_by = { map { $_ => 1 } list_junctions($path->parent) }; use Data::Dumper; print Dumper $junction_by; no Data::Dumper; $last_parent = $path->parent; } return exists $junction_by->{$path->basename}; } sub list_junctions { my ($dir) = @_; my $path = path($dir); if (! $path->is_dir) { return (); } my $cmd = sprintf 'dir /AL /B "%s" 2>&1', $path->canonpath; my @lines = `$cmd`; chomp @lines; if ($? >> 8) { if ($lines[0] eq 'File Not Found') { return (); } else { die "Failed to execute: $cmd"; } } return @lines; } __END__