diff --git a/libraries/stdlib/jdk7/src/kotlin/io/path/PathUtils.kt b/libraries/stdlib/jdk7/src/kotlin/io/path/PathUtils.kt index 279c01155bc..a9ad3be8fce 100644 --- a/libraries/stdlib/jdk7/src/kotlin/io/path/PathUtils.kt +++ b/libraries/stdlib/jdk7/src/kotlin/io/path/PathUtils.kt @@ -562,8 +562,16 @@ public inline fun Path.createDirectories(vararg attributes: FileAttribute<*>): P */ @SinceKotlin("1.9") @Throws(IOException::class) -public fun Path.createParentDirectories(vararg attributes: FileAttribute<*>): Path = - this.apply { parent?.createDirectories(*attributes) } +public fun Path.createParentDirectories(vararg attributes: FileAttribute<*>): Path = also { + val parent = it.parent + if (parent != null && !parent.isDirectory()) { + try { + parent.createDirectories(*attributes) + } catch (e: FileAlreadyExistsException) { + if (!parent.isDirectory()) throw e + } + } +} /** * Moves or renames the file located by this path to the [target] path. diff --git a/libraries/stdlib/jdk7/test/PathExtensionsTest.kt b/libraries/stdlib/jdk7/test/PathExtensionsTest.kt index 55edbf6d6a7..7ccaec90d3a 100644 --- a/libraries/stdlib/jdk7/test/PathExtensionsTest.kt +++ b/libraries/stdlib/jdk7/test/PathExtensionsTest.kt @@ -98,6 +98,16 @@ class PathExtensionsTest : AbstractPathTest() { } } + @Test + fun createParentDirectoriesOverExistingSymlink() { + val root = createTempDirectory("createParent-root").cleanupRecursively() + val dir = (root / "dir").createDirectory() + val link = (root / "link").tryCreateSymbolicLinkTo(dir) ?: return + val file = (link / "file") + file.createParentDirectories().writeText("txt") + assertTrue((dir / "file").isRegularFile()) + } + @Test fun createTempFileDefaultDir() { val file1 = createTempFile().cleanup()