2009/3/8 Clancy <clancy_1@xxxxxxxxxxxx>
On Sun, 8 Mar 2009 12:33:15 +0000, stuttle@xxxxxxxxx (Stuart) wrote:
2009/3/8 Clancy <clancy_1@xxxxxxxxxxxx>
On Sun, 8 Mar 2009 09:01:18 +0000, stuttle@xxxxxxxxx (Stuart) wrote:
2009/3/8 Clancy <clancy_1@xxxxxxxxxxxx>
I want to index the files on a website recursively. The program will
run
in
the site root
directory, which GETCWD reports as D:/Websites/Website_1. I can open
any
file in the root
directory simply using its file name; Joe.dat, for example, and I can
opendir for any
subdirectory; eg
opendir(Subdirectory_1);
but opendir () does not seem to work, and the only way I can find to
open
the root
directory is to give its full path; eg
opendir (D:/Websites/Website_1);
I have got the program working by using the full path to open the
root
directory, and then
using relative paths to open the subdirectories and individual files,
but
this seems
rather a kludge, and I am wondering if there is a way to open the
root
directory without
specifying an absolute path?
The current working directory cannot be trusted to be "right". The best
option is to use dirname(__FILE__) and add '/..' as many times as
needed
to
get from the current file to the document root you're after.
It has always worked for me. But then I never change directory. But
both
give a hardware
dependent answer;
echo '<p>Current directory is '.__FILE__.', CWD is '.getcwd().'</p>';
gives
Current directory is D:\Websites\Corybas\Cydaldev\Dev\Testbed_2.php, CWD
is
D:\Websites\Corybas.
Not sure what you mean by a hardware-dependent answer. The current working
directory for any given script is determined by the web server and so it
cannot be assumed to be the location of the current script.
dirname(__FILE__) will give you the directory the current script is in.
I agree that 'hardware dependent' was not the right word, but what I meant
was that if I
am running the local version of my program getcwd() will return
'D:\Websites\Corybas',
where as if I am running the remote version it will return
'home/Corybasftp/www'.
This should be irrelevant in your code, something you can achieve using
dirname(__FILE__).
My webpage is always launched by loading index.php from the root directory,
and I don't
think I ever change the working directory, so although the code actually
being executed at
any given time is usually in a subdirectory, getcwd() will reliably return
the (system
dependent) long definition of the root directory.
Either I'm not explaining this well enough or you're just not getting it.
Ignore the current working directory - it's not reliable. If every page is
created by a single script then the solution is to define a constant at the
top of that script that gives you the directory that script is in....
define('ROOT_DIR', dirname(__FILE__));
Then when you need to refer to another file in your directory structure you
do so relative to the location of index.php. So if you have a directory
named arse in the same folder as index.php you'd refer to that like so...
ROOT_DIR.'/arse'
If that's not clear maybe this will help:
http://dev.stut.net/php/dirname.php
Based on that the following should work in your particular situation, but
rather than just using this I encourage you to understand why it works...
opendir(dirname(__FILE__).'/../Cydaldev');
Looking into this I did find that 'opendir('Albums/../');', where 'Albums'
can be any
subdirectory I know to be present, will reliably open the root directory.
You clearly haven't looked into this at all since you're still not using
dirname(__FILE__), and if this email complete with the example script above
doesn't get the point across I give up. Have you even looked up dirname in
the manual? http://php.net/dirname
As a result of what seems to me to be an oversight in the design of
opendir(), in that
opendir(Fred) and opendir(Fred/Nurg) will open the appropriate sub
directories but
opendir() will not open the root directory, I can readily index all the
subdirectories by
giving their relative paths, but I have to resort to a kludge to index the
root directory,
and another kludge to eliminate this kludge from the index.
As in the example script I've posted above you can refer to the current
working directory with a single period (.), but this is still relying on the
current working directory being what you expect it to be.
If, as it seems, I have to accept this it is fairly immaterial which kludge
I actually
use.
There is no need to use a "kludge". I encourage you to read my replies
carefully if you're still not getting it.
-Stuart