【问题标题】:Opening a file without creating a new one打开文件而不创建新文件
【发布时间】:2014-08-02 07:19:58
【问题描述】:

我有一个 ruby​​ 函数可以访问我的 unix 文件系统中的文件。 我有 2050 个文件,每个文件代表一个专用目录中的哈希值。 该函数读取包含电子邮件地址的文件并执行散列函数,找出文件 ID 并打印。

通常我用 Java 做这些事情,但我想开始用 Ruby 做这些事情。我的问题是,在我的函数中,我尝试打开正确的文件进行读取,但是当没有提供代码块时,我看到 opennew 的工作方式相同。在 IO 类中,方法 ::openWith no associated blockIO.open::new 的同义词。

我只需要打开文件,将读取器指针设置为第一个可用行,然后写入并刷新。 为简单起见,我将把每个代码语句放在一行中。该文件应以其当前状态打开(请参阅HERE 评论)。

 def dispatch
  while (id=IDS_FILE.gets)
    bucket="#{BUCKETS}" << (PERFORM HERE THE HASH CALCULATION) ".txt"
    #HERE
    bucket_file=File.open("#{bucket}","w")
    bucket_file.write(id)
    bucket_file.close     
    end
    log "Writing #{id.chomp!} to #{bucket_file.to_path}"
  end
end

【问题讨论】:

  • IO.open 是 ::new 的同义词 意味着 IO.open 的行为与 IO.new 完全相同。它使用给定的参数创建一个 Ruby IO 对象,而不是一个文件。您需要的是w 以外的开放模式。在你的情况下,我想应该是r+
  • @ArieShaw 据我所知(我需要以当前状态打开文件)OP 实际上需要 append mode a... 但我不确定他是否真的在问。 @JBoy你能重新格式化你的问题并使用正确的解释和空格吗?
  • @DMKE 谢谢一百万! 'a' 模式正是我所需要的!
  • 我已经添加了一个答案四你接受。尽管如此,您应该编辑自己的问题并重新格式化它。未来的访客会感谢您。

标签: ruby file io


【解决方案1】:

要获得“以当前状态打开的文件”,您需要“追加模式”,as documented here:

"a"  Write-only, starts at end of file if file exists,
     otherwise creates a new file for writing.

所以你的代码应该是这样的:

File.open(bucket, "a") do |f|
  f.write id
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多