在windows上找到ruby中文件的真实文件名

时间:2015-04-16 14:40:48

标签: ruby windows

我有一个要处理的Ruby脚本的文件列表。该脚本始终在Windows PC上运行。脚本如何找到实际名称?

示例:

File List -> Actual file on disk 
TEST.TXT  -> test.txt
TeSt.TxT  -> test.txt

经过更多测试后我发现:

puts File.absolute_path("./TEST.RB")
puts Dir["./TEST.RB*"].first
#Path as on disk
puts File.absolute_path("./../Vdd/TEST.RB")
puts Dir["./../Vdd/TEST.RB*"].first
#Path case not as on disk
puts File.absolute_path("./../vdd/TEST.RB")
puts Dir["./../vdd/TEST.RB*"].first

输出

C:/Projects/xcms/software-HEAD/build/tools/Vdd/test.rb
./test.rb
C:/Projects/xcms/software-HEAD/build/tools/Vdd/test.rb
./../Vdd/test.rb
C:/Projects/xcms/software-HEAD/build/tools/vdd/test.rb
./../vdd/test.rb

所以realpath absolute_pathDir["#{file}*"].first都没有做任何事情,而文件名都正确但不是路径名。


所以我编写了这个函数,但是它修正了路径名中的一些案例问题而不是其他案例。

def actual_absolute_path(file)
  file = File.absolute_path(file)
  filename = ''
  file.split('/').each do |s| 
    filename = File.absolute_path(filename + s + "/") + "/"
  end
  filename[0 ..-2]
end

似乎有点随意......

1 个答案:

答案 0 :(得分:2)

你会期望方法realpath会给你这个,但它并没有 你可以使用这个技巧,真实姓名都是小写的。

file = 'C:/Users/Gebruiker/ruby_werk/files/REAL_NAME1.rb'
p File.realpath file
p Dir["#{file}*"].first

给出

"C:/Users/Gebruiker/ruby_werk/files/REAL_NAME1.rb" # not correct
"C:/Users/Gebruiker/ruby_werk/files/real_name1.rb" # correct

修改

这是一个核心记录路径和文件名的版本。 似乎即使操作系统本身具有DIR / B / S也是理所当然的,因为你提供了它并且没有纠正这种情况。所以我将路径转换为短名称版本,然后再转换为长名称。

require 'Win32API'

file = 'c:/users/gebruiker/ruby_werk/files/REAL_NAME1.rb'

def longname short_name
  max_path = 1024
  long_name = " " * max_path
  lfn_size = Win32API.new("kernel32", "GetLongPathName", ['P','P','L'],'L').call(short_name, long_name, max_path)
  return long_name[0..lfn_size-1]
end

def shortname long_name
  max_path = 1024
  short_name = " " * max_path
  lfn_size = Win32API.new("kernel32", "GetShortPathName", ['P','P','L'],'L').call(long_name, short_name, max_path)
  return short_name[0..lfn_size-1]
end

def realname file
    longname(shortname file)
end

p realname file

给出

C:/Users/Gebruiker/ruby_werk/files/real_name1.rb