Sinnbeck
Sinnbeck

Reputation: 667

Check if FTP entry is file or folder with PHP

I am working on a script for connecting to an FTP and then download the content.

Now my problem is to detect whether a each item is a folder or a file. My first idea was to try and use ftp_chdir, but this would require me to suppress the error using @, and I don't wish to do this (I don't wish to suppress errors, but instead prefer to handle them correctly).

Is there another way to check if a my items are files or folders?

Upvotes: 4

Views: 5790

Answers (3)

MiraTech
MiraTech

Reputation: 1312

You can create your own custom function:

function ftp_is_directory($ftp_conn, $dir)
{
    $pushd = ftp_pwd($ftp_conn);

    if ($pushd !== false && @ftp_chdir($ftp_conn, $dir))
    {
        ftp_chdir($ftp_conn, $pushd);   
        return true;
    }

    return false;
} 

Upvotes: 0

Martin Prikryl
Martin Prikryl

Reputation: 202262

The bad thing about trying the ftp_chdir is not the need to suppress the errors. That's ok, as long as you have a legitimate reason to expect an error. It's rather the side affect of changing the directory.

If I take that direction, I'd try the ftp_size instead, as it does not have any side effects. It should fail for directories and succeed for files.


The ideal solution is to use the MLSD FTP command that returns a reliable machine-readable directory listing. But PHP supports that only since 7.2 with its ftp_mlsd function. Check the "type" entry for dir value.

Or, there's an implementation of the MLSD in user comments of the ftp_rawlist command:
https://www.php.net/manual/en/function.ftp-rawlist.php#101071

First check if your FTP server supports MLSD before taking this approach, as not all FTP servers do (particularly IIS and vsftpd don't).


Or, if you are connecting to one specific server, so you know its format of directory listing, you can use the ftp_rawlist, and parse its output to determine, if the entry is file or folder.

Typical listing on a *nix server is like:

drwxr-x---   3 vincent  vincent      4096 Jul 12 12:16 public_ftp
drwxr-x---  15 vincent  vincent      4096 Nov  3 21:31 public_html
-rwxrwxrwx   1 vincent  vincent        11 Jul 12 12:16 file.txt

It's the leading d that tells you, if the entry is a directory or not.


You may be lucky and in your specific case, you can tell a file from a directory by a file name (i.e. all your files have an extension, while subdirectories do not).

Upvotes: 4

Artem V.
Artem V.

Reputation: 631

In case someone need this in 2018+

You can use ftp_nlist. For files you'll retrieve array with only one element (the file path itself), for directories you'll have at least two items in array . and .., and if no file or directory exists there will be an empty array returned.

Upvotes: 0

Related Questions