diff --git a/io/src/main/scala/sbt/internal/io/Milli.scala b/io/src/main/scala/sbt/internal/io/Milli.scala index dd347dc0..b05b5246 100644 --- a/io/src/main/scala/sbt/internal/io/Milli.scala +++ b/io/src/main/scala/sbt/internal/io/Milli.scala @@ -263,7 +263,7 @@ private object WinMilli extends MilliNative[FILETIME] { private def getHandle(lpFileName: String, dwDesiredAccess: Int, dwShareMode: Int): HANDLE = { val hFile = CreateFile( - lpFileName, + "\\\\?\\" + lpFileName, dwDesiredAccess, dwShareMode, null, diff --git a/io/src/test/scala/sbt/io/LastModifiedSpec.scala b/io/src/test/scala/sbt/io/LastModifiedSpec.scala new file mode 100644 index 00000000..2848c193 --- /dev/null +++ b/io/src/test/scala/sbt/io/LastModifiedSpec.scala @@ -0,0 +1,31 @@ +/* + * sbt IO + * + * Copyright 2011 - 2019, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * + * Licensed under Apache License 2.0 + * (http://www.apache.org/licenses/LICENSE-2.0). + */ + +package sbt.io + +import java.nio.file.Files + +import org.scalatest.FlatSpec + +class LastModifiedSpec extends FlatSpec { + "IO.getModifiedTimeOrZero" should "work with long path names" in IO.withTemporaryDirectory { + dir => + val fileName = "a" * 32 + val nested = + (1 to 8).foldLeft(dir.toPath) { + case (d, _) => Files.createDirectories(d.resolve(fileName)) + } + val file = Files.createFile(nested.resolve(fileName)).toFile + // in case target platform only has second precision round to nearest second + val lm = (System.currentTimeMillis / 1000) * 1000 + IO.setModifiedTimeOrFalse(file, lm) + assert(IO.getModifiedTimeOrZero(file) == lm) + } +}