# Question about file management

**URL:** <https://www.ruby-forum.com/t/question-about-file-management/180141>\
**Category:** Ruby\
**Created:** [December 12, 2009, 9:13pm UTC](https://www.ruby-forum.com/t/question-about-file-management/180141 "2009-12-12T21:13:33Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 12, 2009, 9:13pm UTC](https://www.ruby-forum.com/t/question-about-file-management/180141/1 "2009-12-12T21:13:33Z")

</div>

A salut to the list,

I need read info from a file, extract the info that I want which is the  
date and IP and dump them into a database (mysql).

However, this file gets constantly updated, sits on /var/log/.

Until now I have used just the file.open and file.read methods. However,  
I feel that both ways are not suitable for what I want to do, because I  
will need to make a selection between old and new entries every time my  
script reads the file to extract info.

What is the _standard_ (or best) way to manage this situation?

Here is the class which reads the file:

class ReadIPs  
def self.ip(log)  
file = File.open(log)  
file.each\_line do |line|  
if line.include?(“Ban”)  
a = line.split(" ")  
date = a[0]  
ip = a[6]  
puts “date: #{date} IP: #{ip}”  
end  
end  
file.close  
end  
end

I use File.open now but I should use something like File.append or  
similar? Note that I will never write to this file, it’s just the file  
that contains the info. Every time a new line appears that contains the  
word “Ban” I want to trigger this…

Best regards

Panagiotis (atmosx) Atmatzidis

email: removed\_email\_address@domain.invalid  
URL: [http://www.convalesco.org](http://www.convalesco.org)  
GnuPG ID: 0xFC4E8BB4  
gpg --keyserver x-hkp://pgp.mit.edu --recv-keys 0xFC4E8BB4

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 13, 2009, 12:30pm UTC](https://www.ruby-forum.com/t/question-about-file-management/180141/2 "2009-12-13T12:30:33Z")

</div>

On 12.12.2009 21:05, Panagiotis A. wrote:

> Here is the class which reads the file:
> 
> class ReadIPs  
> def self.ip(log)  
> file = File.open(log)

Ha! There you are not using block form of File.open and you do not have  
the #close in ensure! 🙂

> end
> 
> I use File.open now but I should use something like File.append or similar? Note that I will never write to this file, it’s just the file that contains the info. Every time a new line appears that contains the word “Ban” I want to trigger this…
> 
> Best regards

I can’t test it right now but this might be an option.

File.open log do |io|  
loop do  
io.each do |line|  
# whatever…  
end

```
 # v2: pos = io.tell
 sleep 10 # whatever interval is appropriate
 # v1: io.seek(0, IO::SEEK_SET)
 # v2: io.seek(pos, IO::SEEK_CUR)

```

end  
end

Maybe you have to do one of the variants to clear eof flag:

v1: seek to offset 0 of current position  
v2: fetch the position before the sleep and then seek to that absolute  
position

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 13, 2009, 2:38pm UTC](https://www.ruby-forum.com/t/question-about-file-management/180141/3 "2009-12-13T14:38:08Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Hello,

On 13 Î”ÎµÎº 2009, at 1:20 Î¼.Î¼., Robert K. wrote:

> > Here is the class which reads the file:
> > 
> > class ReadIPs  
> > def self.ip(log)  
> > file = File.open(log)
> 
> Ha! There you are not using block form of File.open and you do not have the #close in ensure! 🙂

I don’t understand what do you mean by ‘ensure’.

> > end  
> > io.each do |line|  
> > Maybe you have to do one of the variants to clear eof flag:
> 
> v1: seek to offset 0 of current position  
> v2: fetch the position before the sleep and then seek to that absolute position
> 
> Kind regards
> 
> robert

Oh, this solutions, might work but I think that it’s a bit  
overcomplicated for me. I did not used IO and “seek” yet…

I found online [1] a few examples but I did not had the time to test  
them.

Maybe something like:

file = File.open(path, File::WRONLY|File::APPEND)

Will do.

> –  
> remember.guy do |as, often| as.you\_can - without end  
> [http://blog.rubybestpractices.com/](http://blog.rubybestpractices.com/)

[1] [File Access](http://pleac.sourceforge.net/pleac_ruby/fileaccess.html)

Panagiotis (atmosx) Atmatzidis

email: removed\_email\_address@domain.invalid  
URL: [http://www.convalesco.org](http://www.convalesco.org)  
GnuPG ID: 0xFC4E8BB4  
gpg --keyserver x-hkp://pgp.mit.edu --recv-keys 0xFC4E8BB4

* * *

The wise man said: “Never argue with an idiot. They bring you down to  
their level and beat you with experience.”

-----BEGIN PGP SIGNATURE-----  
Version: GnuPG/MacGPG2 v2.0.12 (Darwin)

iEYEARECAAYFAksk7g0ACgkQrghUb/xOi7Q+LwCdGmvHDHouNAz5lLSd4H84M/1F  
+csAn398ysHU8qJc4vVTGtpcjHzRHX2k  
=pOA2  
-----END PGP SIGNATURE-----

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 13, 2009, 3:35pm UTC](https://www.ruby-forum.com/t/question-about-file-management/180141/4 "2009-12-13T15:35:30Z")

</div>

On 13.12.2009 14:37, Panagiotis A. wrote:

> > > What is the _standard_ (or best) way to manage this situation?
> > > 
> > > Here is the class which reads the file:
> > > 
> > > class ReadIPs  
> > > def self.ip(log)  
> > > file = File.open(log)  
> > > Ha! There you are not using block form of File.open and you do not have the #close in ensure! 🙂
> 
> I don’t understand what do you mean by ‘ensure’.

There full syntax you can have with begin end blocks is

begin  
rescue  
else  
ensure  
end

See also  
[http://blog.rubybestpractices.com/posts/rklemme/002\_Writing\_Block\_Methods.html](http://blog.rubybestpractices.com/posts/rklemme/002_Writing_Block_Methods.html)  
[http://blog.rubybestpractices.com/posts/rklemme/001-Using\_blocks\_for\_Robustness.html](http://blog.rubybestpractices.com/posts/rklemme/001-Using_blocks_for_Robustness.html)

> > > end  
> > > end  
> > > v1: seek to offset 0 of current position  
> > > v2: fetch the position before the sleep and then seek to that absolute position

> Oh, this solutions, might work but I think that it’s a bit overcomplicated for me. I did not used IO and “seek” yet…

#seek is not used in the simplest case. What about reading up on #seek  
and #tell or trying out the code? I don’t see where this is  
complicated. If that’s too complicated for you then I either my  
explanation made it look more complicated that it actually is or you  
should abandon software development. You’ll encounter far more  
complicated things in the course of it.

> I found online [1] a few examples but I did not had the time to test them.
> 
> Maybe something like:
> 
> file = File.open(path, File::WRONLY|File::APPEND)
> 
> Will do.

Will do what?

> [1] [File Access](http://pleac.sourceforge.net/pleac_ruby/fileaccess.html)

I am not sure whether pleac is a proper source to enter the world of  
ruby. AFAIK their aim is to compare languages - not to present an  
introductory read of particular languages. There are quite a few  
tutorials and books out there for Ruby.

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 13, 2009, 6:11pm UTC](https://www.ruby-forum.com/t/question-about-file-management/180141/5 "2009-12-13T18:11:09Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

hi,

On 13 Î”ÎµÎº 2009, at 4:35 Î¼.Î¼., Robert K. wrote:

> > > > Until now I have used just the file.open and file.read methods. However, I feel that both ways are not suitable for what I want to do, because I will need to make a selection between old and new entries every time my script reads the file to extract info.
> 
> [http://blog.rubybestpractices.com/posts/rklemme/001-Using\_blocks\_for\_Robustness.html](http://blog.rubybestpractices.com/posts/rklemme/001-Using_blocks_for_Robustness.html)  
> Okay

> > > > end  
> > > > # whatever…
> > > 
> > > v1: seek to offset 0 of current position  
> > > v2: fetch the position before the sleep and then seek to that absolute position
> 
> > Oh, this solutions, might work but I think that it’s a bit overcomplicated for me. I did not used IO and “seek” yet…
> 
> #seek is not used in the simplest case. What about reading up on #seek and #tell or trying out the code? I don’t see where this is complicated. If that’s too complicated for you then I either my explanation made it look more complicated that it actually is or you should abandon software development. You’ll encounter far more complicated things in the course of it.

Given the fact that I’m messing with Ruby less than 8 days, I’ll pass  
that note.

By complicated I meant that, ruby might have a build-in function or gem  
that already deals with this situation of monitoring etc.

> > I found online [1] a few examples but I did not had the time to test them.  
> > Maybe something like: file = File.open(path, File::WRONLY|File::APPEND)  
> > Will do.
> 
> Will do what?
> 
> > [1] [File Access](http://pleac.sourceforge.net/pleac_ruby/fileaccess.html)
> 
> I am not sure whether pleac is a proper source to enter the world of ruby. AFAIK their aim is to compare languages - not to present an introductory read of particular languages. There are quite a few tutorials and books out there for Ruby.

Okay, thanks

> Kind regards
> 
> robert
> 
> –  
> remember.guy do |as, often| as.you\_can - without end  
> [http://blog.rubybestpractices.com/](http://blog.rubybestpractices.com/)

Panagiotis (atmosx) Atmatzidis

email: removed\_email\_address@domain.invalid  
URL: [http://www.convalesco.org](http://www.convalesco.org)  
GnuPG ID: 0xFC4E8BB4  
gpg --keyserver x-hkp://pgp.mit.edu --recv-keys 0xFC4E8BB4

* * *

The wise man said: “Never argue with an idiot. They bring you down to  
their level and beat you with experience.”

-----BEGIN PGP SIGNATURE-----  
Version: GnuPG/MacGPG2 v2.0.12 (Darwin)

iEYEARECAAYFAkslIAwACgkQrghUb/xOi7RSswCfeBZr7n9l4Yl3l6XRjqx2/w6v  
vd8AnA+7ArZL4CCVuaoQRqt6QTZJxxHk  
=0pF6  
-----END PGP SIGNATURE-----
