Project

General

Profile

Feature #2325

Dir instance methods for relative path

Added by matz (Yukihiro Matsumoto) almost 10 years ago. Updated about 5 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-dev:39621]

Description

まつもと ゆきひろです

In message "Re: [ruby-dev:39620] Re: [Feature:trunk] Dir instance methods for relative path"
on Tue, 3 Nov 2009 12:57:58 +0900, KOSAKI Motohiro kosaki.motohiro@jp.fujitsu.com writes:

単純な疑問として、最初に思ったのは自分が相対パスでファイルを
開きたい状況になったときに、「まっさきに調べるのがDirクラスのAPIリファレンスか?」
というとNOだと思ったからです。

そうですよねえ。

自分なら、「ファイルオープン」ってどうやるんだっけ?と、思考が働くので

open(dir, relative-path) or
openat(dir, relative-path)

のほうが、APIに一発ヒットできてナイスかなと。まあ直感なんですが。

中田さんがすでに指摘したような理由でopen(dir, relative-path)
は難しそうです。open(relative-path, "rw", base: dir) とかな
ら可能かもしれませんが、ちょっと冗長な気もします。

# ところで、みなさんがopenatが嫌なのは名前がダサイからでしょうか?

ダサいというか、openateという単語の省略形かと思って辞書引きま
した、最初。そんな単語ないんですけど。create → creat みたい
なものかと思って。


Related issues

Is duplicate of Ruby master - Feature #2324: Dir instance methods for relative pathAssignedActions

History

#1

Updated by naruse (Yui NARUSE) almost 10 years ago

成瀬です。

Yukihiro Matsumoto wrote:

まつもと ゆきひろです

In message "Re: [ruby-dev:39620] Re: [Feature:trunk] Dir instance methods for relative path"
on Tue, 3 Nov 2009 12:57:58 +0900, KOSAKI Motohiro kosaki.motohiro@jp.fujitsu.com writes:

単純な疑問として、最初に思ったのは自分が相対パスでファイルを
開きたい状況になったときに、「まっさきに調べるのがDirクラスのAPIリファレンスか?」
というとNOだと思ったからです。

そうですよねえ。

そもそも、根本的に openat の API って実装の都合が出過ぎていませんかね。
C 言語の関数ならばともかく、Ruby の API としては、
もうちょっとユースケースベースの API にしないと使われない気がします。
(使うべき人が使う API でいいやと割り切るという考えもあるでしょうが)

例に出されているテンポラリディレクトリの削除については、
とりあえずどっかしらに用意して、それを fileutils で使えばいいのでしょうが、

./ruby -v -e 'p Dir.open("ext"){|d|d.open("extmk.rb"){|f|f.gets}}'
の場合だと、人工的な例を言うのを差し引いても、
一般の人が使ってくれるとはなかなか考えづらいように感じます。
あとは、そのディレクトリの下の
d.open("some_directory"){|dd| ...}もあるなぁとか。

っと思ったけど、

./ruby -v -e 'p open(["ext", "extmk.rb"]){|f|f.gets}}'
./ruby -v -e 'p open([dir, "extmk.rb"]){|f|f.gets}}'
を許すなら join の手間が省けるので使ってくれるかなぁ。

これ以外だと、__DIR__ と絡めるとかですかねぇ。

--
NARUSE, Yui naruse@airemix.jp

#2

Updated by naruse (Yui NARUSE) almost 10 years ago

  • Status changed from Open to Closed

重複なので閉じます

#3

Updated by nobu (Nobuyoshi Nakada) almost 10 years ago

なかだです。

At Tue, 3 Nov 2009 23:18:49 +0900,
NARUSE, Yui wrote in [ruby-dev:39625]:

そもそも、根本的に openat の API って実装の都合が出過ぎていませんかね。
C 言語の関数ならばともかく、Ruby の API としては、
もうちょっとユースケースベースの API にしないと使われない気がします。
(使うべき人が使う API でいいやと割り切るという考えもあるでしょうが)

何か別のクラスを新設したほうがいい、ということでしょうか。

./ruby -v -e 'p open(["ext", "extmk.rb"]){|f|f.gets}}'
./ruby -v -e 'p open([dir, "extmk.rb"]){|f|f.gets}}'
を許すなら join の手間が省けるので使ってくれるかなぁ。

手間は省けますが、symlink attackには無意味です。

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

#4

Updated by naruse (Yui NARUSE) almost 10 years ago

成瀬です。

Nobuyoshi Nakada wrote:

At Tue, 3 Nov 2009 23:18:49 +0900,
NARUSE, Yui wrote in [ruby-dev:39625]:

そもそも、根本的に openat の API って実装の都合が出過ぎていませんかね。
C 言語の関数ならばともかく、Ruby の API としては、
もうちょっとユースケースベースの API にしないと使われない気がします。
(使うべき人が使う API でいいやと割り切るという考えもあるでしょうが)

何か別のクラスを新設したほうがいい、ということでしょうか。

えぇ、例えば、Fileinfo クラスを作り、親ディレクトリのファイルハンドルと
そのディレクトリからの相対パスを持つ。

で、例えば Dir.foreach なら以下のように使う、と。

Dir.foreach("/tmp") do |fileinfo|
  fileinfo.open{|f| f.read} if fileinfo.file?
end

./ruby -v -e 'p open(["ext", "extmk.rb"]){|f|f.gets}}'
./ruby -v -e 'p open([dir, "extmk.rb"]){|f|f.gets}}'
を許すなら join の手間が省けるので使ってくれるかなぁ。

手間は省けますが、symlink attackには無意味です。

いや、open 内で join するのではなくて、
open の中で ext を開いてから openat で extmk.rb を開いたり、
dir から openat で extmk.rb を開くという話です。

現在 open(File.join(dir, "extmk.rb")){|f|f.gets} などと書いているところを、
open([dir, "extmk.rb"]) と書くようにさせる、だと受け入れやすいかなと。

--
NARUSE, Yui naruse@airemix.jp

Updated by nobu (Nobuyoshi Nakada) about 5 years ago

  • Description updated (diff)

Also available in: Atom PDF