如何在Ruby

时间:2016-12-12 19:32:13

标签: ruby file

如何修复脚本以便将文件保存在$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 ...'

3 个答案:

答案 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_svalues_at让我们从ARGV获取给定索引的值。在更复杂的程序中,您希望使用OptionParser,它允许您使用更标准的选项标记。

time = Time.now
timestamp = time.strftime('%Y-%m-%d')
utctime = time.getutc
file = "#{ timestamp }-#{ title }.#{ language }.html.markdown"

Time.nowTime.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执行任何操作。