Minkä takia id_dir() ja file_exists() funktiot antavat väärän tuloksen silloin kun käyttää PHP:tä Windowsilla? Kun kokeilin vastaavaa Linux-palvelimella mihin kotisivut lopulta tulevat, toimii funktiot oikein.
Ensimmäisessä esimerkissä tutkitaan onko "images"-nimistä kansiota olemassa ja toisessa tutkitaan onko "images......."-nimistä kansiota olemassa.
Kansio "images" on oikeasti olemassa.
<?php header("Content-Type: text/plain"); $file = 'images/'; if (file_exists($file)) { echo "file $file exists\n"; if (is_dir($file)) { echo "dir $file exists\n"; } }
antaa tulokseksi seuraavat rivit:
file images/ exists dir images/ exists
Seuraavassa esimerkissä muuttujan arvo on seuraava: $file='images.......';
<?php header("Content-Type: text/plain"); $file = 'images.......'; if (file_exists($file)) { echo "file $file exists\n"; if (is_dir($file)) { echo "dir $file exists\n"; } }
Tämä antaa seuraavan tuloksen:
file images....... exists dir images....... exists
Minkä takia tämä ilmoittaa että kansio "images......." on olemassa? Onko kyse jostakin bugista tai ominaisuudesta jossakin? Ainoastaan "images" kansio on olemassa, kansiota "images......." ei ole.
php.net on sitä mieltä, että funktio palauttaa toden sekä tiedostosta että hakemistosta.
Onkohan tämä Windowsin ominaisuus kun esim. yrittää tehdä uutta kansiota komentorivillä esim. seuraavasti
mkdir images...
niin Windows ilmoittaa että kansio on jo olemassa, vaikka ainoastaan "images" kansio on oikeasti olemassa?
Melko varmasti pisteet lopusta jätetään kylmästi lukematta.
masse: arvatenkin juuri samasta syystä windows-ympäristössä hakemistojen ja tiedostojen nimen kirjaimien koolla ei ole merkitystä. Asia on vain opeteltava ottamaan huomioon ohjelmoitaessa.
Niin, tämähän juontaa juurensa FAT16-levyjärjestelmään, jossa tiedoston nimessä saattoi olla vain yksi piste ja sitä ennen 8 merkkiä ja sen jälkeen 3 merkkiä. Koko nimi tallennettiin 11 merkin pituiseen tilaan. Eli ei ollut varsinaisesti keinoa erottaa oliko tiedoston nimen lopussa piste vai ei.
Aihe on jo aika vanha, joten et voi enää vastata siihen.