如何在Ruby中的特定文件夹中创建文件

Sil*_*vio 2 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 ...'
Run Code Online (Sandbox Code Playgroud)

the*_*Man 5

Ruby 的 File 类有多种方式,但可能最适合您的目的是使用File.join. 文档说:

返回通过使用 File::SEPARATOR 连接字符串形成的新字符串。

File.join("usr", "mail", "gumby")   #=> "usr/mail/gumby"
Run Code Online (Sandbox Code Playgroud)

通过这种方式,Ruby 可以根据当前运行的操作系统自动检测在目录和文件名之间使用的分隔符。

可以使用带有固定分隔符的字符串,例如

File.join('path/to', 'file.rb')
Run Code Online (Sandbox Code Playgroud)

甚至File.join完全跳过使用,而是对路径进行硬编码并使用字符串插值:

"path/to/#{filename}"
Run Code Online (Sandbox Code Playgroud)

但是代码并不那么聪明。让 Ruby 进行疯狂提升总是好的。

Ruby 足够聪明,可以在 Windows 系统上运行时自动允许正斜杠,尽管 Windows 需要反斜杠。在IO文件进入如下:

如果可能,Ruby 将在不同操作系统约定之间转换路径名。例如,在 Windows 系统上,文件名“/gumby/ruby/test.rb”将被打开为“\gumby\ruby\test.rb”。在 Ruby 字符串中指定 Windows 样式的文件名时,请记住对反斜杠进行转义:

"c:\\gumby\\ruby\\test.rb"
Run Code Online (Sandbox Code Playgroud)

综上所述,在您的代码中,您可以执行以下操作:

File.join($PWD, 'source', 'blog')
Run Code Online (Sandbox Code Playgroud)

我会以不同的方式编写您的代码,以利用 Ruby 的功能:

require 'time'

title, language = ARGV.values_at(0, 1)
Run Code Online (Sandbox Code Playgroud)

没有必要使用,ARGV[0].to_s因为 ARGV 只返回字符串。values_at让我们从ARGV. 在更复杂的程序中,您可能希望使用 OptionParser,它允许您使用更标准的选项标志。

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

Time.nowTime.new没有传递任何参数相同,但它更能说明正在发生的事情,它返回当前时间。new暗示它正在创建一个新对象,但并不暗示默认值是当前时间。这是一件微妙的事情,但确实有助于可读性和可维护性。

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

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: 
Run Code Online (Sandbox Code Playgroud)

我不太明白为什么要在这里使用 File.join,因为我们不调用外部程序。如果我们使用反斜杠作为路径分隔符,它有什么优势?

优点是使用反斜杠只限制到 Windows 的路径。*nix(包括 Mac OS)使用正斜杠。使用File.join让 Ruby 根据当前操作系统确定需要哪个,因此代码将在它运行的任何地方透明地工作。过去有些操作系统用于:路径分隔符,这是大多数人不会想到的。如果遇到这种情况,Ruby 应该继续做正确的事情。