如何修复脚本以便将文件保存在$PWD/source/blog
?
#!/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 :(得分:4)
Ruby的File类有多种方式,但最好的方法是使用File.join
。文档说:
返回通过使用File :: SEPARATOR连接字符串形成的新字符串。
File.join("usr", "mail", "gumby") #=> "usr/mail/gumby"
这样做允许Ruby根据当前运行的操作系统自动检测目录和文件名之间使用的分隔符。
你可以使用带有固定分隔符的字符串,例如
File.join('path/to', 'file.rb')
甚至完全跳过使用File.join
,而是硬编码路径并使用字符串插值:
"path/to/#{filename}"
然后代码并不聪明。让Ruby做疯狂的提升总是好的。
Ruby足够智能,可以在Windows系统上运行时自动允许正斜杠,尽管Windows需要反斜杠。 IO documentation进入了:
Ruby会在不同的操作系统约定之间转换路径名 可能。例如,在Windows系统上的文件名 &#34; /gumby/ruby/test.rb"将作为&#34; \ gumby \ ruby \ test.rb&#34;打开。什么时候 在Ruby字符串中指定Windows样式的文件名,记得逃避 反斜线:
"c:\\gumby\\ruby\\test.rb"
尽管如此,在您的代码中,您可以执行以下操作:
File.join($PWD, 'source', 'blog')
我以不同的方式编写代码,以利用Ruby的功能:
require 'time'
title, language = ARGV.values_at(0, 1)
由于ARGV仅返回字符串,因此无需使用ARGV[0].to_s
。 values_at
让我们从ARGV
获取给定索引的值。在更复杂的程序中,您希望使用OptionParser,它允许您使用更标准的选项标记。
time = Time.now
timestamp = time.strftime('%Y-%m-%d')
utctime = time.getutc
file = "#{ timestamp }-#{ title }.#{ language }.html.markdown"
Time.now
与Time.new
相同,没有传递任何参数,但它更能说明发生了什么,它会返回当前时间。 new
表示它创建了一个新对象,但并未暗示默认值是当前时间。这是一个微妙的事情,但确实有助于提高可读性和可维护性。
File.write(
file,
[
"---\n",
"title: #{title}",
"date: #{utctime}",
"tags:",
"description:",
"keywords:",
"shorttext:",
"---"
].join("\n")
)
File.write
会自动创建并覆盖该文件。
查看您正在生成的文件内容,看起来您实际上正在创建一个YAML文件,而且Ruby可以帮助那里。定义散列,YAML序列化器可以创建正确的字符串:
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:
我不太清楚原因,为什么人们应该在这里使用File.join,因为我们不会调用外部程序。如果我们使用反斜杠作为路径分隔符,它有什么优势?
优点是使用反斜杠限制了仅限Windows的路径。 * nix(包括Mac OS)使用正斜杠。使用File.join
可以让Ruby根据当前的操作系统确定需要哪些代码,因此代码在任何运行的地方都可以透明地工作。在过去,一些操作系统使用:
作为路径分隔符,大多数人都不会想到这一点。如果遇到这种情况,Ruby应继续做正确的事。
答案 1 :(得分:1)
以下代码在提供path
目录时创建文件
其中path
是预期目录的绝对路径。因此,如果要将文件保存到home/foo
文件夹,则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
答案 2 :(得分:1)
此脚本根据需要创建目录:
#!/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 ...'
请注意,您没有对new_file
执行任何操作。