~1 paths
BlitzMax Forums/BlitzMax Programming/~1 paths
| ||
| For some reason, blitzmax doesn't like paths with ~1 in them: "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ssftmp\" Is there a way to convert the path to its full name? |
| ||
| ~ is the escape character in BlitzMax. Use ~~ to represent ~. |
| ||
| I'm getting these strings at runtime not at compile time, and they are different depending on user, blitzmax only replaces escape chars at compile time. EDIT: example:
Global temp_dir:String = getenv_("temp")
DebugLog temp_dir' on my computer i receive "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp"
|
| ||
Here's what I have so far.. but it doesn't work.
DebugLog GetFullPath(getenv_("temp"))
Function GetFullPath:String(shortpath:String)
Local lngpath:Byte Ptr, size:Int = Len(shortpath)
GetLongPathNameW(shortpath, lngpath, 1024)
Return String.fromcstring(lngpath)
End Function
Extern "win32"
Function GetLongPathNameW(lpzshortpath:String, lpzlongpath:Byte Ptr, cchbuff:Int) = "GetLongPathNameW@12"
End Extern
EDIT: found this code by leadwerks (for b+) Function NiceFileName$(file$) size = Len(file) + 100 temp = CreateBank(size) GetShortPathName(file$, temp, size) file$ = PeekString(temp, 0) GetLongPathName(file$, temp, size) s$ = PeekString(temp, 0) FreeBank temp Return s End Function I am fairly certain there is a way in max to do it without using a bank, it just hasn't come to me yet :/ |
| ||
Global temp_dir:String = getenv_("temp")
temp_dir = Replace(temp_dir , "~" , "~~")
Doesn't that work ? |
| ||
| Huh? Ok let me explain this.. This is a short path "C:\DOCUME~1\ADMINI~1\LOCALS~1\" (6 chars then a '~1'; Generally used for programs that accept appargs, the args are separated by spaces, thus a path must not have spaces in it.) This is the above, but in full path format "C:\DOCUMENTS AND SETTINGS\ADMINISTRATOR\LOCAL SETTINGS\" (This is what I am trying to get, from a path string determined at runtime, which may vary from computer to computer.) P.S. Escape sequences are only valid/used at compile time, not runtime (and if they were debuglog should have an error when trying to print temp_dir, because as far as I know ~1 is not a valid escape seq), and have nothing to do with what i am attempting to achieve. |
| ||
Try this
Print GetFullPath(getenv_("temp"))
Function GetFullPath:String( shortpath:String)
Local buf:Short[1024]
GetLongPathNameW( shortpath, buf, buf.Length)
Return String.FromWString(buf)
EndFunction
Extern "win32"
Function GetLongPathNameW( lpzshortpath$w, lpzlongpath:Short Ptr, cchbuff:Int)
EndExtern
|
| ||
| Works! thanks. |
| ||
| Generally used for programs that accept appargs, the args are separated by spaces, thus a path must not have spaces in it.) Actually -- if you put an argument within quotes then you can have spaces: program.exe something "c:\program files\something\whatever.dat" and the entire c:\program files\something\whatever.dat will still end up in a single AppArgs[]. |
| ||
| Yes, I know. |
| ||
| I'm more curious why you're getting this path format in the first place... you running DOS? O_o |
| ||
In the event that you can't use the Win32 function (E.g., for some reason you use these paths under Linux or MacOS), try this.Function LongPath$(sp$)
Local spa$[] = sp.Replace("/","\").Split("\")
Local con$[]
Local spp$ = ""
Local s$,si%
Local po$
For Local i% = 1 To spa.Length-1
spp :+ spa[i-1]+"\"
If spa[i].Find("~~") = -1 Then
Continue
EndIf
s = spa[i].ToLower()[..spa[i].Length-2]
si = Int(spa[i][spa[i].Length-1..])
con = LoadDir( spp )
For Local p$ = EachIn con
po = p
p = p.Replace(" ","").ToLower()[..6]
If p = s Then
si :- 1
If si = 0 Then
spa[i] = po
Exit
EndIf
EndIf
Next
Next
spp :+ spa[spa.length-1]
Return spp
End FunctionIt's hacky, but it should work. |
| ||
| you running DOS? O_o Nope, I'm getting an env variable that is in dos format though..Figured I might as well keep support in case it was like that on other computers. |
| ||
| Are you running on abandoned windows versions (Win98 / WinME) that you are getting such strange stuff. I always thought since Windows doesn't have a Dos layer underneath anymore, the 8.3 naming storage is only for 16bit fallback capabilities, but not used by itself (I actually even disabled the storage of the 8.3 namings) |