Chcę utworzyć katalog, jeśli jeszcze nie istnieje.
Czy is_dir
wystarczy użyć do tego celu?
if ( !is_dir( $dir ) ) {
mkdir( $dir );
}
Czy mam połączyć is_dir
z file_exists
?
if ( !file_exists( $dir ) && !is_dir( $dir ) ) {
mkdir( $dir );
}
or
/and
oprócz||
/&&
.&&
jest tu przydatny, ponieważ jeśli plik nie istnieje (!file_exists($dir) == true
), na pewno nie jest to katalog. A jeśli plik istnieje,!is_dir($dir)
nie zostanie sprawdzony, ponieważ!file_exists($dir)
powróci,false
a&&
operator jest zwarty .Odpowiedzi:
Oba zwrócą prawdę w systemach uniksowych - w Unixie wszystko jest plikiem, w tym katalogami. Ale aby sprawdzić, czy ta nazwa jest zajęta, sprawdź oba. Może istnieć zwykły plik o nazwie „foo”, który uniemożliwiłby utworzenie katalogu o nazwie „foo”.
źródło
is_writable
, prawda?źródło
# The following directives force the content-type application/octet-stream # and force browsers to display a download dialog for non-image files. # This prevents the execution of script files in the context of the website: #ForceType application/octet-stream Header set Content-Disposition attachment <FilesMatch "(?i)\.(gif|jpe?g|png)$"> ForceType none Header unset Content-Disposition </FilesMatch> # The following directive prevents browsers from MIME-sniffing the content-type. # This is an important complement to the ForceType directive above: Header set X-Content-Type-Options nosniff
mkdir
- dlaczego nie przekazałeś po prostu „$ filename”?Myślę, że realpath () może być najlepszym sposobem na sprawdzenie poprawności, jeśli istnieje ścieżka http://www.php.net/realpath
Oto przykładowa funkcja:
Krótka wersja tej samej funkcji
Przykłady wyników
Stosowanie
źródło
Drugi wariant kwestionowanego postu nie jest w porządku, ponieważ jeśli masz już plik o tej samej nazwie, ale nie jest to katalog,
!file_exists($dir)
wrócifalse
, folder nie zostanie utworzony, więc"failed to open stream: No such file or directory"
wystąpi błąd . W systemie Windows istnieje różnica między typami „plików” i „folderów”, więc należy używaćfile_exists()
iis_dir()
jednocześnie, na przykład:źródło
źródło
źródło
dodaj true po 0777
źródło
Zamiast sprawdzać oba, możesz to zrobić
if(stream_resolve_include_path($folder)!==false)
. Jest wolniejszy, ale zabija dwa ptaki jednym strzałem.Inną opcją jest po prostu zignorowanie
E_WARNING
, nie za pomocą@mkdir(...);
(ponieważ po prostu zrezygnuje ze wszystkich możliwych ostrzeżeń, nie tylko katalog już istnieje), ale przez zarejestrowanie określonej procedury obsługi błędów:źródło
Miałem te same wątpliwości, ale zobacz dokumentację PHP:
https://www.php.net/manual/en/function.file-exists.php
https://www.php.net/manual/en/function.is-dir.php
Zobaczysz, że is-dir ma obie właściwości.
źródło
To stare, ale wciąż aktualne pytanie. Wystarczy przetestować za pomocą funkcji
is_dir()
lubfile_exists()
obecność pliku.
lub..
w testowanym katalogu. Każdy katalog musi zawierać następujące pliki:źródło
Tak właśnie robię
źródło
Sposób sprawdzenia, czy ścieżka to katalog, może być następujący:
źródło