2009/3/8 Clancy <clanc...@cybec.com.au> > On Sun, 8 Mar 2009 12:33:15 +0000, stut...@gmail.com (Stuart) wrote: > > >2009/3/8 Clancy <clanc...@cybec.com.au> > > > >> On Sun, 8 Mar 2009 09:01:18 +0000, stut...@gmail.com (Stuart) wrote: > >> > >> >2009/3/8 Clancy <clanc...@cybec.com.au> > >> > > >> >> 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 -- http://stut.net/