現在の位置: ホーム> 最新記事一覧> zip_read関数を使用してfile_exists()とmkdir()を組み合わせて、ディレクトリを自動的に作成する機能を実現する方法は?

zip_read関数を使用してfile_exists()とmkdir()を組み合わせて、ディレクトリを自動的に作成する機能を実現する方法は?

M66 2025-06-12

ZIP圧縮ファイルを使用する場合、特にマルチレベルのディレクトリ構造を含む圧縮パッケージを減圧する場合、ターゲットディレクトリが存在することを確認することが非常に重要なステップです。それ以外の場合、宛先パスが存在しないため、ファイルが失敗する可能性があります。この記事では、 zip_read()関数を使用してzipファイルの各エントリを読み取り、 file_exists()mkdir()を組み合わせて必要なディレクトリを自動的に作成し、安定したファイル抽出プロセスを実現する方法を紹介します。

1。前提条件

PHP環境にZIP拡張機能が有効になっていることを確認してください。次のコードを使用して検出できます。

 <?php
if (!class_exists('ZipArchive')) {
    die('Zip 拡張機能が有効になっていません');
}
?>

2。サンプルコード分析

以下は、ZIPファイルからファイルとディレクトリの読み取りを実装し、ディレクトリ構造を自動的に作成する完全なサンプルコードです。

 <?php
$zipPath = 'example.zip'; // ZIP ファイルパス
$extractTo = 'output/';   // ディレクトリを解凍します

$zip = zip_open($zipPath);
if (!is_resource($zip)) {
    die('開くことができません ZIP 書類');
}

while ($entry = zip_read($zip)) {
    $entryName = zip_entry_name($entry);
    $fullPath = $extractTo . $entryName;

    // ディレクトリパスを取得します
    $dir = dirname($fullPath);

    // ディレクトリを自動的に作成します
    if (!file_exists($dir)) {
        mkdir($dir, 0777, true);
    }

    // 如果是書類,コンテンツを読んで書いてください
    if (zip_entry_open($zip, $entry, "r")) {
        $content = zip_entry_read($entry, zip_entry_filesize($entry));
        file_put_contents($fullPath, $content);
        zip_entry_close($entry);
    }
}

zip_close($zip);
?>

3。詳細な説明

  1. zip_open()
    zipファイルを開き、リソースハンドルを返すために使用されます。

  2. zip_read()およびzip_entry_name()
    zip_read()によって圧縮パッケージのエントリを1つずつ読み取り、zip_entry_name()を使用してエントリへの相対パスを取得します。

  3. dirname()抽出ディレクトリパス
    ファイルであろうとディレクトリであろうと、dirname()を使用してパスパーツを抽出し、ディレクトリが存在するかどうかを確認します。

  4. file_exists()はmkdir()と組み合わせて使用​​されます

    • file_exists()は、ディレクトリが既に存在するかどうかを判断するために使用されます。

    • MKDIR()は、3番目のパラメーターを使用してTRUEを設定して、再レベルディレクトリを再帰的に作成します。

  5. ファイルコンテンツを書き込み
    現在のエントリがファイルの場合、宛先パスに開かれ、読み取り、書き込まれます。

4.実際のシナリオの例

http://m66.net/files/archive.zipから圧縮パッケージをダウンロードしたとします。減圧後、元の構造を保持したいと考えています。 $ zippathを変更するだけです:

 $zipPath = 'http://m66.net/files/archive.zip'; // 知らせ:zip_open 直接使用はサポートされていません URL,最初にローカルエリアにダウンロードする必要があります

file_get_contents()およびfile_put_contents()を使用して、ファイルをローカルに保存できます。

 $tempZip = 'temp_archive.zip';
file_put_contents($tempZip, file_get_contents('http://m66.net/files/archive.zip'));

次に、 $ zippathを$ tempzipに置き換えます。

5。概要

zip_read()file_exists() 、およびmkdir()を組み合わせることにより、パスの存在によって引き起こされるエラーを心配することなく、zipファイルコンテンツとディレクトリ作成の自動抽出を効率的に実装できます。この方法は、複雑なディレクトリ構造でZIPファイルを減圧し、スクリプトの堅牢性と使いやすさを改善するのに特に適しています。