Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Tie::Filesystem - request for review

by erikharrison (Deacon)
on Jun 23, 2004 at 05:02 UTC ( #368945=perlquestion: print w/ replies, xml ) Need Help??
erikharrison has asked for the wisdom of the Perl Monks concerning the following question:

It's been awhile, so pardon if this should go in Meditations.

I've been tinkering around with writing a filemanager in Perl for a while. For implementing basic functionality the abstraction that kept coming to me was to see the filesystem as a hash of hashes and scalars. The following tie is a first cut at that.

package Tie::Filesystem; use warnings; use strict; our $DIR_SEP = '/'; sub TIEHASH { my $class = shift; my $root = shift || '/'; bless {root => $root}, $class; } sub FETCH { my $self = shift; my $leaf = shift; my $pathname = $self->{'root'} . $DIR_SEP . $leaf; return undef unless -e $pathname; if (-d $pathname) { my %dir; tie %dir, 'Tie::Filesystem', $pathname; return \%dir; } return $pathname; #in the future, possibly return something useful } sub EXISTS { my $self = shift; my $leaf = shift; return -e ($self-{'root'} . $DIR_SEP . $leaf); } sub FIRSTKEY { my $self = shift; opendir DIR, $self->{'root'} or return undef; $self->{'dir_handle'} = \*DIR; #This magic allows NEXTKEY to work al +most sanely; return readdir DIR; } sub NEXTKEY { my $self = shift; my $dir = $self->{'dir_handle'}; return undef unless $dir; my $entry = readdir $$dir; closedir $$dir unless $entry; return $entry; } 1;

The first bit of Perl I've written in a long while follows. It passes my preliminary test code, but I'm sure it's full of bugs and gotchas. I'm hoping some of y'all could give it a look, and tell me what you think. Specifically, are there any obvious bugs, and what feature would seem useful extensions of the current behavior?

Cheers,
Erik

Light a man a fire, he's warm for a day. Catch a man on fire, and he's warm for the rest of his life. - Terry Pratchet

Comment on Tie::Filesystem - request for review
Download Code
Re: Tie::Filesystem - request for review
by BrowserUk (Pope) on Jun 23, 2004 at 06:02 UTC

    On the surface, this looks vaguely similar to Tie::Dir?


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail
    "Memory, processor, disk in that order on the hardware side. Algorithm, algoritm, algorithm on the code side." - tachyon

      Similar. The difference is that Tie::Dir returns a stat for the value of each key. Tie::Filesystem returns another tied hash for directories. I haven't decided what to return in for files yet.

      use Tie::Filesytem; tie %root, Tie::Filesystem; print "Perl Found!" if exists $root{usr}->{bin}{perl};
      Cheers,
      Erik

      Light a man a fire, he's warm for a day. Catch a man on fire, and he's warm for the rest of his life. - Terry Pratchet

        You mean like a filehandle or a scalar? I'd like to be able to open a data file with $root->{tmp}->{data.txt}.

        The idea of just reading and writing a file by assigning to a hash is very tempting, although getting a filehandle back might be better if it has to be passed to other functions.

        If you add either, I could see myself using it heavily, not the least because it would allow me to transparently fake a filesystem. VFS perl style. Woo hoo!

        ___________________
        Jeremy
        I didn't believe in evil until I dated it.

        I have some XML data that's hierarcically orgainzed and stored within the filesystem. Each data file is relatively small. Slurping and writing the data back out using a hash assignment would make for a nice interface to my data.

        A feature that allowed me to return a list of files filtered by access or change time would be also be useful.
Re: Tie::Filesystem - request for review
by Aragorn (Curate) on Jun 23, 2004 at 07:48 UTC
    To make it nice and portable, consider using File::Spec (or its functional sibling File::Spec::Functions. Using that, you don't have to have the DIR_SEP variable, as you can use catdir. For example:
    my $pathname = $self->{'root'} . $DIR_SEP . $leaf;
    becomes
    my $pathname = catdir($self->{'root'}, $leaf);
    Also
    return -e ($self-{'root'} . $DIR_SEP . $leaf);
    will probably not do what you expect. New testcase ;-)

    Arjen

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://368945]
Approved by chromatic
Front-paged by chromatic
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (17)
As of 2015-07-02 19:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (44 votes), past polls