- SplitPath alternative that directly returns one part of the path
Code: Select all
q:: ;get file part / convert file path
vPath := "C:\A\B\C\D\E\NameNoExt.Ext"
vPath := A_AhkPath
vPath := A_ScriptFullPath
vPath := Format("{:U}", vPath)
;vList := "p,n,d,x,nnx,dr,pnx,d0,d1,d2,d3,d4,d5,d6,d7,ps,pl,pf,pc"
vList := "p,n,d,x,nnx,dr,pnx,ps,pl,pf,pc,d-7,d-6,d-5,d-4,d-3,d-2,d-1,d0,d1,d2,d3,d4,d5,d6,d7,p-8,p-7,p-6,p-5,p-4,p-3,p-2,p-1,p0,p1,p2,p3,p4,p5,p6,p7,p8"
vOutput := ""
Loop, Parse, vList, % ","
{
vPart := A_LoopField
vOutput .= Trim(vPart "`t" JEE_FileGetPart(vPath, vPart)) "`r`n"
}
Clipboard := vOutput
MsgBox, % vOutput
return
;==================================================
JEE_FileGetPart(vPath, vPart)
{
local
static vIsV1 := InStr(1, 1,, 0)
SplitPath, vPath, vName, vDir, vExt, vNameNoExt, vDrive
if (vPart = "p") || (vPart = "path") ;path
return vPath
else if (vPart = "n") || (vPart = "name") ;name
return vName
else if (vPart = "d") || (vPart = "dir") ;directory
return vDir
else if (vPart = "e") || (vPart = "x") || (vPart = "ext") ;extension
return vExt
else if (vPart = "nne") || (vPart = "nnx") || (vPart = "NameNoExt") ;name no extension
return vNameNoExt
else if (vPart = "dr") || (vPart = "drive") ;drive
return vDrive
else if (vPart = "pne") || (vPart = "pnx") || (vPart = "PathNoExt") ;path no extension
return vDir "\" vNameNoExt
else if (vPart ~= "^-?\d+$") ;nth part e.g. -3, 3
&& !(vPart = 0)
{
if (vPart < 0)
{
vPart := StrSplit(vPath, "\").Length() + 1 + vPart
if (vPart < 1)
return
}
return StrSplit(vPath, "\")[vPart+0]
}
else if (vPart = "d0") || (vPart = "p0") ;handle invalid options: 'd0'/'p0'
|| (vPart = "d-0") || (vPart = "p-0") ;handle invalid options: 'd-0'/'p-0'
return
else if (vPart ~= "^[Dd]\d+$") ;first n parts of directory e.g. 'd3'
{
if (vPos := InStr(vDir "\", "\", 0, 1, SubStr(vPart, 2)))
return SubStr(vDir, 1, vPos-1)
else
return vDir
}
else if (vPart ~= "^[Pp]\d+$") ;first n parts of path e.g. 'p3'
{
if (vPos := InStr(vPath "\", "\", 0, 1, SubStr(vPart, 2)))
return SubStr(vPath, 1, vPos-1)
else
return vPath
}
else if (vPart ~= "^[Dd]-\d+$") ;last n parts of directory e.g. 'd-3'
{
if (vPos := InStr(vDir, "\", 0, vIsV1-1, SubStr(vPart, 3)))
return SubStr(vDir, vPos+1)
else
return vDir
}
else if (vPart ~= "^[Pp]-\d+$") ;last n parts of path e.g. 'p-3' (note: 'p-1' is equivalent to 'n')
{
if (vPos := InStr(vPath, "\", 0, vIsV1-1, SubStr(vPart, 3)))
return SubStr(vPath, vPos+1)
else
return vPath
}
else if (vPart = "ps") ;path (short)
{
vSize := DllCall("kernel32\GetShortPathName", Str,"\\?\" vPath, Ptr,0, UInt,0, UInt)
VarSetCapacity(vPath2, vSize*2, 0)
if DllCall("kernel32\GetShortPathName", Str,"\\?\" vPath, Str,vPath2, UInt,vSize, UInt)
return (SubStr(vPath2, 1, 4) = "\\?\") ? SubStr(vPath2, 5) : vPath2
}
else if (vPart = "pl") ;path (long)
{
vSize := DllCall("kernel32\GetLongPathName", Str,"\\?\" vPath, Ptr,0, UInt,0, UInt)
VarSetCapacity(vPath2, vSize*2, 0)
if DllCall("kernel32\GetLongPathName", Str,"\\?\" vPath, Str,vPath2, UInt,vSize, UInt)
return (SubStr(vPath2, 1, 4) = "\\?\") ? SubStr(vPath2, 5) : vPath2
}
else if (vPart = "pf") ;path (full)
{
vSize := DllCall("kernel32\GetFullPathName", Str,"\\?\" vPath, UInt,0, Ptr,0, PtrP,0, UInt)
VarSetCapacity(vPath2, vSize*2, 0)
if DllCall("kernel32\GetFullPathName", Str,"\\?\" vPath, UInt,vSize, Str,vPath2, PtrP,0, UInt)
return (SubStr(vPath2, 1, 4) = "\\?\") ? SubStr(vPath2, 5) : vPath2
}
else if (vPart = "pc") ;path (correct case)
{
Loop, Files, % vPath, FD
return A_LoopFileLongPath
}
}
Code: Select all
q:: ;file set part
vPath := A_AhkPath
;vPath := JEE_FileGetPart(A_AhkPath, "pne")
SplitPath, vPath, vName, vDir, vExt, vNameNoExt, vDrive
vOutput := ""
vOutput .= JEE_FileSetPart(vPath, "p", "C:\DIR\FILE.TXT") "`r`n"
vOutput .= JEE_FileSetPart(vPath, "n", "FILE.TXT") "`r`n"
vOutput .= JEE_FileSetPart(vPath, "d", "C:\DIR") "`r`n"
vOutput .= JEE_FileSetPart(vPath, "d", vDir "\SUBDIR") "`r`n" ;add subdir
vOutput .= JEE_FileSetPart(vPath, "e", "EXT") "`r`n"
vOutput .= JEE_FileSetPart(vPath, "nne", "FILE") "`r`n"
vOutput .= JEE_FileSetPart(vPath, "dr", "ZZZ:") "`r`n"
vOutput .= JEE_FileSetPart(vPath, "pne", "C:\DIR\FILE") "`r`n"
vOutput .= JEE_FileSetPart(vPath, 1, "PART") "`r`n"
vOutput .= JEE_FileSetPart(vPath, 2, "PART") "`r`n"
vOutput .= JEE_FileSetPart(vPath, 3, "PART") "`r`n"
vOutput .= JEE_FileSetPart(vPath, StrSplit(vPath, "\").Length(), "PART") "`r`n"
vOutput .= JEE_FileSetPart(vPath, StrSplit(vPath, "\").Length()+1, "PART") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, -1, "PART") "`r`n"
vOutput .= JEE_FileSetPart(vPath, -2, "PART") "`r`n"
vOutput .= JEE_FileSetPart(vPath, -3, "PART") "`r`n"
vOutput .= JEE_FileSetPart(vPath, -StrSplit(vPath, "\").Length(), "PART") "`r`n"
vOutput .= JEE_FileSetPart(vPath, -StrSplit(vPath, "\").Length()-1, "PART") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "d5", "X\X\X\X\X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "d6", "X\X\X\X\X\X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "d7", "X\X\X\X\X\X\X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "p6", "X\X\X\X\X\X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "p7", "X\X\X\X\X\X\X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "p8", "X\X\X\X\X\X\X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "d-1", "X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "d-2", "X\X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "p-1", "X") "`r`n" ;error
vOutput .= JEE_FileSetPart(vPath, "p-2", "X\X") "`r`n" ;error
Clipboard := vOutput
MsgBox, % vOutput
return
;==================================================
JEE_FileSetPart(vPath, vPart, vText)
{
local
static vIsV1 := InStr(1, 1,, 0)
SplitPath, vPath, vName, vDir, vExt, vNameNoExt, vDrive
if (vPart = "p") || (vPart = "path") ;path
return vText
else if (vPart = "n") || (vPart = "name") ;name
return vDir "\" vText
else if (vPart = "d") || (vPart = "dir") ;directory
return vText "\" vName
else if (vPart = "e") || (vPart = "x") || (vPart = "ext") ;extension
{
if InStr(vPath, ".")
return vDir "\" vNameNoExt "." vText
else
return vPath "." vText
}
else if (vPart = "nne") || (vPart = "nnx") || (vPart = "NameNoExt") ;name no extension
{
if InStr(vPath, ".")
return vDir "\" vText "." vExt
else
return vDir "\" vText
}
else if (vPart = "dr") || (vPart = "drive") ;drive
return vText SubStr(vPath, StrLen(vDrive) + 1)
else if (vPart = "pne") || (vPart = "pnx") || (vPart = "PathNoExt") ;path no extension
{
if InStr(vPath, ".")
return vText "." vExt
else
return vText
}
else if (vPart = "d0") || (vPart = "p0") ;handle invalid options: 'd0'/'p0'
|| (vPart = "d-0") || (vPart = "p-0") ;handle invalid options: 'd-0'/'p-0'
return
else if (vPart ~= "^-?\d+$") ;nth part e.g. -3, 3
&& !(vPart = 0) ;nth part
{
if (vPart < 0)
{
vPart := StrSplit(vPath, "\").Length() + 1 + vPart
if (vPart < 1)
return
}
if (vPart = 1)
vPos1 := 0
else if !(vPos1 := InStr(vPath "\", "\",,, vPart-1))
return
if !(vPos2 := InStr(vPath "\", "\",, vPos1+1))
return
return SubStr(vPath, 1, vPos1) vText SubStr(vPath, vPos2)
}
else if (vPart ~= "^[Dd]\d+$") ;first n parts of directory e.g. 'd3'
{
if (vPos := InStr(vDir "\", "\", 0, 1, SubStr(vPart, 2)))
return vText SubStr(vPath, vPos)
else
return
}
else if (vPart ~= "^[Pp]\d+$") ;first n parts of path e.g. 'p3'
{
if (vPos := InStr(vPath "\", "\", 0, 1, SubStr(vPart, 2)))
return vText SubStr(vPath, vPos)
else
return
}
else if (vPart ~= "^[Dd]-\d+$") ;last n parts of directory e.g. 'd-3'
{
if (vPos := InStr(vDir, "\", 0, vIsV1-1, SubStr(vPart, 3)))
return SubStr(vPath, 1, vPos) vText "\" vName
else
return
}
else if (vPart ~= "^[Pp]-\d+$") ;last n parts of path e.g. 'p-3' (note: 'p-1' is equivalent to 'n')
{
if (vPos := InStr(vPath, "\", 0, vIsV1-1, SubStr(vPart, 3)))
return SubStr(vPath, 1, vPos) vText
else
return
}
}
[EDIT:] Added more comments.
[EDIT:] Fixed GetFullPathName DllCall line, added "\\?\".
[EDIT:] Added more comments.
[EDIT:] Added Path/Name/Dir/Ext/NameNoExt/Drive/PathNoExt functionality (p/n/d/e or x/dr/pne or pnx etc already existed).
[EDIT:] Added nth part functionality e.g. 3/-3.
[EDIT:] Added JEE_FileSetPart function.