none
ロングファイル名からショートファイル名への変換方法を教えてください RRS feed

  • 質問

  • Windowsフォームアプリケーションで作成したプログラムで、

    openFileDialogのFileNameより得たロングファイル名(パスを含む)を、他のコンソールベースのプログラムに渡し、ファイルの読み込みをしたいと思います。

    コンソールベースのプログラムのファイル オープンは8.3形式のファイル名が必要と思い、ロングファイル名からシートファイル名への変換必要となりました。

    プログラムに組み込める変換方法を教えてくださるよう、よろしくお願いします。

    2006年8月17日 8:26

回答

  • とっちゃんです。

    呼び出したいコンソールアプリがなにかわからないので、NGという場合もありえますが、32bitアプリならロングパスはサポートしているはず(というより、サポートしていないとソフトウェアとして使いづらい)です。

    ロングネームに対応しているのであれば、"" でパラメータをくくってあげれば問題なく動作します(コマンドラインからの呼び出しの場合も同じ)。

    本当は、スペースがある場合はくくるというのがお作法なんですが、ない場合はくくってはいけないということもありません。

    ソフトの中には、""でくくられて起動されるとおかしな挙動をするものもありますが、その場合は逆に、くくらずに呼び出せばよいと思います。

    ショートパスで無ければならないという場合は、GetShortPathName API を使うのが良いでしょう(C++ですしね)。

    この場合、PlatformSDK が別途必要になります(デフォルトではインストールされていないため)。

     

    2006年8月17日 9:18

すべての返信

  • Win32 APIのGetShortPathName関数を使うとか。

    使用するためには、windows.hをインクルードし、Kernel32.libをリンクしてください。
    また、第一引数に指定する文字列は LPCTSTR 型ですので、String^ からうまいこと変換してください。

    必要ならば、サンプルを用意します。
    2006年8月17日 8:39
  • よほど古いの以外はショートパスなぞ使わずとも問題ないかと思いますが。

    .NET 単独ではショートパス名をサポートしてなかったはずなので、COM 経由で FileSystemObject を使うなり、Win32API の GetShortPathName 関数を使うなりする必要があります。C++/CLI からなら後者の方が簡単……なのかな?

    2006年8月17日 8:42
  • とっちゃんです。

    呼び出したいコンソールアプリがなにかわからないので、NGという場合もありえますが、32bitアプリならロングパスはサポートしているはず(というより、サポートしていないとソフトウェアとして使いづらい)です。

    ロングネームに対応しているのであれば、"" でパラメータをくくってあげれば問題なく動作します(コマンドラインからの呼び出しの場合も同じ)。

    本当は、スペースがある場合はくくるというのがお作法なんですが、ない場合はくくってはいけないということもありません。

    ソフトの中には、""でくくられて起動されるとおかしな挙動をするものもありますが、その場合は逆に、くくらずに呼び出せばよいと思います。

    ショートパスで無ければならないという場合は、GetShortPathName API を使うのが良いでしょう(C++ですしね)。

    この場合、PlatformSDK が別途必要になります(デフォルトではインストールされていないため)。

     

    2006年8月17日 9:18
  • ご指摘のように””でくくったら、ロングファイル名で無事ファイルのオープンができました。

    openFileDialogのFileNameで得た情報を
    ret=_execl( av, ch, NULL );
    の ch (ch は char ch[256]; で定義)に入れてしまったため、ファイルのオープンエラーになりました。

    アドバイスありがとうございました。

    2006年8月18日 4:37
  • とっちゃん さんのアドバイスで、無事ロングファイル名でファイルのオープンができましたが、
    Win32 APIのGetShortPathName関数を使う方法も勉強したいと思っています。

    御手数でなければサンプル(型変換も含めた)をお願いします。

    PlatformSDK はインストール済みです。

    2006年8月18日 4:47