>APIを駆使してこれと同じものを作る。
に関してですが、「ちょくとのページ」の「Win32 API 関数リスト」で、Path〜から始まるものを参照してください。
たとえば、ディレクトリ情報を取り除くにはPathFindFileName関数を用います。
ただし、PathFindFileName関数の説明(
http://msdn.microsoft.com/en-us/library/bb773589.aspx)を見ると、
>Parameters
>pPath
>[in] A pointer to a null-terminated string of maximum length MAX_PATH that contains the path to search.
となっており、APIでもMAX_PATHで制限されている模様……。当たり前と言えば当たり前なんですが。
でも、ダメ元でやってみると、なぜかうまくいってしまったり。
#uselib "shlwapi.dll"
#cfunc PathFindFileName "PathFindFileNameA" int
path = "c:\\aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjkkkkkkkkkkllllllllllmmmmmmmmmm\\nnnnnnnnnnooooooooooppppppppppqqqqqqqqqqrrrrrrrrrrssssssssssttttttttttuuuuuuuuuuvvvvvvvvvvwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyzzzzzzzzzz.txt"
mes "入力パス"
input path, 640, 24
mes "getpathによる結果"
result1 = getpath(path,8)
input result1, 640, 24
mes "PathFindFileName関数による結果"
spath = strlen(path)
ppath = varptr(path)
pname = PathFindFileName(ppath) ; 本来なら引数の型はstr型でよいが、下のファイル名の長さの計算のためにアドレスを引数にしている
dupptr result2, pname, spath-(pname-ppath)+1, 2 ; ファイル名の長さをパスの長さとアドレスから計算している
input result2, 640, 24
一応、この通り動作しましたが、安全性は保障できません。そもそも、自分の環境では動作しましたが、他の環境で動作するのかもわかりません。
hDAさんの言うように自前で実装するのもひとつの手かと。
ちなみに、Unicode版の関数(〜W)を用いてMAX_PATHを突破する方法もあるらしいです。下のMaximum Path Lengthあたりを参考にしてみては?
http://msdn.microsoft.com/en-us/library/aa365247.aspx
「MAX_PATH 超える」あたりをキーワードにググってみれば、他の方法も見つかるかもしれません。
それか、いっそ「260バイトを超えるパスには対応していません」とするか。多くのアプリケーションがそうですし。