パス名の各種操作(U)          <TOP>


パス名操作に関するAPIをテストしています。

PathAddBackslash パスを表す文字列の最後にバックスラッシュ\を付け加える。含まれる場合は付け加えられない

PathAddExtension パスを表す文字列の最後にファイル拡張子を付け加える。既に付けられている場合は付加されない

PathAppend 既存のパスにファイル名を追加

PathBuildRoot ドライブ番号からルートパスを生成

PathCanonicalize "."や".."などの文字を含むパス名を、これらの文字を含まないパス名に変換

PathCombine ディレクトリ名とファイルパスの結合

PathCommonPrefix 二つのパスで共通しているプレフィックスを取得

PathCompactPath 短縮形式のパスを取得

PathCompactPathEx 文字数に収まるようにパスの一部を省略

PathCreateFromUrl URLパスを取得しDOSパスに変換

 

 

'================================================================
'= パス名の操作(U)
'=    (PathFunctions2.bas)
'================================================================
#include "Windows.bi"

' パスを表す文字列の最後にバックスラッシュ\を付け加える。含まれる場合は付け加えられない
Declare Function Api_PathAddBackslash& Lib "shlwapi" Alias "PathAddBackslashA" (ByVal pszPath$)

' パスを表す文字列の最後にファイル拡張子を付け加える。既に付けられている場合は付加されない
Declare Function Api_PathAddExtension& Lib "shlwapi" Alias "PathAddExtensionA" (ByVal pszPath$, ByVal pszExt$)

' 既存のパスにファイル名を追加
Declare Function Api_PathAppend& Lib "shlwapi" Alias "PathAppendA" (ByVal pszPath$, ByVal pMore$)

' ドライブ番号からルートパスを生成
Declare Function Api_PathBuildRoot& Lib "shlwapi" Alias "PathBuildRootA" (ByVal szRoot$, ByVal iDrive$)

' "."や".."などの文字を含むパス名を、これらの文字を含まないパス名に変換
Declare Function Api_PathCanonicalize& Lib "shlwapi" Alias "PathCanonicalizeA" (ByVal pszBuf$, ByVal pszPath$)

' ディレクトリ名とファイルパスの結合
Declare Function Api_PathCombine& Lib "shlwapi" Alias "PathCombineA" (ByVal szDest$, ByVal lpszDir$, ByVal lpszFile$)

' 二つのパスで共通しているプレフィックスを取得
Declare Function Api_PathCommonPrefix& Lib "shlwapi" Alias "PathCommonPrefixA" (ByVal pszFile1$, ByVal pszFile2$, ByVal achPath$)

' 短縮形式のパスを取得
Declare Function Api_PathCompactPath& Lib "shlwapi" Alias "PathCompactPathA" (ByVal hDC&, ByVal pszPath$, ByVal dx&)

' 文字数に収まるようにパスの一部を省略
Declare Function Api_PathCompactPathEx& Lib "shlwapi" Alias "PathCompactPathExA" (ByVal pszOut$, ByVal pszSrc$, ByVal cchMax&, ByVal dwFlags&)

' URLパスを取得しDOSパスに変換
Declare Sub Api_PathCreateFromUrl Lib "shlwapi" Alias "PathCreateFromUrlA" (ByVal pszUrl$, ByVal pszPath$, ByRef pcchPath&, ByVal dwFlags&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

Var Shared List1 As Object
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
List1.SetWindowSize 382, 256

'================================================================
'=
'================================================================
Declare Function StripTerminator(sInput As String) As String
Function StripTerminator(sInput As String) As String
    Var ZeroPos As Long

    ZeroPos = instr(1, sInput, Chr$(0))
    If ZeroPos > 0 Then
        StripTerminator = Left$(sInput, ZeroPos - 1)
    Else
        StripTerminator = sInput
    End If
End Function

'================================================================
'= パス名の各種操作
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var sSave As String
    Var hDC As Long
    Var Ret As Long

    hDC = Api_GetDC(List1.GethWnd)

    List1.ResetContent

    sSave = "c:\testpath\dir" + String$(100, Chr$(0))           'パスのバッファ
    List1.Addstring "■PathAddBackslash:\の無い場合\を追加"
    List1.AddString "  " & sSave
    Ret = Api_PathAddBackslash(sSave)                           '\の無い場合\を追加
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = "c:\testpath\dir\myfile" + String$(100, Chr$(0))    '拡張子のないファイル名とバッファ
    List1.Addstring "■PathAddExtension:拡張子が無い場合(.tst)追加"
    List1.AddString "  " & sSave
    Ret = Api_PathAddExtension(sSave, ".tst")                   '拡張子を持っていない場合(.tst)追加
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = "c:\testpath\dir" + String$(100, Chr$(0))           'ディレクトリバッファ
    List1.Addstring "■PathAppend:ファイル名でディレクトリ追加"
    List1.AddString "  " & sSave
    Ret = Api_PathAppend(sSave, "myfile.tst")                   'ファイル名でディレクトリ追加
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = String$(100, Chr$(0))                               'バッファ
    List1.Addstring "■PathBuildRoot:ドライブ番号からルートパスを作成"
    List1.AddString "  ByVal 2"
    Ret = Api_PathBuildRoot(sSave, ByVal 2)                     '与えられたドライブ番号からルートパスを作成
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = String$(255, Chr$(0))                               'バッファ
    List1.Addstring "■PathCanonicalize:与えるパスを正規化"
    List1.AddString "  " & Chr$(34) & "c:\dir1\.\dir2\..\dir3" & Chr$(34)
    Ret = Api_PathCanonicalize(sSave, "c:\dir1\.\dir2\..\dir3") '与えるパスを正規化(Canonicalize)
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = String$(255, Chr$(0))                               'バッファ
    List1.Addstring "■PathCombine:二つのパスを連結"
    List1.AddString "  " & Chr$(34) & "C:" & Chr$(34) & ", " & Chr$(34) & "One\Two\Three" & Chr$(34)
    Ret = Api_PathCombine(sSave, "C:", "One\Two\Three")         '二つのパスを連結
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = String$(255, Chr$(0))                               'バッファ・/ 二つのパスで共通しているプレフィックスを取得
    List1.Addstring "■PathCommonPrefix:共通プレフィックスを取得"
    List1.AddString "  " & Chr$(34) & "C:\mydir\test\myfile.ext"
    List1.AddString "  " & Chr$(34) & "c:\mydir\testing\hello.txt"
    Ret = Api_PathCommonPrefix("C:\mydir\test\myfile.ext", "c:\mydir\testing\hello.txt", sSave)
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = "file:///C:/This/is/a/long/path/myfile.txt"
    List1.Addstring "■PathCompactPath:200ピクセルの長方形に収まるようパスを短縮"
    List1.AddString "  " & sSave
    Ret = Api_PathCompactPath(hDC, sSave, 200)                  '例では200ピクセルの長方形に収まるようパスを短縮
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = String$(255, Chr$(0))                               'バッファ
    List1.Addstring "■PathCompactPathEx:25文字に収まるようパス名を短縮"
    List1.AddString "  C:\This\is\a\long\path\myfile.txt"
    Ret = Api_PathCompactPathEx(sSave, "C:\This\is\a\long\path\myfile.txt", 25, 0) '25文字に収まるようパス名を短縮
    List1.AddString " →" & StripTerminator(sSave)             '結果
    List1.AddString ""

    sSave = String$(255, Chr$(0))                               'バッファ
    List1.Addstring "■PathCreateFromUrl:URLファイルをDOSファイルに変換"
    List1.AddString "  file:///C:/dir/myfile.ext"
    Api_PathCreateFromUrl "file:///C:/dir/myfile.ext", sSave, Len(sSave), 0 'URLファイルをDOSファイルに変換
    List1.AddString " →" & StripTerminator(sSave)             '結果

    Ret = Api_ReleaseDC(hDC, List1.GethWnd)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End