~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[].

yesh i know :o

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 Function
It's hacky, but it should work.

you running DOS? O_o


Nope, 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)