使用言語:C#
フレームワーク:.Net Framework 4.6.1
###8.3形式が必要な理由
InstallShield製のSetUp.exeの実行時にインストールフォルダを引数で指定するとき、フォルダパスに空白が入るとエラーが発生するため、空白がない形で渡したい。(エスケープすれば、パスに空白が含まれていても大丈夫でした。2019/06/19)
###質問本文
パス文字列を8.3形式に変換するためにGetShortPathNameを使っているのですが、引数のlongPathに渡すのがCドライブ以外のドライブのパス(例えばD:\tera tail\など)だと8.3形式になりません。
そもそも8.3形式はCドライブにのみ有効なのでしょうか?
もしも、Cドライブ以外のパスを変換できる方法があれば教えていただけないでしょうか?
以下はGetShortPathNameを使用できるように呼び出しているコードです。
C#
1 /// <summary> 2 /// Win32Api呼び出し kernel32.dll 3 /// </summary> 4 internal class Kernel32 5 { 6 [SuppressUnmanagedCodeSecurity] 7 internal static class NativeMethods 8 { 9 [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] 10 public static extern int GetShortPathName(string longPath, StringBuilder shortPathBuffer, int bufferSize); 11 } 12 }
そもそも 8.3 がまだ必要ですか?
何に使うのでしょう?
なぜか質問編集によって消されましたが、変換できるかどうかは GetShortPathName の戻り値と GetLastError によってわかります。長いファイル名と短いファイル名は NTFS 独自のものなので、その他のファイルシステムには使えません。NTFS でもレジストリを書き換えることで無効にできます。
8.3が必要な理由を追記しました。
ご指摘ありがとうございます。
了解しました。InstallShield は作りが良くないので昔から嫌いでしたが、まだそんな仕様なんですね。
今までエラーが出ていたのはエスケープの方法が悪かったせいで、空白が入っていたら必ず8.3が必要なわけではありませんでした。
回答2件
あなたの回答
tips
プレビュー