Skip to content

Commit ec7c144

Browse files
committed
[Filesystem] Add appendToFile()
1 parent 0ab6628 commit ec7c144

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

src/Symfony/Component/Filesystem/Filesystem.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ public function tempnam($dir, $prefix)
624624
* @param string $filename The file to be written to
625625
* @param string $content The data to write into the file
626626
*
627-
* @throws IOException If the file cannot be written to.
627+
* @throws IOException If the file cannot be written to
628628
*/
629629
public function dumpFile($filename, $content)
630630
{
@@ -648,6 +648,23 @@ public function dumpFile($filename, $content)
648648
$this->rename($tmpFile, $filename, true);
649649
}
650650

651+
/**
652+
* Atomically appends content to an existing file.
653+
*
654+
* @param string $filename The file for which to append content
655+
* @param string $content The content to append
656+
*
657+
* @throws IOException If the file is not writable
658+
*/
659+
public function appendToFile($filename, $content)
660+
{
661+
if (false !== $originalContent = @file_get_contents($filename)) {
662+
$content = $originalContent.$content;
663+
}
664+
665+
return $this->dumpFile($filename, $content);
666+
}
667+
651668
/**
652669
* @param mixed $files
653670
*

src/Symfony/Component/Filesystem/Tests/FilesystemTest.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,6 +1406,69 @@ public function testDumpFileWithZlibScheme()
14061406
$this->assertSame('bar', file_get_contents($filename));
14071407
}
14081408

1409+
public function testAppendToFile()
1410+
{
1411+
$filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.txt';
1412+
$this->filesystem->dumpFile($filename, 'foo');
1413+
1414+
// skip mode check on Windows
1415+
if ('\\' !== DIRECTORY_SEPARATOR) {
1416+
$oldMask = umask(0002);
1417+
}
1418+
1419+
$this->filesystem->appendToFile($filename, 'bar');
1420+
1421+
$this->assertFileExists($filename);
1422+
$this->assertSame('foobar', file_get_contents($filename));
1423+
1424+
// skip mode check on Windows
1425+
if ('\\' !== DIRECTORY_SEPARATOR) {
1426+
$this->assertFilePermissions(664, $filename);
1427+
umask($oldMask);
1428+
}
1429+
}
1430+
1431+
public function testAppendToFileWithScheme()
1432+
{
1433+
if (defined('HHVM_VERSION')) {
1434+
$this->markTestSkipped('HHVM does not handle the file:// scheme correctly');
1435+
}
1436+
1437+
$scheme = 'file://';
1438+
$filename = $scheme.$this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
1439+
$this->filesystem->dumpFile($filename, 'foo');
1440+
1441+
$this->filesystem->appendToFile($filename, 'bar');
1442+
1443+
$this->assertFileExists($filename);
1444+
$this->assertSame('foobar', file_get_contents($filename));
1445+
}
1446+
1447+
public function testAppendToFileWithZlibScheme()
1448+
{
1449+
$scheme = 'compress.zlib://';
1450+
$filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
1451+
$this->filesystem->dumpFile($filename, 'foo');
1452+
1453+
// Zlib stat uses file:// wrapper so remove it
1454+
$this->assertSame('foo', file_get_contents(str_replace($scheme, '', $filename)));
1455+
1456+
$this->filesystem->appendToFile($filename, 'bar');
1457+
1458+
$this->assertFileExists($filename);
1459+
$this->assertSame('foobar', file_get_contents($filename));
1460+
}
1461+
1462+
public function testAppendToFileCreateTheFileIfNotExists()
1463+
{
1464+
$filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.txt';
1465+
1466+
$this->filesystem->appendToFile($filename, 'bar');
1467+
1468+
$this->assertFileExists($filename);
1469+
$this->assertSame('bar', file_get_contents($filename));
1470+
}
1471+
14091472
public function testCopyShouldKeepExecutionPermission()
14101473
{
14111474
$this->markAsSkippedIfChmodIsMissing();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy