Feature #2325
closedDir instance methods for relative path
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 みたい
なものかと思って。
Updated by naruse (Yui NARUSE) about 15 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
Updated by nobu (Nobuyoshi Nakada) about 15 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はできる。
中田 伸悦
Updated by naruse (Yui NARUSE) about 15 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) over 10 years ago
- Description updated (diff)