「hmV8」の例題 相対パスや絶対パス

  • 概要

    エディタで開いているファイルと、何か別のターゲットのファイルの相対パスを得たい、
    絶対パスを得たい、といったことはあります。
    そういった例を見てみましょう。

    エディタと相対パスと絶対パス

    /*
     * This codes is licensed under CC0 1.0 Universal
     */
    
    #JS = loaddll( hidemarudir + @"\hmV8.dll" );
    
    #r = dllfuncw( #JS, "DoString", R"JS(
    
    function GetBaseDirectory() {
    
        // 秀丸マクロのシンボル"filename2"を利用。今編集中のファイルのフルパス
        let filename2 = hm.Macro.Var["filename2"];
    
        // パスからディレクトリへ
        let strBaseUrl = clr.System.IO.Path.GetDirectoryName(filename2);
        return strBaseUrl + "/";
    }
    
    function GetTargetFilePath(strBaseDirectory) {
    
        // ダイアログ表示のため
        let lib = host.lib("System.Windows.Forms");
    
        let ofd = new lib.System.Windows.Forms.OpenFileDialog();
    
        // 最初に選択するフォルダを指定する
        ofd.InitialDirectory = strBaseDirectory;
    
        ofd.Filter = "HTMLファイル(*.html;*.htm;*.png)|*.html;*.htm;*.png|すべてのファイル(*.*)|*.*"
    
        // ダイアログ表示して選択した?
        if (ofd.ShowDialog() == lib.System.Windows.Forms.DialogResult.OK)
        {
            return ofd.FileName;
        } else {
            throw "未選択";
        }
    }
    
    try {
        // ベースのディレクトリを得る。
        let strBaseDirectory = GetBaseDirectory();
        let baseUrl = new clr.System.Uri(strBaseDirectory);
    
        // ターゲットのファイルのフルパスを得る
        let strTargetPath = GetTargetFilePath(strBaseDirectory);
        let targetUrl = new clr.System.Uri(strTargetPath);
    
    
        // ベースUriから対象のUrlの相対Uriを得る
        let relativeUri = baseUrl.MakeRelativeUri(targetUrl);
    
        // Uriオブジェクト→文字列に変換する
        let relativePath = relativeUri.ToString();
    
        // そのパスはローカルに本当に存在するのか?
        if ( !clr.System.IO.File.Exists(targetUrl.LocalPath) ) {
            throw "ファイルが無い";
        }
    
        // 秀丸マクロへと伝搬
        hm.Macro.Var["$relativePath"] = relativePath;
        hm.Macro.Var["$localPath"] = targetUrl.LocalPath;
        hm.Macro.Var["$absolutePath"] = targetUrl.AbsolutePath;
    
    } catch(e) {
        hm.Macro.Var["$exceptionMessage"] = e;
    }
    
    
    )JS"
    );
    
    if ($exceptionMessage != "") {
        message $exceptionMessage;
    } else {
        message $relativePath;
        message $localPath;
        message $absolutePath;
    }
    
    freedll(#JS);