468,103 Members | 1,322 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,103 developers. It's quick & easy.

Directory listing with file info

I'd like to make a directory listing where instead of the entire
filename I need it to show the filename minus the extention and get the
value of charname= in the file itself.

I've been told that I had to turn the directory listing into an array
and then use "foreach (array as item)" to go through and open each file
but I've tried several different approaches and I just can't get it to work.

I've been able to make it list the directory in order using this script
but after that I'm lost.

<?
$list = Array();
$handle = opendir('testdir/.');
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$list[] = ($file);
}
}
closedir($handle);
sort ($list);
reset ($list);

while (list ($key, $val) = each ($list)) {
echo "<a href=test.php?name=$val>$val</a><br>";

}
?>

Here I'd like the $val after the name= to be just the filename without
the extention (all files in the directory are txt files) and then the
second $val which it shows in the list to be the value of the line
charname= in the txt files themselves.

Anybody have an idea what I should do?

Kim Jensen

Jul 17 '05 #1
15 2291
Try this:

<?
$list = Array();
$handle = opendir('../');
while (false !== ($file = readdir($handle))) {

$fileparts = explode(".",$file);
if (count($fileparts) > 1) {
array_pop($fileparts);
}
$file = join(".",$fileparts);

if ($file != "." && $file != ".." && $file != "") {
$list[] = $file;
}
}
closedir($handle);
sort ($list);
reset ($list);

while (list ($key, $val) = each ($list)) {
echo "<a href=test.php?name=$val>$val</a><br />";

}

?>

Erich Musick

Kim Jensen wrote:
I'd like to make a directory listing where instead of the entire
filename I need it to show the filename minus the extention and get the
value of charname= in the file itself.

I've been told that I had to turn the directory listing into an array
and then use "foreach (array as item)" to go through and open each file
but I've tried several different approaches and I just can't get it to
work.

I've been able to make it list the directory in order using this script
but after that I'm lost.

<?
$list = Array();
$handle = opendir('testdir/.');
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$list[] = ($file);
}
}
closedir($handle);
sort ($list);
reset ($list);

while (list ($key, $val) = each ($list)) {
echo "<a href=test.php?name=$val>$val</a><br>";

}
?>

Here I'd like the $val after the name= to be just the filename without
the extention (all files in the directory are txt files) and then the
second $val which it shows in the list to be the value of the line
charname= in the txt files themselves.

Anybody have an idea what I should do?

Kim Jensen

Jul 17 '05 #2
Kim Jensen wrote:
while (list ($key, $val) = each ($list)) {
echo "<a href=test.php?name=$val>$val</a><br>";

}

Here I'd like the $val after the name= to be just the filename without
the extention (all files in the directory are txt files)
echo '<a href="test.php?name=', substr($val, -4), ">$val</a><br";
and then the
second $val which it shows in the list to be the value of the line
charname= in the txt files themselves.


Are you really sure you want to do that?
You have top open each and every file, read/print its contents, and close
the file. It might be a lot slow!
/* needs error-checking for fopen() and fgets() */
foreach ($list as $val) {
$f = fopen($val);
while (!feof(f)) {
$line = fgets($f);
if (preg_match('/^charname=(.*)$/', $line, $matches)) {
echo '<a href="test.php?name=', urlencode(substr($val, -4)),
'">', $matches[1], '</a><br>';
break; /* leave inner while() */
}
}
fclose($f);
}
--
Mail sent to my "From:" address is publicly readable at http://www.dodgeit.com/
== ** ## !! !! ## ** ==
TEXT-ONLY mail to the complete "Reply-To:" address ("My Name" <my@address>) may
bypass the spam filter. I will answer all pertinent mails from a valid address.
Jul 17 '05 #3
This method, though, assumes that all extensions are exactly three
characters long.

What about extensions such as pl, py, h, among others?

Pedro Graca wrote:
Kim Jensen wrote:
while (list ($key, $val) = each ($list)) {
echo "<a href=test.php?name=$val>$val</a><br>";

}

Here I'd like the $val after the name= to be just the filename without
the extention (all files in the directory are txt files)

echo '<a href="test.php?name=', substr($val, -4), ">$val</a><br";

and then the
second $val which it shows in the list to be the value of the line
charname= in the txt files themselves.

Are you really sure you want to do that?
You have top open each and every file, read/print its contents, and close
the file. It might be a lot slow!
/* needs error-checking for fopen() and fgets() */
foreach ($list as $val) {
$f = fopen($val);
while (!feof(f)) {
$line = fgets($f);
if (preg_match('/^charname=(.*)$/', $line, $matches)) {
echo '<a href="test.php?name=', urlencode(substr($val, -4)),
'">', $matches[1], '</a><br>';
break; /* leave inner while() */
}
}
fclose($f);
}


--
In Christ,

Erich Musick
http://erichmusick.com

In the same way, let your light shine before others, so that they may
see your good works and give glory to your Father who is in heaven. --
Matthew 5:16 NKJV
Jul 17 '05 #4
Pedro Graca wrote:
Are you really sure you want to do that?
You have top open each and every file, read/print its contents, and close
the file. It might be a lot slow!


The problem is that the filenames themselves even if they contain the
name I'm looking for aren't really pleasing to the eye as links.

I'd rather have links that read:

Angelina Jolie
Gwynneth Paltrow
Jude Law
Michael Gambon
Sir Lawrence Olivier

than

angelinajolie
gwynnethpaltrow
judelaw
lawrenceolivier
michaelgambon

Sorry, just got home from watching Sky Captain :)

Kim Jensen

Jul 17 '05 #5
Kim Jensen wrote:
Pedro Graca wrote:
Are you really sure you want to do that?
You have top open each and every file, read/print its contents, and close
the file. It might be a lot slow!

The problem is that the filenames themselves even if they contain the
name I'm looking for aren't really pleasing to the eye as links.

I'd rather have links that read:

Angelina Jolie
Gwynneth Paltrow
Jude Law
Michael Gambon
Sir Lawrence Olivier

than

angelinajolie
gwynnethpaltrow
judelaw
lawrenceolivier
michaelgambon

Sorry, just got home from watching Sky Captain :)


Just forgot something. If I was just now creating the whole thing I
could easily use the first examples as file names, but unfortunately I
already have thousands of links using the second type of file names so
going back and changing all of them manually or even by global
search/replace would take ages.

Kim Jensen

Jul 17 '05 #6
Erich Musick top-posted (and I changed the format):
Pedro Graca wrote:
Kim Jensen wrote:
Here I'd like the $val after the name= to be just the filename without
the extention (all files in the directory are txt files)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
echo '<a href="test.php?name=', substr($val, -4), ">$val</a><br";
This method, though, assumes that all extensions are exactly three
characters long.


Yes, as the OP stated.
What about extensions such as pl, py, h, among others?


In this case, it didn't seem necessary to make a generic function -- but
I agree that would have been a better option from the start :)

--
Mail sent to my "From:" address is publicly readable at http://www.dodgeit.com/
== ** ## !! !! ## ** ==
TEXT-ONLY mail to the complete "Reply-To:" address ("My Name" <my@address>) may
bypass the spam filter. I will answer all pertinent mails from a valid address.
Jul 17 '05 #7
Pedro Graca wrote:
Are you really sure you want to do that?
You have top open each and every file, read/print its contents, and close
the file. It might be a lot slow!


About the slowness. Couldn't it be done so that it only took the files
starting with a specific letter?

So that if I want to see a listing of the files starting with A I'd open
dir.php?letter=a

Kim Jensen

Jul 17 '05 #8


Pedro Graca wrote:
Erich Musick top-posted (and I changed the format):
Pedro Graca wrote:
Kim Jensen wrote:
Here I'd like the $val after the name= to be just the filename without
the extention (all files in the directory are txt files)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

echo '<a href="test.php?name=', substr($val, -4), ">$val</a><br";


This method, though, assumes that all extensions are exactly three
characters long.

Yes, as the OP stated.


My bad - failed to notice that :)
What about extensions such as pl, py, h, among others?

In this case, it didn't seem necessary to make a generic function -- but
I agree that would have been a better option from the start :)


--
In Christ,

Erich Musick
http://erichmusick.com

In the same way, let your light shine before others, so that they may
see your good works and give glory to your Father who is in heaven. --
Matthew 5:16 NKJV
Jul 17 '05 #9
Yeah...that's a possibility
Kim Jensen wrote:
Pedro Graca wrote:
Are you really sure you want to do that?
You have top open each and every file, read/print its contents, and close
the file. It might be a lot slow!

About the slowness. Couldn't it be done so that it only took the files
starting with a specific letter?

So that if I want to see a listing of the files starting with A I'd open
dir.php?letter=a

Kim Jensen


--
In Christ,

Erich Musick
http://erichmusick.com

In the same way, let your light shine before others, so that they may
see your good works and give glory to your Father who is in heaven. --
Matthew 5:16 NKJV
Jul 17 '05 #10
[ (-: Tenzel Kim Jensen? ]

Tenzel Kim wrote:
Kim Jensen wrote:
I'd rather have links that read:

Angelina Jolie

than

angelinajolie


If I was just now creating the whole thing I
could easily use the first examples as file names, but unfortunately I
already have thousands of links using the second type of file names so
going back and changing all of them manually or even by global
search/replace would take ages.


Write a script to do that for you!

<?php
$oldfiles_dir = 'old/';
$newfiles_dir = 'new/';

foreach ($list as $val) {
/* get $charname :: fopen(), fgets(), fclose() */
copy($oldfiles_dir . $val, $newfiles_dir . $charname);
}

?>

And presto! :-)
--
Mail sent to my "From:" address is publicly readable at http://www.dodgeit.com/
== ** ## !! !! ## ** ==
TEXT-ONLY mail to the complete "Reply-To:" address ("My Name" <my@address>) may
bypass the spam filter. I will answer all pertinent mails from a valid address.
Jul 17 '05 #11
Erich Musick wrote:
Pedro Graca wrote:
Erich Musick top-posted (and I changed the format):
What about extensions such as pl, py, h, among others?


In this case, it didn't seem necessary to make a generic function -- but
I agree that would have been a better option from the start :)


What about
filename.with.a.lot.of.dots
and
filename_without_dots
?

:-)
The generic function would have to deal with them!

--
Mail sent to my "From:" address is publicly readable at http://www.dodgeit.com/
== ** ## !! !! ## ** ==
TEXT-ONLY mail to the complete "Reply-To:" address ("My Name" <my@address>) may
bypass the spam filter. I will answer all pertinent mails from a valid address.
Jul 17 '05 #12
Kim Jensen wrote:
Pedro Graca wrote:
Are you really sure you want to do that?
You have top open each and every file, read/print its contents, and close
the file. It might be a lot slow!


About the slowness. Couldn't it be done so that it only took the files
starting with a specific letter?

So that if I want to see a listing of the files starting with A I'd open
dir.php?letter=a


Or you could make a 'index' file and only open that one. Its contents
would be something like:

angelinajolie.txt Angelina Jolie
gwynnethpaltrow.txt Gwynneth Paltrow
judelaw.txt Jude Law
lawrenceolivier.txt Sir Lawrence Olivier
michaelgambon.txt Michael Gambon
Or use a database.
Of course these options assume the 'index' file and the database would
be updated for every new file ... (and deletions and changes).

--
Mail sent to my "From:" address is publicly readable at http://www.dodgeit.com/
== ** ## !! !! ## ** ==
TEXT-ONLY mail to the complete "Reply-To:" address ("My Name" <my@address>) may
bypass the spam filter. I will answer all pertinent mails from a valid address.
Jul 17 '05 #13
The code i posted earlier should work with that...

Pedro Graca wrote:
Erich Musick wrote:
Pedro Graca wrote:
Erich Musick top-posted (and I changed the format):

What about extensions such as pl, py, h, among others?

In this case, it didn't seem necessary to make a generic function -- but
I agree that would have been a better option from the start :)


What about
filename.with.a.lot.of.dots
and
filename_without_dots
?

:-)
The generic function would have to deal with them!


--
In Christ,

Erich Musick
http://erichmusick.com

In the same way, let your light shine before others, so that they may
see your good works and give glory to your Father who is in heaven. --
Matthew 5:16 NKJV
Jul 17 '05 #14
Pedro Graca wrote:
[ (-: Tenzel Kim Jensen? ]


Heh. That's the problem with having a split personality. Sometimes you
forget which is which :)

Kim Jensen or was that Tenzel Kim???

Jul 17 '05 #15
Pedro Graca wrote:
Or use a database.
I was trying to avoid using a database for now, as I know that if I went
ahead with that, it would end up being so huge in scope that I'd never
finish it :)
Of course these options assume the 'index' file and the database would
be updated for every new file ... (and deletions and changes).


I have been considering the index file approach. However, considering
the speed problem is mainly a problem I don't want my visitors to
encounter making the slow "grab the info from all the files" version
could be done on my harddrive and the output of the script I could just
copy and paste into an index page. That way the slow stuff will be done
behind the scenes.

Maybe that's the best option. Hadn't considered that until just now.

Kim Jensen

Jul 17 '05 #16

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by Hal Vaughan | last post: by
2 posts views Thread by Dean | last post: by
1 post views Thread by Vasilis Serghi | last post: by
2 posts views Thread by Martin | last post: by
8 posts views Thread by gil | last post: by
4 posts views Thread by Craig Vermeer | last post: by
8 posts views Thread by dougawells | last post: by
4 posts views Thread by techusky | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.