=====Manipulating filenames and pathnames===== //by Jonathan Harston//\\ \\ Here are some code fragments and routines to manipulate various filenames and pathnames.\\ \\ ===== Root directory ===== **FNf_root()** extracts the root directory from the supplied path. You can't just look for a colon specifying a drive, as the program may have been run with a Uniform Naming Convention path (see [[http://en.wikipedia.org/wiki/Path_(computing)#Uniform_Naming_Convention|Wikipedia]]). Also, the path may be surrounded by quotes, which have to be taken care of.\\ \\ FNf_root() will return as per the following examples:\\ FNf_root("C:\Documents and Settings\jgh\Admin") *| -> "C:" FNf_root("H:\Apps") *| -> "H:" FNf_root("\\datastore\Tools\Admin") *| -> "\\datastore" FNf_root("X:") *| -> "X:" You could then do, for example:\\ PROCcopyfiles(FNf_root(indir$)+"\Data","D:\Backup","*.*") \\ ===== Extracting leafname ===== **FNf_leaf()** will scan through a fully-qualified pathname to find just the leafname - the final part of the path.\\ DEF FNf_leaf(A$) LOCAL A%:REPEAT:A%=INSTR(A$,"\"):IFA%:A$=MID$(A$,A%+1) UNTILA%=0:=A$ For example, **FNf_leaf("H:\Apps\Admin\Startup.exe")** returns **"Startup.exe"**.\\ \\ ===== Removing leafname ===== **FNf_path()** will remove the leafname, keeping just the pathname. For example:\\ DEF FNf_path(A$):IFINSTR(A$,"\")=0:=A$ LOCAL A%:REPEATB%=A%:A%=INSTR(A$,"\",A%+1):UNTILA%=0:=LEFT$(A$,B%) This lets you use code such as:\\ IF out$="" THEN out$=FNf_path(in$)+"output.txt" \\ ===== Removing filename extension ===== **FNf_noext()** will remove an extension from a pathname. Note that you cannot just remove the last four characters, as the extension is not guaranteed to be four characters (eg, ".c"), nor can you simply search for a ".", as the path may have multiple "."s in it (eg **"C:\index.dat\20090721\thumb.db"** or even **"Version1.00\data.file.txt"**).\\ DEF FNf_ext(A$):IFINSTR(A$,".")=0:="" LOCAL A%:A%=LENA$+1:REPEATA%=A%-1:UNTIL INSTR(".:\",MID$(A$,A%,1)) IF MID$(A$,A%,1)=".":=MID$(A$,A%) ELSE ="" You can then use this to do, for example:\\ PROCBMP_toGIF(bmpfile$,FNf_noext(bmpfile$)+".gif") Note that filenames similar to **".htaccess"** are seen as being all extension and no name.\\ \\ ===== Finding filename extension ===== **FNf_ext()** will scan through a fully-qualified pathname to find the extension. As with **FNf_noext()**, you cannot just use the last four characters.\\ DEF FNf_noext(A$):IFINSTR(A$,".")=0:=A$ LOCAL A%:A%=LENA$+1:REPEATA%=A%-1:UNTIL INSTR(".:\",MID$(A$,A%,1)) IFMID$(A$,A%,1)=".":=LEFT$(A$,A%-1) ELSE =A$ You can then use this to do, for example:\\ runapp$=FNMime_Type(FNf_ext(file$)) \\ ===== Ensuring full absolute pathnames ===== It is good practice for programs to access files via fully-specified paths, yet it can also be useful for programs to be able to access certain files relative to some path, such as the directory the program is running in. **FNf_fullpath()** will take a path and a filename and return the full path of a relative filename.\\ DEF FNf_fullpath(path$,file$) IF INSTR(file$,":")<>0 OR INSTR(file$,"\\")<>0:=file$ IF RIGHT$(path$,1)<>"\":path$=path$+"\" =path$+file$ It functions as in the following examples.\\ FNf_fullpath("C:\EARS","DATA") *| -> "C:\EARS\DATA" FNf_fullpath("C:\EARS","A:\INCOMING") *| -> "A:\INCOMING" FNf_fullpath("C:\EARS","\\system\backup") *| -> "\\system\backup"