use strict; | |
use Test; | |
use Cwd qw(cwd); | |
use Win32; | |
BEGIN { | |
unless (defined &Win32::BuildNumber && Win32::BuildNumber() >= 820 or $] >= 5.008009) { | |
print "1..0 # Skip: Needs ActivePerl 820 or Perl 5.8.9 or later\n"; | |
exit 0; | |
} | |
if ((((Win32::FsType())[1] & 4) == 0) || (Win32::FsType() =~ /^FAT/)) { | |
print "1..0 # Skip: Filesystem doesn't support Unicode\n"; | |
exit 0; | |
} | |
unless ((Win32::GetOSVersion())[1] > 4) { | |
print "1..0 # Skip: Unicode support requires Windows 2000 or later\n"; | |
exit 0; | |
} | |
} | |
my $home = Win32::GetCwd(); | |
my $cwd = cwd(); # may be a Cygwin path | |
my $dir = "Foo \x{394}\x{419} Bar \x{5E7}\x{645} Baz"; | |
my $file = "$dir\\xyzzy \x{394}\x{419} plugh \x{5E7}\x{645}"; | |
sub cleanup { | |
chdir($home); | |
my $ansi = Win32::GetANSIPathName($file); | |
unlink($ansi) if -f $ansi; | |
$ansi = Win32::GetANSIPathName($dir); | |
rmdir($ansi) if -d $ansi; | |
} | |
cleanup(); | |
END { cleanup() } | |
plan test => 12; | |
# Create Unicode directory | |
Win32::CreateDirectory($dir); | |
ok(-d Win32::GetANSIPathName($dir)); | |
# Create Unicode file | |
Win32::CreateFile($file); | |
ok(-f Win32::GetANSIPathName($file)); | |
# readdir() returns ANSI form of Unicode filename | |
ok(opendir(my $dh, Win32::GetANSIPathName($dir))); | |
while ($_ = readdir($dh)) { | |
next if /^\./; | |
ok($file, Win32::GetLongPathName("$dir\\$_")); | |
} | |
closedir($dh); | |
# Win32::GetLongPathName() of the absolute path restores the Unicode dir name | |
my $full = Win32::GetFullPathName($dir); | |
my $long = Win32::GetLongPathName($full); | |
ok($long, Win32::GetLongPathName($home)."\\$dir"); | |
# We can Win32::SetCwd() into the Unicode directory | |
ok(Win32::SetCwd($dir)); | |
my $w32dir = Win32::GetCwd(); | |
# cwd() also returns a usable ANSI directory name | |
my $subdir = cwd(); | |
# change back to home directory to make sure relative paths | |
# in @INC continue to work | |
ok(chdir($home)); | |
ok(Win32::GetCwd(), $home); | |
ok(Win32::GetLongPathName($w32dir), $long); | |
# cwd() on Cygwin returns a mapped path that we need to translate | |
# back to a Windows path. Invoking `cygpath` on $subdir doesn't work. | |
if ($^O eq "cygwin") { | |
$subdir = Cygwin::posix_to_win_path($subdir, 1); | |
} | |
$subdir =~ s,/,\\,g; | |
ok(Win32::GetLongPathName($subdir), $long); | |
# We can chdir() into the Unicode directory if we use the ANSI name | |
ok(chdir(Win32::GetANSIPathName($dir))); | |
ok(Win32::GetLongPathName(Win32::GetCwd()), $long); |