Putting @ in front of the filetype() function does not prevent it from raising a warning (Lstat failed), if E_WARNING is enabled on your error_reporting.
The most common cause of filetype() raising this warning and not showing a filetype() in the output (it actually returns NULL) is, if you happened to pass just the 'Dir or File Name' and not the complete "Absolute or Relative Path" to that 'file or Dir'. It may still read that file and return its filetype as "file" but for Dir's it shows warning and outputs NULL.
eg:
$pathToFile = '/var/www';
$file = 'test.php';
$dir = 'somedir';
Output for filetype($file) will be returned as 'file' and possibly without any warning, but for filetype($dir), it will return NULL with the warning "Lstat failed", unless you pass a complete path to that dir, i.e. filetype($pathToFile.'/'.$dir).
This happened to me and found this solution after a lot of trial and error. Thought, it might help someone.
filetype
(PHP 4, PHP 5)
filetype — Gets file type
Descrierea
Returns the type of the given file.
Parametri
- filename
-
Path to the file.
Valorile întoarse
Returns the type of the file. Possible values are fifo, char, dir, block, link, file, socket and unknown.
Returns FALSE if an error occurs. filetype() will also produce an E_NOTICE message if the stat call fails or if the file type is unknown.
Exemple
Example #1 filetype() example
<?php
echo filetype('/etc/passwd'); // file
echo filetype('/etc/'); // dir
?>
Erori/Excepții
În cazul eșecului este emis un E_WARNING.
Note
Notă: Rezultatele acestei funcții sunt stocate în cache. Accesați clearstatcache() pentru mai multe detalii.
Începând cu PHP 5.0.0 această funcție poate fi utilizată de asemenea cu unele învelișuri URL. Referiți-vă la Supported Protocols and Wrappers pentru lista învelișurilor care susțin familia de funcționalitate stat().
Vedeți de asemenea
- is_dir() - Tells whether the filename is a directory
- is_file() - Tells whether the filename is a regular file
- is_link() - Tells whether the filename is a symbolic link
- file_exists() - Checks whether a file or directory exists
- stat() - Gives information about a file
- mime_content_type() - Detect MIME Content-type for a file (deprecated)
filetype() does not work for files >=2GB on x86 Linux. You can use stat as a workarround:
$type=trim(`stat -c%F $file`);
Note that stat returns diffenerent strings ("regular file","directory",...)
I use the CLI version of PHP on Windows Vista. Here's how to determine if a file is marked "hidden" by NTFS:
<?php
function is_hidden_file($fn) {
$attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA'));
if($attr[3] === 'h')
return true;
return false;
}
?>
Changing <?php if($attr[3] === 'h') ?> to <?php if($attr[4] === 's') ?> will check for system files.
This should work on any Windows OS that provides DOS shell commands.
There are 7 values that can be returned. Here is a list of them and what each one means
block: block special device
char: character special device
dir: directory
fifo: FIFO (named pipe)
file: regular file
link: symbolic link
unknown: unknown file type
