@@ -256,33 +256,36 @@ public function addFile($file, $fileinfo = '')
256256 throw new ArchiveIOException ('Archive has been closed, files can no longer be added ' );
257257 }
258258
259- $ fp = @fopen ($ file , 'rb ' );
260- if (!$ fp ) {
261- throw new ArchiveIOException ('Could not open file for reading: ' .$ file );
262- }
263-
264259 // create file header
265260 $ this ->writeFileHeader ($ fileinfo );
266261
267- // write data
268- $ read = 0 ;
269- while (!feof ($ fp )) {
270- $ data = fread ($ fp , 512 );
271- $ read += strlen ($ data );
272- if ($ data === false ) {
273- break ;
262+ // write data, but only if we have data to write.
263+ // note: on Windows fopen() on a directory will fail, so we prevent
264+ // errors on Windows by testing if we have data to write.
265+ if (!$ fileinfo ->getIsdir () && $ fileinfo ->getSize () > 0 ) {
266+ $ read = 0 ;
267+ $ fp = @fopen ($ file , 'rb ' );
268+ if (!$ fp ) {
269+ throw new ArchiveIOException ('Could not open file for reading: ' . $ file );
274270 }
275- if ($ data === '' ) {
276- break ;
271+ while (!feof ($ fp )) {
272+ $ data = fread ($ fp , 512 );
273+ $ read += strlen ($ data );
274+ if ($ data === false ) {
275+ break ;
276+ }
277+ if ($ data === '' ) {
278+ break ;
279+ }
280+ $ packed = pack ("a512 " , $ data );
281+ $ this ->writebytes ($ packed );
277282 }
278- $ packed = pack ("a512 " , $ data );
279- $ this ->writebytes ($ packed );
280- }
281- fclose ($ fp );
283+ fclose ($ fp );
282284
283- if ($ read != $ fileinfo ->getSize ()) {
284- $ this ->close ();
285- throw new ArchiveCorruptedException ("The size of $ file changed while reading, archive corrupted. read $ read expected " .$ fileinfo ->getSize ());
285+ if ($ read != $ fileinfo ->getSize ()) {
286+ $ this ->close ();
287+ throw new ArchiveCorruptedException ("The size of $ file changed while reading, archive corrupted. read $ read expected " .$ fileinfo ->getSize ());
288+ }
286289 }
287290
288291 if (is_callable ($ this ->callback )) {
0 commit comments