2016-12-12 13 views
2

$PWD/source/blogにファイルが保存されるようにスクリプトを修正するにはどうすればよいですか?Rubyの特定のフォルダにファイルを作成する方法

#!/usr/bin/env ruby 

require 'fileutils' 
require 'time' 

title = ARGV[0].to_s 
language = ARGV[1].to_s 

time = Time.new 
timestamp = time.strftime('%Y-%m-%d') 
utctime = time.getutc 
extension = 'html.markdown' 
file = timestamp + '-' + title + '.' + language + '.' + extension 
new_file = File.new(file, File::CREAT|File::TRUNC|File::RDWR, 0644) 

open(file, 'a') { |f| 
    f << "---\n" 
    f << "title: #{title} \n" 
    f << "date: #{utctime} \n" 
    f << "tags:\n" 
    f << "description:\n" 
    f << "keywords:\n" 
    f << "shorttext:\n" 
    f << "---\n" 
} 

puts 'File created ...' 
+0

ファイルは通常、現在の作業ディレクトリに対して作成されるので、プレフィックスとして 'source/blog/...'はそのトリックを行うべきです。注意として、 'ARGV'の値は' nil'以外の文字列です。 – tadman

+0

'$ PWD/source/blog'はすでに存在しますか? –

答えて

3

RubyのFileクラスには複数の方法がありますが、おそらくFile.joinを使用することが最善の方法です。ドキュメント:

File :: SEPARATORを使用して文字列を結合した新しい文字列を返します。それをやって

File.join("usr", "mail", "gumby") #=> "usr/mail/gumby" 

この方法は、それが現在実行中のOSに基づいて、ディレクトリとファイル名の間で使用するものを区切り自動感覚にルビーを可能にします。

あなた固定区切り文字を含む文字列、など

File.join('path/to', 'file.rb') 

、あるいは完全にし、代わりにハードコードパスと使用文字列補間File.joinを使用してスキップ使用できます。

"path/to/#{filename}" 

をが、コードはスマートではありません。 Rubyに夢中にさせることは常に良いことです。

Rubyは、Windowsシステムで実行しているときにスラッシュを自動的に許可するほどスマートですが、Windowsではバックスラッシュが必要です。 IO documentationはそれに入る: 可能であれば

Rubyは異なるオペレーティング・システムの規則間のパス名を変換します。たとえば、Windowsシステムでは、ファイル名 "/gumby/ruby/test.rb"が "\ gumby \ ruby​​ \ test.rb"として開かれます。

File.join($PWD, 'source', 'blog') 

:あなたのコードであなたのような何かができる、と述べているすべてで

"c:\\gumby\\ruby\\test.rb" 

: はRubyの文字列内のWindowsスタイルのファイル名を指定する場合、 バックスラッシュをエスケープすることを忘れないでください私はRubyの機能を利用するために、あなたのコードを別に書くつもりです:

It ARGVは文字列を返すだけなので、ARGV[0].to_sを使用する必要はありません。 values_atは、指定インデックスの値をARGVから取得できるようにします。より複雑なプログラムでは、より標準的なオプションフラグを使用できるOptionParserを使いたいでしょう。

​​

Time.now渡されたパラメータを指定せずにTime.newと同じであるが、それはそれは、現在の時刻を返すだ、もう少し何が起こっているかの指標です。 newは、新しいオブジェクトを作成していることを意味しますが、デフォルトが現在の時刻であることを暗示しません。これは微妙なことですが、可読性と保守性に役立ちます。

File.write(
    file, 
    [ 
    "---\n", 
    "title: #{title}", 
    "date: #{utctime}", 
    "tags:", 
    "description:", 
    "keywords:", 
    "shorttext:", 
    "---" 
    ].join("\n") 
) 

File.writeは自動的にファイルを作成して上書きします。

生成しているファイルの内容を見ると、実際にYAMLファイルが作成されているように見えますが、ここでもRubyが助けてくれます。私たちは、外部起動されませんので、私はかなり、1はここFile.joinを使うべき理由を、表示されていない

require 'yaml' 

title = 'the_title' 
utctime = 'the_utctime' 

foo = { 
    'title'  => title, 
    'date'  => utctime, 
    'tags'  => nil, 
    'description' => nil, 
    'keywords' => nil, 
    'shorttext' => nil 
} 

puts foo.to_yaml 

# >> --- 
# >> title: the_title 
# >> date: the_utctime 
# >> tags: 
# >> description: 
# >> keywords: 
# >> shorttext: 

:ハッシュとYAMLのシリアライザを定義することは、適切な文字列を作成することができますプログラム。パス区切り文字としてバックスラッシュを使用すると、どのような利点がありますか?

利点は、バックスラッシュを使用すると、Windowsへのパスのみが制限されることです。 * nix(Mac OSを含む)は、スラッシュを使用します。 File.joinを使用すると、Rubyは現在のOSに応じて必要なものを判断できるため、コードは実行中のどこでも透過的に動作します。以前は、ほとんどの人が考えていなかったパス区切り文字には、一部のOSが:を使用していました。それが起こった場合、Rubyは正しいことを続けなければなりません。

+0

外部のプログラムを呼び出さないので、ここでなぜ 'File.join'を使うべきなのか、理由は分かりません。パス区切り文字としてバックスラッシュを使用すると、どのような利点がありますか? – user1934428

+0

本当に素敵なものを説明していただきありがとうございます。私はyamlファイルを使用しません、markdownで新しい記事を作成するための仲買人です。ヘッダーだけがyamlです。 – Silvio

1

pathディレクトリ ここで、pathは、期待されるディレクトリへの絶対パスです。だから、あなたは必要に応じて、その後path = '~/foo'

require 'fileutils' 

def create_file(path, extension) 
    dir = File.dirname(path) 

    unless File.directory?(dir) 
    FileUtils.mkdir_p(dir) 
    end 

    path << ".#{extension}" 
    File.new(path, 'w') 
end 
1

このスクリプトは、ディレクトリが作成されますhome/fooフォルダにファイルを保存する場合:あなたはnew_fileで何もしなかった

#!/usr/bin/env ruby 

require 'fileutils' 
require 'time' 

title = ARGV[0].to_s 
language = ARGV[1].to_s 

time = Time.new 
timestamp = time.strftime('%Y-%m-%d') 
utctime = time.getutc 
extension = 'html.markdown' 

basename = timestamp + '-' + title + '.' + language + '.' + extension 
dirname = File.join(Dir.pwd, 'source', 'blog') 
FileUtils.mkpath dirname unless File.exists?(dirname) 
filename = File.join(dirname, basename) 

# new_file = File.new(filename, File::CREAT|File::TRUNC|File::RDWR, 0644) 
# NOTE: new_file wasn't used 

open(filename, 'a') { |f| 
    f << "---\n" 
    f << "title: #{title} \n" 
    f << "date: #{utctime} \n" 
    f << "tags:\n" 
    f << "description:\n" 
    f << "keywords:\n" 
    f << "shorttext:\n" 
    f << "---\n" 
} 

puts 'File created ...' 

注意を。

+0

おそらく 'makedir_p'はもっと意味があります。なぜなら、必要に応じて* source *ディレクトリも作成するからです。また、 'File.exists? 'が不要な場合には、' 'File.exists?'を不要にします。 – user1934428

+1

'makedir_p'と' mkpath'はエイリアスで、mkpathが読みやすくなっています。あなたは正しいですが、 'File.exists? 'は冗長です。既存のパスを作成しようとするとOPが混乱する可能性があるので、unless式を追加しました。 –

+0

おっと、私はもっと慎重に読んでいたはずです。あなたは 'mkdir'ではなく' mkpath'を使いました。これはもちろん、完璧です。ところで、私は個人的には、既存の経路を作成しようとすると混乱は見られませんが、これは味の問題です。 – user1934428

関連する問題