Skip to content

Commit c631063

Browse files
author
Erwin Derksen
committed
Issue #29
1 parent d53bf2e commit c631063

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

src/Tar.php

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)