2012-04-19 3 views
3

긴 파일 이름/경로를 짧은 파일 이름 (8.3)으로 변환하고 싶습니다. 짧은 파일 이름 만 허용하는 명령 줄 도구를 호출하는 스크립트를 개발하고 있습니다.긴 파일 이름을 짧은 파일 이름 (8.3)으로 변환

그래서 내가

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

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

지금까지 난에 내가 원하는 것과 반대 (긴 파일 이름에 짧은 변환하는 WIN32API를 사용 How to get long filename from ARGV을 발견 변환해야 이루다).

Ruby에서 짧은 파일 이름을 가져 오는 방법이 있습니까?

답변

3

이 루비 코드는 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 
1

필요한 창 기능은 GetShortPathName입니다. 링크 된 게시물에 설명 된 것과 같은 방식으로 사용할 수 있습니다.

편집 : - ": \ LONGFO ~ 1 \ LONGFI ~ 1.TXT C"를하고 값이 24

TCHAR* longname = "C:\\long folder name\\long file name.txt"; 
TCHAR* shortname = new TCHAR[256]; 
GetShortPathName(longname,shortname,256); 
+0

코드를 _GetShortPathName_으로 조정할 수 없었습니다. 당신은 그것에 익숙하며 모범을 보이고 있습니까? – user1251007

+1

코드를 C++에 추가하면 Ruby 코드를 도울 수 없지만 링크 된 게시물의 Peter와 같은 위치에 있어야합니다. 일반적으로 shortname은 NULL, size는 0으로 호출해야합니다. 그러면 필요한 크기가 반환되고 적절한 크기와 할당 된 버퍼로 다시 호출됩니다. – msam

+0

코드를 보내 주셔서 감사합니다. 나는 마침내 루비 코드로 이식했습니다. - 내 대답보기 – user1251007

3

당신은 할 수있다 반환 (그냥 빨리 예 등) GetShortPathName의 샘플 사용은 짧은 이름이 포함됩니다 FFI을 사용하여이 작업을 수행하십시오. 제목 아래 their wiki에서 정확한 시나리오를 커버하는 예는 실제로있다 "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 
+0

+1 답변 해 주셔서 감사합니다. 비록 내가 추가 모듈을 설치하지 않는 것을 선호하지만. 미안하지만, 내 질문에 언급하지 않았다. – user1251007