2016-06-04 8 views
1

Ich versuche, eine JSON-Datei zu erstellen und zu schreiben.Ruby: Warum kann ich keine neue Datei erstellen?

Mein Code sieht wie folgt aus:

def save_as_json(object) 
    f = File.new('file.json') 
    f.puts(object.to_json, 'w') 
    f.close 
end 

save_as_json({'name'=>'fred'}) 

Das Problem ist, erhalte ich die folgende Fehlermeldung, wenn ich es laufen:

:15:in `initialize': No such file or directory @ rb_sysopen - file.json (Errno::ENOENT) 

Ich frage Rubin die Datei zu erstellen, aber es beschwert dass es nicht existiert! Was ist der richtige Weg, um eine Datei zu erstellen und in sie zu schreiben?

Antwort

3

Sie müssen nur die Datei öffnen, mit dem ‚w‘ Modus wie folgt aus:

f = File.new('file.json', 'w') 

Sie wollen den Modus bestimmen, auf das, was Sie vorhaben, mit der Datei zu tun, aber hier sind Ihre Möglichkeiten:

"r" Read-only, starts at beginning of file (default mode).

"r+" Read-write, starts at beginning of file.

"w" Write-only, truncates existing file to zero length or creates a new file for writing.

"w+" Read-write, truncates existing file to zero length or creates a new file for reading and writing.

"a" Write-only, each write call appends data at end of file. Creates a new file for writing if file does not exist.

"a+" Read-write, each write call appends data at end of file. Creates a new file for reading and writing if file does not exist.

IO Docs

1

Dateierstellung Standardwerte-Modus zu lesen, so versucht, eine Dateispezifikation zu verwenden, die nicht zu einem Fehler führen nicht vorhanden ist:

2.3.0 :001 > f = File.new 'foo' 
Errno::ENOENT: No such file or directory @ rb_sysopen - foo 

Sie müssen angeben, ‚w‘:

2.3.0 :002 > f = File.new 'foo', 'w' 
=> #<File:foo> 

Das heißt, es gibt einfachere Wege, um Dateien zu schreiben, als ein Datei-Handle zu erhalten File.new oder File.open verwenden. Der einfachste Weg, in Ruby ist File.write zu nennen:

File.write('file.json', object.to_json) 

Sie den längeren File.open Ansatz verwenden können, wenn Sie wollen; wenn Sie das tun, ist der einfachste Ansatz um einen Block zu File.open weitergeben müssen:

File.open('file.json', 'w') { |f| f << object.to_json } 

dies die Notwendigkeit für Sie explizit schließen Sie die Datei eliminiert; File.open, wenn ein Block übergeben wird, schließt die Datei für Sie, nachdem der Block die Ausführung beendet hat.

+0

Ohne einen Block File.open ist das gleiche wie File.new. http://ruby-doc.org/core-2.3.0/File.html#method-c-open – kirlev

+0

Wow, du hast Recht, ich hätte das wissen müssen. Ich werde meine Antwort ändern, um das zu reflektieren. Entschuldigung ... –

+0

Beachten Sie, dass es bei einem Aufruf, der so trivial wie File.write ist, nicht mehr notwendig ist, eine separate Wrapper-Methode dafür zu schreiben. –

Verwandte Themen