这是整个ruby程序:
#!/usr/bin/env rubyrequire 'rubygems'require 'fileutils' #for fileUtils.mv('your file','new location')class RavenParser rawDir = Dir.glob("*.txt") count = 0 rawDir.each do |ravfile| #we have selected every text file,so Now we have to search through the file #and make the needed changes. rav = file.open(ravfile,"r+") do |modRav| #Now we've opened the file,and we need to do the operations. if modRav lines = file.open(modRav).readlines lines.each { |line| if line.match /\[RAVEN_START:.*\]/ line.gsub!(/\[RAVEN_START:/,'raven was here '+line) count = count + 1 end } printf("Total Changed: %d\n",count) else printf("No txt files found. \n") end end #end of file replacing instructions. end # Send
程序运行并编译正常,但是当我打开文本文件时,文件中的任何文本都没有变化.正确计数增量(即,它等于[RAVEN_START:跨所有文件的实例数],但实际替换未能发生(或至少不保存更改).
我的语法是在gsub上!不正确的?我做错了什么吗?
解决方法 您正在读取数据,更新数据,然后忽略将数据写回文件.你需要这样的东西:# And save the modifIEd lines.file.open(modRav,'w') { |f| f.puts lines.join("\n") }
紧接在此之前或之后:
printf("Total Changed: %d\n",count)
正如下面的DMG注释,只是覆盖文件不是正确的偏执,因为你可能会在写入过程中被中断并丢失数据.如果你想成为偏执狂(我们所有人都应该是因为他们真的想要我们),那么你想写一个temporary file然后做一个原子重命名来替换原来的新文件.重命名通常仅在您保留在单个文件系统中时才起作用,因为无法保证OS的临时目录(默认情况下Tempfile使用)与modRav位于同一文件系统上,因此File.rename
甚至可能不是Tempfile的选项除非采取预防措施.但是Tempfile构造函数接受一个tmpdir参数,所以我们保存了:
modRavDir = file.dirname(file.realpath(modRav))tmp = Tempfile.new(modRav,modRavDir)tmp.write(lines.join("\n"))tmp.closefile.rename(tmp.path,modRav)
您可能希望将其粘贴在单独的方法(也许是safe_save(modRav,lines))中,以避免进一步混乱您的块.
总结以上是内存溢出为你收集整理的ruby – 为什么不gsub!改变我的文件?全部内容,希望文章能够帮你解决ruby – 为什么不gsub!改变我的文件?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)