3

長いファイル名/パスを短いファイル名 (8.3) に変換したい。短いファイル名のみを受け入れるコマンド ライン ツールを呼び出すスクリプトを開発しています。

だから私は変換する必要があります

C:\Ruby193\bin\test\New Text Document.txt

C:\Ruby193\bin\test\NEWTEX~1.TXT

これまでのところ、WIN32APIを使用して短いファイル名を長いファイル名に変換するARGVから長いファイル名を取得する方法を見つけました(私が達成したいことの反対です)。

Rubyで短いファイル名を取得する方法はありますか?

4

3 に答える 3

3

これはFFIを使用して行うことができます。実際には、ウィキの「パスを 8.3 スタイルのパス名に変換する」という見出しの下に、正確なシナリオをカバーする例があります。

require 'ffi'

module Win
  extend FFI::Library
  ffi_lib 'kernel32'
  ffi_convention :stdcall

  attach_function :path_to_8_3, :GetShortPathNameA, [:pointer, :pointer, :uint], :uint
end
out = FFI::MemoryPointer.new 256 # bytes
Win.path_to_8_3("c:\\program files", out, out.length)
p out.get_string # be careful, the path/file you convert to 8.3 must exist or this will be empty
于 2012-04-19T17:30:54.143 に答える
3

この Ruby コードはgetShortPathNameを使用しており、追加のモジュールをインストールする必要はありません。

def get_short_win32_filename(long_name)
    require 'win32api'
    win_func = Win32API.new("kernel32","GetShortPathName","PPL"," L")
    buf = 0.chr * 256
    buf[0..long_name.length-1] = long_name
    win_func.call(long_name, buf, buf.length)
    return buf.split(0.chr).first
end
于 2012-04-20T10:28:21.327 に答える
1

必要な Windows 関数はGetShortPathNameです。リンクされた投稿で説明されているのと同じ方法で使用できます。

編集: GetShortPathName の使用例 (簡単な例として) - 短い名前には「C:\LONGFO~1\LONGFI~1.TXT」が含まれ、戻り値は 24 です。

TCHAR* longname = "C:\\long folder name\\long file name.txt";
TCHAR* shortname = new TCHAR[256];
GetShortPathName(longname,shortname,256);
于 2012-04-19T11:39:01.747 に答える