# DOSISH 対応

ruby version 1.7 では、DOSISH対応(DOS/Windows のパス名の扱いに対する変 更)が含まれています*1。 (現在の)変更点を以下に示します。

なお、これらの変更は mswin32版、mingw32版, bccwin32版, human68k版, os2_emx版の Ruby にのみあてはまります。

とりあえずの目標として、

- \ も / と同様パスセパレータとして扱う
- マルチバイトパス名への対応("表" など 2 byte 目が 0x5c(`\') である文字を正しく扱う)
- UNC 対応(これ自体は1.6にも入っている)
- ドライブレター対応

への対応が挙げられていますが、ドライブレター対応などの微妙な部分については現在もruby-listなどで議論が継続されています。 現時点では、Fileの各メソッドに対する\対応, マルチバイトパス名対応, UNC 対応が実装されています。[ruby-dev:13817], [ruby-dev:14097]

以下、各メソッドの挙動について...

File.dirname

  パスセパレータとして従来の/に加えて\も認識するようになっています。 これに合わせて、マルチバイトで記述されたパス名への対応も行われています。

      p File.dirname("C:\\foo\\bar")

      => ruby 1.6.4 (2001-06-04) [i586-mswin32]
         "."

      => ruby 1.7.1 (2001-08-16) [i586-mswin32]
         "C:\\foo"

      p File.dirname("C:/foo")
      p File.dirname("C:\\foo")
      p File.dirname("C:foo")

      => ruby 1.6.4 (2001-06-04) [i586-mswin32]
         "C:"
         "."
         "."

      => ruby 1.7.1 (2001-08-16) [i586-mswin32]
         "C:"
         "C:"
         "."

      => ruby 1.8.0 (2003-01-06) [i386-mswin32]
         "C:/"
         "C:\\"
         "C:."

File.basename

  パスセパレータとして従来の/に加えて\も認識するようになっています。 これに合わせて、マルチバイトで記述されたパス名への対応も行われています。

      p File.basename("C:\\foo\\bar")

      => ruby 1.6.4 (2001-06-04) [i586-mswin32]
         "C:\\foo\\bar"

      => ruby 1.7.1 (2001-08-16) [i586-mswin32]
         "bar"

File.split

  File.dirname と File.basename が変更されているので、File.split もそれに準じた 結果を返します。

File.expand_path

  ドライブレター対応に関して、下記のような案が提示されています。

      Dir.chdir("D:/")
      p File.expand_path("C:foo", "C:/bar")
      p File.expand_path("D:foo", "C:/bar")

      => ruby 1.6.4 (2001-06-04) [i586-mswin32]
         "C:/bar/C:foo"
         "C:/bar/D:foo"

      => ruby 1.8.0 (2003-01-06) [i386-mswin32]
         "C:/bar/foo"
         "D:/foo"

      => 新井案 ((<ruby-list:30970>))
         "C:/bar/foo"
         (なんらかの例外)

File.join

  ドライブレター対応に関して、下記のような案が提示されています。

      p File.join("c:", "foo")
      p File.join("c:/", "foo")
      p File.join("c:.", "foo")
      p File.join("c:", "/foo")

      => ruby 1.6.4 (2001-06-04) [i586-mswin32]
         "c:/foo"
         "c://foo"
         "c:./foo"
         "c://foo"

      => ruby 1.8.0 (2003-01-06) [i386-mswin32]
         "c:/foo"
         "c:/foo"
         "c:./foo"
         "c://foo"

      => 新井案 ((<ruby-list:31185>))
         "c:./foo"
         "c:/foo"
         "c:./foo"
         "c:./foo"

File.fnmatch
Dir.glob
Dir[]

*1 拡張ライブラリによる別実装として、 RAAに [RAA:DOSish]があります

links: [bccwin32] [human68k] [mingw32] [mswin32] [os2_emx]
reverse links: [1.6.8から1.8.0への変更点(まとめ)] [File] [Ruby変更履歴] [Win32ネイティブ版Rubyの互換性問題] [human68k] [ruby 1.8 feature]