There may be a simpler way to "DOSify" the file name but this works for me. There's a Win32 API call
GetShortPathName that returns the DOSified path name. You can call it from perl using
Win32::API. The prototype is
DWORD GetShortPathName(
LPCTSTR lpszLongPath, // null-terminated path string
LPTSTR lpszShortPath, // short form buffer
DWORD cchBuffer // size of short form buffer
);
The equivalent call in perl can be written like this:
use Win32::API;
#import the function
my $GetShortPathName = new Win32::API("kernel32","GetShortPathName",[
+P,P,N ],N);
if (not defined $GetShortPathName) {
die "could not import GetShortPathName";
}
#the name we want to convert
$longname = "C:\\Program Files\\Microsoft Office\\Office\\OLREAD9.TXT"
+;
#create a string big enough to hold the shortname
$shortname = " " x 80;
#retval will be length of the DOSified short name
$retval = $GetShortPathName->Call($longname,$shortname,80);
#trim the trailing blanks
#recall that $shortname = " " x 80
#and retval is the length of the name returned by GetShortPathName
$shortname = substr($shortname,0,$retval);
print "longname = \n\"$longname\", \nshortname = \n\"$shortname\"";
On my system, this returns
C:\temp>perl shortname.pl
longname =
"C:\Program Files\Microsoft Office\Office\OLREAD9.TXT",
shortname =
"C:\PROGRA~1\MICROS~3\Office\OLREAD9.TXT"
C:\temp>