diff --git a/src/main/kotlin/org/briarproject/briar/desktop/DesktopModule.kt b/src/main/kotlin/org/briarproject/briar/desktop/DesktopModule.kt
index d9a0545a4b888e5fbf153366cec4c33c6cdef089..aaa11bb431b10935b96894e55c1e109fd4be7d76 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/DesktopModule.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/DesktopModule.kt
@@ -25,6 +25,7 @@ import org.briarproject.bramble.system.JavaSystemModule
 import org.briarproject.bramble.util.OsUtils.isLinux
 import org.briarproject.bramble.util.OsUtils.isMac
 import java.io.File
+import java.nio.file.Path
 import java.util.Collections.emptyList
 import javax.inject.Singleton
 
@@ -43,7 +44,7 @@ import javax.inject.Singleton
         SocksModule::class
     ]
 )
-internal class DesktopModule(private val appDir: File) {
+internal class DesktopModule(private val appDir: Path) {
 
     @Provides
     @Singleton
@@ -52,15 +53,15 @@ internal class DesktopModule(private val appDir: File) {
     @Provides
     @Singleton
     internal fun provideDatabaseConfig(): DatabaseConfig {
-        val dbDir = File(appDir, "db")
-        val keyDir = File(appDir, "key")
-        return DesktopDatabaseConfig(dbDir, keyDir)
+        val dbDir = appDir.resolve("db")
+        val keyDir = appDir.resolve("key")
+        return DesktopDatabaseConfig(dbDir.toFile(), keyDir.toFile())
     }
 
     @Provides
     @TorDirectory
     internal fun provideTorDirectory(): File {
-        return File(appDir, "tor")
+        return appDir.resolve("tor").toFile()
     }
 
     @Provides
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/FileUtils.kt b/src/main/kotlin/org/briarproject/briar/desktop/FileUtils.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e6fffe3672a0e87962a7a64cd39a6431f5b0e2d8
--- /dev/null
+++ b/src/main/kotlin/org/briarproject/briar/desktop/FileUtils.kt
@@ -0,0 +1,27 @@
+package org.briarproject.briar.desktop
+
+import org.briarproject.bramble.util.OsUtils
+import java.nio.file.Files
+import java.nio.file.Path
+import java.nio.file.attribute.PosixFilePermission
+
+object FileUtils {
+
+    /**
+     * Sets read, write and executable flags for the specified file in a platform independent manner.
+     */
+    fun setRWX(file: Path) {
+        if (OsUtils.isLinux() || OsUtils.isMac()) {
+            val perms = HashSet<PosixFilePermission>()
+            perms.add(PosixFilePermission.OWNER_READ)
+            perms.add(PosixFilePermission.OWNER_WRITE)
+            perms.add(PosixFilePermission.OWNER_EXECUTE)
+            Files.setPosixFilePermissions(file, perms)
+        } else if (OsUtils.isWindows()) {
+            val f = file.toFile()
+            f.setReadable(true, true)
+            f.setWritable(true, true)
+            f.setExecutable(true, true)
+        }
+    }
+}
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/Main.kt b/src/main/kotlin/org/briarproject/briar/desktop/Main.kt
index e2b47625b384183a4584aaaafc57e6fea078dadb..5a4e72ec8597505b4503779cfd44a47a0bafc3d4 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/Main.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/Main.kt
@@ -8,19 +8,13 @@ import com.github.ajalt.clikt.parameters.options.default
 import com.github.ajalt.clikt.parameters.options.flag
 import com.github.ajalt.clikt.parameters.options.option
 import org.briarproject.bramble.BrambleCoreEagerSingletons
-import org.briarproject.bramble.util.OsUtils.isLinux
-import org.briarproject.bramble.util.OsUtils.isMac
-import org.briarproject.bramble.util.OsUtils.isWindows
 import org.briarproject.briar.BriarCoreEagerSingletons
-import java.io.File
 import java.io.File.separator
 import java.io.IOException
 import java.lang.System.getProperty
-import java.nio.file.Files.setPosixFilePermissions
-import java.nio.file.attribute.PosixFilePermission
-import java.nio.file.attribute.PosixFilePermission.OWNER_EXECUTE
-import java.nio.file.attribute.PosixFilePermission.OWNER_READ
-import java.nio.file.attribute.PosixFilePermission.OWNER_WRITE
+import java.nio.file.Files
+import java.nio.file.Path
+import java.nio.file.Paths
 import java.util.logging.Level.ALL
 import java.util.logging.Level.INFO
 import java.util.logging.Level.WARNING
@@ -70,24 +64,18 @@ private class Main : CliktCommand(
         app.getUI().startBriar()
     }
 
-    private fun getDataDir(): File {
-        val file = File(dataDir)
-        if (!file.exists() && !file.mkdirs()) {
-            throw IOException("Could not create directory: ${file.absolutePath}")
-        } else if (!file.isDirectory) {
-            throw IOException("Data dir is not a directory: ${file.absolutePath}")
+    private fun getDataDir(): Path {
+        val file = Paths.get(dataDir)
+        if (!Files.exists(file)) {
+            Files.createDirectories(file)
+            if (!Files.exists(file)) {
+                throw IOException("Could not create directory: ${file.toAbsolutePath()}")
+            }
         }
-        if (isLinux() || isMac()) {
-            val perms = HashSet<PosixFilePermission>()
-            perms.add(OWNER_READ)
-            perms.add(OWNER_WRITE)
-            perms.add(OWNER_EXECUTE)
-            setPosixFilePermissions(file.toPath(), perms)
-        } else if (isWindows()) {
-            file.setReadable(true, true)
-            file.setWritable(true, true)
-            file.setExecutable(true, true)
+        if (!Files.isDirectory(file)) {
+            throw IOException("Data dir is not a directory: ${file.toAbsolutePath()}")
         }
+        FileUtils.setRWX(file)
         return file
     }
 }
diff --git a/src/test/kotlin/org/briarproject/briar/desktop/RunWithTemporaryAccount.kt b/src/test/kotlin/org/briarproject/briar/desktop/RunWithTemporaryAccount.kt
index e89c442918e678ed08a3f11752814a1ac66c8c75..9bb81c253b4739a2070513865839d5fac51b1fa3 100644
--- a/src/test/kotlin/org/briarproject/briar/desktop/RunWithTemporaryAccount.kt
+++ b/src/test/kotlin/org/briarproject/briar/desktop/RunWithTemporaryAccount.kt
@@ -2,20 +2,11 @@ package org.briarproject.briar.desktop
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.window.application
-import org.apache.commons.io.FileUtils
 import org.briarproject.bramble.BrambleCoreEagerSingletons
-import org.briarproject.bramble.util.OsUtils.isLinux
-import org.briarproject.bramble.util.OsUtils.isMac
-import org.briarproject.bramble.util.OsUtils.isWindows
 import org.briarproject.briar.BriarCoreEagerSingletons
 import java.io.IOException
 import java.nio.file.Files
-import java.nio.file.Files.setPosixFilePermissions
 import java.nio.file.Path
-import java.nio.file.attribute.PosixFilePermission
-import java.nio.file.attribute.PosixFilePermission.OWNER_EXECUTE
-import java.nio.file.attribute.PosixFilePermission.OWNER_READ
-import java.nio.file.attribute.PosixFilePermission.OWNER_WRITE
 import java.util.logging.Level.INFO
 import java.util.logging.LogManager
 import kotlin.io.path.absolute
@@ -36,7 +27,7 @@ internal class RunWithTemporaryAccount(val customization: BriarDesktopTestApp.()
 
         app.getShutdownManager().addShutdownHook {
             println("deleting temporary account at $dataDir")
-            FileUtils.deleteDirectory(dataDir.toFile())
+            org.apache.commons.io.FileUtils.deleteDirectory(dataDir.toFile())
         }
 
         // We need to load the eager singletons directly after making the
@@ -70,18 +61,7 @@ internal class RunWithTemporaryAccount(val customization: BriarDesktopTestApp.()
         } else if (!Files.isDirectory(dataDir)) {
             throw IOException("Data dir is not a directory: ${dataDir.absolute()}")
         }
-        if (isLinux() || isMac()) {
-            val perms = HashSet<PosixFilePermission>()
-            perms.add(OWNER_READ)
-            perms.add(OWNER_WRITE)
-            perms.add(OWNER_EXECUTE)
-            setPosixFilePermissions(dataDir, perms)
-        } else if (isWindows()) {
-            val file = dataDir.toFile()
-            file.setReadable(true, true)
-            file.setWritable(true, true)
-            file.setExecutable(true, true)
-        }
+        FileUtils.setRWX(dataDir)
         return dataDir
     }
 }