if (file.isFile) return false
if (file.isDirectory) return true
- if (!file.parentFile.exists())
- if (!createDir(file.parentFile))
- return false
+ if (!file.parentFile.exists() && !createDir(file.parentFile))
+ return false
file.mkdir()
return true
private fun createFile(file: File): Boolean {
if (!file.exists()) {
val containingDir = file.parentFile
- if (!containingDir.isDirectory)
- if (!createDir(containingDir)) return false
+ if (!containingDir.isDirectory && !createDir(containingDir))
+ return false
}
return true
}
override suspend fun createDir(dir: StoragePath): Boolean {
- return withContext(Dispatchers.IO) { createDir(resolveFile(dir)) }
+ return runInterruptible(Dispatchers.IO) { createDir(resolveFile(dir)) }
}
override suspend fun listDir(dir: StoragePath): Map<String, StoredFileType>? {
- return withContext(Dispatchers.IO) { resolveFile(dir).listFiles()?.associate { renderEntry(it) } }
+ return runInterruptible(Dispatchers.IO) { resolveFile(dir).listFiles()?.associate { renderEntry(it) } }
}
override suspend fun deleteDir(dir: StoragePath): Boolean {
if (dir.isRoot) return false
val file = resolveFile(dir)
if (!file.isDirectory) return true
- return withContext(Dispatchers.IO) { file.deleteRecursively() }
+ return runInterruptible(Dispatchers.IO) { file.deleteRecursively() }
}
override suspend fun statFile(path: StoragePath): StoredFileStats? {
val file = resolveFile(path)
if (!file.isFile) return null
- return withContext(Dispatchers.IO) {
+ return runInterruptible(Dispatchers.IO) {
val basicAttributes = Files.readAttributes(file.toPath(), BasicFileAttributes::class.java)
StoredFileStats(
basicAttributes.creationTime().toInstant(),
override suspend fun writeFile(path: StoragePath, content: ByteArray): Boolean {
val file = resolveFile(path)
- return withContext(Dispatchers.IO) {
+ return runInterruptible(Dispatchers.IO) {
if (createFile(file)) {
file.writeBytes(content)
true
val file = resolveFile(path)
if (!file.isFile) return null
- return withContext(Dispatchers.IO) {
+ return runInterruptible(Dispatchers.IO) {
file.readBytes()
}
}
if (!sourceFile.isFile) return false
- withContext(Dispatchers.IO) {
+ runInterruptible(Dispatchers.IO) {
sourceFile.copyTo(targetFile, overwrite = true)
}
override suspend fun eraseFile(path: StoragePath): Boolean {
val file = resolveFile(path)
if (!file.isFile) return true
- return withContext(Dispatchers.IO) { file.delete() }
+ return runInterruptible(Dispatchers.IO) { file.delete() }
}
}
?.objectId
?.let { return it }
- val bytesPublisher = { ByteBuffer.allocate(0) }
- .asFlow()
- .asPublisher(CoroutineName("grid-fs-writer") + Dispatchers.IO)
+ val bytesPublisher = flow {
+ emit(ByteBuffer.allocate(0))
+ }.asPublisher(CoroutineName("grid-fs-writer") + Dispatchers.IO)
return bucket.uploadFromPublisher(GRID_FS_KEEP, bytesPublisher).awaitFirst()
}
return ByteArrayOutputStream().also { content ->
bucket.downloadToPublisher(gridFsId).asFlow().collect { buffer ->
val array = buffer.slice().moveToByteArray()
- withContext(Dispatchers.IO) { content.write(array) }
+ runInterruptible(Dispatchers.IO) { content.write(array) }
}
}.toByteArray()
}