Jump to content

PECL ZIP extension module: line endings affect .zip format validity


e11j4y

Recommended Posts

On Windows, the PECL ZIP extension module (ZipArchive class) appears to create invalid .zip archives when compressing files that contain '\n' line endings.

Doing something simple like this:

$zip = new ZipArchive();
$filename = "./test.zip";
if ($zip->open($filename, ZIPARCHIVE::CREATE)===TRUE) {
  $zip->addFile("test.txt","text.txt");
  $zip->close();
}

where test.txt contains '\n' line endings results in a .zip archive that isn't valid, ie it cannot be opened using tools like WinZip. However, when test.txt contains '\r\n' line endings, the archive created is valid and can be opened without error. If the files to be archived are mixed -- some with '\n' endings and some with '\r\n' -- the resulting archive can be opened, however those files with '\r\n' endgins can't be extracted.

Has anyone else observed this? Any suggestions for a workaround (apart from modifying the line endings of the files to be archived)? There seems to be a similar bug here [url=http://pecl.php.net/bugs/bug.php?id=8711]http://pecl.php.net/bugs/bug.php?id=8711[/url], however I'm not sure it's quite the same problem.

I've tried:
. setting auto_detect_line_endings to 'On'.
. using ZIPARCHIVE::OVERWRITE instead of ZIPARCHIVE::CREATE.

This is on:
- Zip version 2.0.0, Libzip version 0.7.1
- PHP 5.2.0 (Built Oct 03, 2006)
- Apache 2.0.52
- Windows XP Pro
Link to comment
Share on other sites

I don't see any other way of doing it. To me this is short coming of PHP, not the script. In other languages like Perl, line endings are always internally handled, even using the PHP.INI setting does not always get it right. This only happens on the windows version of PHP, I've not seen it happen once on Linux. There is a patch that you can apply to make all IO functions follow Perl's way of handling line endings on windows, which is pretty nifty. So that you understand the diferance between Perl and PHP here is a simple example write example!

// perl, write Unix / Linux style line endings on Windows

[code]open DAT, '>perl.txt';
for ( $i = 0; $i < 50; $i++ )
{
print DAT $i . "\n";
}
close DAT;[/code]

// php

[code]<?

$io = fopen ( 'php.txt', 'w' );

for ( $i = 0; $i < 50; $i++ )
{
fputs ( $io, $i . "\n" );
}

fclose ( $io );

?>[/code]


After, open each file in notepad, you will see PHP does not convert line ending to \r\n, while Perl does, it's done in a way that makes it read as \r\n on windows, but still be \n on Unix / Linux.


me!
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.