This shows you the differences between two versions of the page.
manipulating_20filenames_20and_20pathnames [2018/03/31 13:19] 127.0.0.1 external edit |
manipulating_20filenames_20and_20pathnames [2018/04/17 17:32] tbest3112 Added syntax highlighting |
||
---|---|---|---|
Line 4: | Line 4: | ||
===== Root directory ===== | ===== 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()** 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:" | + | <code bb4w> |
- | FNf_root("H:\Apps") -> "H:" | + | FNf_root("C:\Documents and Settings\jgh\Admin") *| -> "C:" |
- | FNf_root("\\datastore\Tools\Admin") -> "\\datastore" | + | FNf_root("H:\Apps") *| -> "H:" |
- | FNf_root("X:") -> "X:" | + | FNf_root("\\datastore\Tools\Admin") *| -> "\\datastore" |
+ | FNf_root("X:") *| -> "X:" | ||
+ | </code> | ||
You could then do, for example:\\ | You could then do, for example:\\ | ||
+ | <code bb4w> | ||
PROCcopyfiles(FNf_root(indir$)+"\Data","D:\Backup","*.*") | PROCcopyfiles(FNf_root(indir$)+"\Data","D:\Backup","*.*") | ||
+ | </code> | ||
\\ | \\ | ||
===== Extracting leafname ===== | ===== Extracting leafname ===== | ||
**FNf_leaf()** will scan through a fully-qualified pathname to find just the leafname - the final part of the path.\\ | **FNf_leaf()** will scan through a fully-qualified pathname to find just the leafname - the final part of the path.\\ | ||
+ | <code bb4w> | ||
DEF FNf_leaf(A$) | DEF FNf_leaf(A$) | ||
LOCAL A%:REPEAT:A%=INSTR(A$,"\"):IFA%:A$=MID$(A$,A%+1) | LOCAL A%:REPEAT:A%=INSTR(A$,"\"):IFA%:A$=MID$(A$,A%+1) | ||
UNTILA%=0:=A$ | UNTILA%=0:=A$ | ||
+ | </code> | ||
For example, **FNf_leaf("H:\Apps\Admin\Startup.exe")** returns **"Startup.exe"**.\\ \\ | For example, **FNf_leaf("H:\Apps\Admin\Startup.exe")** returns **"Startup.exe"**.\\ \\ | ||
===== Removing leafname ===== | ===== Removing leafname ===== | ||
**FNf_path()** will remove the leafname, keeping just the pathname. For example:\\ | **FNf_path()** will remove the leafname, keeping just the pathname. For example:\\ | ||
+ | <code bb4w> | ||
DEF FNf_path(A$):IFINSTR(A$,"\")=0:=A$ | DEF FNf_path(A$):IFINSTR(A$,"\")=0:=A$ | ||
LOCAL A%:REPEATB%=A%:A%=INSTR(A$,"\",A%+1):UNTILA%=0:=LEFT$(A$,B%) | LOCAL A%:REPEATB%=A%:A%=INSTR(A$,"\",A%+1):UNTILA%=0:=LEFT$(A$,B%) | ||
+ | </code> | ||
This lets you use code such as:\\ | This lets you use code such as:\\ | ||
+ | <code bb4w> | ||
IF out$="" THEN out$=FNf_path(in$)+"output.txt" | IF out$="" THEN out$=FNf_path(in$)+"output.txt" | ||
+ | </code> | ||
\\ | \\ | ||
===== Removing filename extension ===== | ===== 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"**).\\ | **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"**).\\ | ||
+ | <code bb4w> | ||
DEF FNf_ext(A$):IFINSTR(A$,".")=0:="" | DEF FNf_ext(A$):IFINSTR(A$,".")=0:="" | ||
LOCAL A%:A%=LENA$+1:REPEATA%=A%-1:UNTIL INSTR(".:\",MID$(A$,A%,1)) | LOCAL A%:A%=LENA$+1:REPEATA%=A%-1:UNTIL INSTR(".:\",MID$(A$,A%,1)) | ||
IF MID$(A$,A%,1)=".":=MID$(A$,A%) ELSE ="" | IF MID$(A$,A%,1)=".":=MID$(A$,A%) ELSE ="" | ||
+ | </code> | ||
You can then use this to do, for example:\\ | You can then use this to do, for example:\\ | ||
+ | <code bb4w> | ||
PROCBMP_toGIF(bmpfile$,FNf_noext(bmpfile$)+".gif") | PROCBMP_toGIF(bmpfile$,FNf_noext(bmpfile$)+".gif") | ||
+ | </code> | ||
Note that filenames similar to **".htaccess"** are seen as being all extension and no name.\\ \\ | Note that filenames similar to **".htaccess"** are seen as being all extension and no name.\\ \\ | ||
===== Finding filename extension ===== | ===== 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.\\ | **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.\\ | ||
+ | <code bb4w> | ||
DEF FNf_noext(A$):IFINSTR(A$,".")=0:=A$ | DEF FNf_noext(A$):IFINSTR(A$,".")=0:=A$ | ||
LOCAL A%:A%=LENA$+1:REPEATA%=A%-1:UNTIL INSTR(".:\",MID$(A$,A%,1)) | LOCAL A%:A%=LENA$+1:REPEATA%=A%-1:UNTIL INSTR(".:\",MID$(A$,A%,1)) | ||
IFMID$(A$,A%,1)=".":=LEFT$(A$,A%-1) ELSE =A$ | IFMID$(A$,A%,1)=".":=LEFT$(A$,A%-1) ELSE =A$ | ||
+ | </code> | ||
You can then use this to do, for example:\\ | You can then use this to do, for example:\\ | ||
+ | <code bb4w> | ||
runapp$=FNMime_Type(FNf_ext(file$)) | runapp$=FNMime_Type(FNf_ext(file$)) | ||
+ | </code> | ||
\\ | \\ | ||
===== Ensuring full absolute pathnames ===== | ===== 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.\\ | 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.\\ | ||
+ | <code bb4w> | ||
DEF FNf_fullpath(path$,file$) | DEF FNf_fullpath(path$,file$) | ||
IF INSTR(file$,":")<>0 OR INSTR(file$,"\\")<>0:=file$ | IF INSTR(file$,":")<>0 OR INSTR(file$,"\\")<>0:=file$ | ||
IF RIGHT$(path$,1)<>"\":path$=path$+"\" | IF RIGHT$(path$,1)<>"\":path$=path$+"\" | ||
=path$+file$ | =path$+file$ | ||
+ | </code> | ||
It functions as in the following examples.\\ | It functions as in the following examples.\\ | ||
- | FNf_fullpath("C:\EARS","DATA") -> "C:\EARS\DATA" | + | <code bb4w> |
- | FNf_fullpath("C:\EARS","A:\INCOMING") -> "A:\INCOMING" | + | FNf_fullpath("C:\EARS","DATA") *| -> "C:\EARS\DATA" |
- | FNf_fullpath("C:\EARS","\\system\backup") -> "\\system\backup" | + | FNf_fullpath("C:\EARS","A:\INCOMING") *| -> "A:\INCOMING" |
+ | FNf_fullpath("C:\EARS","\\system\backup") *| -> "\\system\backup" | ||
+ | </code> |