Для работы с этими языками необходимо использовать GetLongPathNameW
.Единственная проблема в том, что эта функция использует широкие строки, поэтому вам нужно будет вызывать функции WinAPI, которые преобразуют многобайтовые строки в широкие строки и наоборот.
В геме windows-pr
эти функции уже четко определеныкак multi_to_wide
и wide_to_multi
.Я не знаю, можете ли вы использовать драгоценные камни в вашей среде, если вы не можете, то попробуйте эти «упрощенные» версии:
def mb_to_wide(str)
# CP_UTF8 = 65001
wsize = Win32API.new("kernel32", "MultiByteToWideChar", 'ILSIPI', 'I').call(65001, 0, str, -1, nil, 0)
if wsize > 0
wstr = " " * wsize * 2
Win32API.new("kernel32", "MultiByteToWideChar", 'ILSIPI', 'I').call(65001, 0, str, -1, wstr, wsize)
wstr
end
end
def wide_to_mb(wstr)
wstr << "\000\000" if wstr[-1].chr != "\000" # add wide null terminators if not found
size = Win32API.new("kernel32", "WideCharToMultiByte", 'ILSIPIPP', 'I').call(65001, 0, wstr, -1, 0, 0, nil, nil)
if size > 0
str = " " * wstr.length
Win32API.new("kernel32", "WideCharToMultiByte", 'ILSIPIPP', 'I').call(65001, 0, wstr, -1, str, wstr.length, nil, nil)
str[/^[^\0]*/] # up to \0
end
end
Тогда вам просто нужно будет адаптировать свою функцию к чему-то вродеэто:
def self.get_long_win32_filename(short_name)
max_path = 1024
long_name = " " * max_path
wshort_name = mb_to_wide(short_name)
size = Win32API.new("kernel32", "GetLongPathNameW", 'PPL', 'L').call(wshort_name, long_name, max_path)
wide_to_mb(long_name[/.+?(?=\0\0)/]) # up to \0\0
end
Это может решить проблему, указанную в заголовке вопроса и в большей части вашего сообщения, но, возможно, вы задаете неправильный вопрос, и вам следует найти более простое решение для создания временной папкибез возвращения короткого пути для начала.Таким образом, вам не нужно проходить через все это только для решения вашей проблемы.