web-dev-qa-db-ja.com

scandirから隠しファイルを除外する

次のコードを使用して、ディレクトリ内の画像のリストを取得しています。

$files = scandir($imagepath);

だが $filesには隠しファイルも含まれます。それらを除外するにはどうすればよいですか?

33
Sino

Unixでは、 preg_grep ドットで始まるファイル名を除外するには:

$files = preg_grep('/^([^.])/', scandir($imagepath));
65
mario

私は、ドットファイルを無視する簡単な方法を提供するこのようなものにDirectoryIteratorを使用する傾向があります。

$path = '/your/path';
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot()) continue;
    $file =  $path.$fileInfo->getFilename();
}
5
robjmills
function nothidden($path) {
    $files = scandir($path);
    foreach($files as $file) {
        if ($file[0] != '.') $nothidden[] = $file;
        return $nothidden;
    }
}

この機能を使用するだけです

$files = nothidden($imagepath);
4
$files = array_diff(scandir($imagepath), array('..', '.'));

または

$files = array_slice(scandir($imagepath), 2);

より速いかもしれません

$files = preg_grep('/^([^.])/', scandir($imagepath));
1
Agnel Vishal

あなたは隠しファイルを「フィルタリング」しようとしているので、それはより理にかなっており、これを行うのが最適だと思います...

$items = array_filter(scandir($directory), function ($item) {
    return 0 !== strpos($item, '.');
});

また、変数$filesを呼び出すことはありません。変数がファイルのみを含むことを意味しますが、実際にはディレクトリを取得することもできます...場合によっては:)

1
TiMacDonald

Windowsシステム専用のphp.netからのコメントに遭遇しました: http://php.net/manual/en/function.filetype.php#87161

アーカイブのためにここで引用:

WindowsバージョンではCLIバージョンPHPを使用します。NTFSによってファイルが「非表示」とマークされているかどうかを確認する方法は次のとおりです。

_function is_hidden_file($fn) {

    $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA'));

    if($attr[3] === 'h')
        return true;

    return false;
}
_

if($attr[3] === 'h')if($attr[4] === 's')に変更すると、システムファイルがチェックされます。

これは、DOSシェルコマンドを提供するWindows OSで動作するはずです。

1
Oytun

preg_grepを使用して、たとえば.

$dir = "images/";
$files = preg_grep('/^([^.])/', scandir($dir));

http://php.net/manual/en/function.preg-grep.php

1
Vrushal Raut

隠しファイルが.で始まると仮定すると、出力時に次のようなことができます:

foreach($files as $file) {
    if(strpos($file, '.') !== (int) 0) {
        echo $file;
    }
}

ここで、最初の文字として.が存在しない場合はすべてのアイテムをチェックし、そうでない場合は希望どおりにエコーします。

0
stefandoorn

配列インデックスもリセットして順序を設定する場合は、次のコードを使用します。

$path = "the/path";
$files = array_values(
    preg_grep(
        '/^([^.])/', 
        scandir($path, SCANDIR_SORT_ASCENDING)
));

1行:

$path = "daten/kundenimporte/";
$files = array_values(preg_grep('/^([^.])/', scandir($path, SCANDIR_SORT_ASCENDING)));
0
Black