Writing to a file converting it needs a thread?


#1

i have a small script building an xml string and, afterwards, i need to
convert the string.

basically i do :
xml=""
album_list.each do |k,l|
xml=xml+"<name first="#{l[0]}" last="#{l[1]}" company="#{l[2]}"
organization="#{l[3]}"/>\n"
end
tmpFile.puts xml

system(“iconv -c -s -f MACROMAN -t UTF-8 #{tmpName} >
#{xmlDir}/#{xmlName}”)

and the resulting conversion lacks of one half a line to 26 lines,
depending the number of lines (some how randomly))

if after having done that, i launch iconv from command line by :
iconv -c -s -f MACROMAN -t UTF-8 /tmp/AddressBook-MACROMAN.xml >
AddressBook.xml

(“same” command as system("…"))

i get all the 156 lines ???

does than means system(“iconv -c …”) is started within the ruby script
before the end of “tmpFile.puts xml” in which case i’d have to sync
writing by puts and reading by iconv ?

if this is true, how to do that ?


#2

From your snippet it looks like you need to be calling .close (if
you’re done working with the file) or .flush (if not) on tmpFile
before you call an external command on it; otherwise, the File is left
open and the contents aren’t necessarily in sync with what you’ve
puts’d. When you exit the ruby process, however, the File is
automatically flush’d, so it is then in sync, so when you call iconv
from your prompt, it works as expected.
-P


#3

Patrick F. removed_email_address@domain.invalid wrote:

From your snippet it looks like you need to be calling .close (if
you’re done working with the file) or .flush (if not) on tmpFile
before you call an external command on it; otherwise, the File is left
open and the contents aren’t necessarily in sync with what you’ve
puts’d. When you exit the ruby process, however, the File is
automatically flush’d, so it is then in sync, so when you call iconv
from your prompt, it works as expected.

ok, it’s flush doing the job in my case, many thanks :wink:

also what is the best practice, writing :
xml=""
album_list.each do |k,l|
xml=xml+"<name first="#{l[0]}" last="#{l[1]}" company="#{l[2]}"
organization="#{l[3]}"/>\n"
end
tmpFile.puts xml
tmpFile.flush

or that :

album_list.each do |k,l|
tmpFile.puts “<name first=”#{l[0]}" last="#{l[1]}"
company="#{l[2]}" organization="#{l[3]}"/>\n"
end
tmpFile.flush

that’s to say writing to the file the whole result at once or each line
after each line ?

and also, if, after :

system(“iconv -c -s -f MACROMAN -t UTF-8 #{tmpName} >
#{xmlDir}/#{xmlName}”)

i suppress the temporary file like that :

system(“rm -f #{tmpName}”)

i get a warning :

…/AddressBook2vCardXml.rb:56: warning: Insecure world writable dir
/Users/yvon/work/Ruby/rubyaeosa-0.2.3/sample/, mode 040777

for this latest line
the perms in the working folder being :
-rw-rw-rw- 1 yvon yvon 12387 Dec 27 08:56 AddressBook.xml
for files
and :
-rwxrwxrwx 1 yvon yvon 1687 Dec 27 08:56 AddressBook2vCardXml.rb
for ruby scripts.

if i change the perms to :

-rwxr–r-- 1 yvon yvon 12387 Dec 27 08:56 AddressBook.xml
-rwxr–r-- 1 yvon yvon 1687 Dec 27 08:56 AddressBook2vCardXml.rb

that’s to say only user:user as right to write|exec a file in that
folder, i get the same warning with the same “mode 040777” ???

also in the /tmp directory the file perms is only :

-rw-r–r-- 1 yvon wheel 12340 Dec 27 09:07
AddressBook-MACROMAN.xml

seems to be correct for me ))
i thought it was special methods in ruby, in order to get tmp file name
???