File.copyTo în Kotlin

Fișiere (kotlin.io) Kotlin 1.0 (JVM)

copyTo copiază un fișier în altă locație; deleteRecursively șterge un fișier sau un director cu tot conținutul.

Sintaxă
fun File.copyTo(target: File, overwrite: Boolean = false, bufferSize: Int = DEFAULT_BUFFER_SIZE): File
fun File.copyRecursively(target: File, overwrite: Boolean = false): Boolean
fun File.deleteRecursively(): Boolean

Ce face File.copyTo

sursa.copyTo(File("copie.txt")) copiază conținutul și returnează fișierul nou. Dacă destinația există deja, aruncă FileAlreadyExistsException, ca să nu pierzi date din greșeală; cu overwrite = true o înlocuiește. Directoarele lipsă din calea destinației sunt create automat. Pentru un director întreg folosește copyRecursively.

deleteRecursively() șterge fișierul sau directorul împreună cu tot ce conține și returnează true dacă a reușit. Ștergerea este definitivă (nu trece prin Coșul de gunoi), deci verifică de două ori calea. Pentru un singur fișier sau un director gol ajunge delete().

Parametri

Parametru Descriere
target Fișierul destinație.
overwrite Dacă true, înlocuiește destinația existentă.

Ce returnează

copyTo: fișierul destinație. deleteRecursively: true dacă totul a fost șters.

Exemple

Exemplul 1: Copie de siguranță

Copia se creează într-un director nou, creat automat. A doua copiere reușește doar cu overwrite = true.

import java.io.File

fun main() {
    val original = File("contacte.txt")
    original.writeText("Ana 0722111222\nIon 0744333444\n")
    val copie = original.copyTo(File("backup/contacte.txt"))
    println("Copiat în ${copie.path}: ${copie.readText().lines().size - 1} contacte")
    try {
        original.copyTo(copie)
    } catch (e: FileAlreadyExistsException) {
        println("Destinația există deja: ${e.other?.path}")
    }
    original.copyTo(copie, overwrite = true)
    println("Suprascris: ${copie.exists()}")
}

Rezultat

Copiat în backup/contacte.txt: 2 contacte
Destinația există deja: backup/contacte.txt
Suprascris: true

Exemplul 2: Ștergerea unui director cu tot conținutul

delete() nu poate șterge un director care conține fișiere; deleteRecursively() poate.

import java.io.File

fun main() {
    val dir = File("temporar")
    File(dir, "a/b").mkdirs()
    File(dir, "a/note.txt").writeText("ceva")
    File(dir, "a/b/date.txt").writeText("altceva")
    println("delete(): ${dir.delete()}")
    println("deleteRecursively(): ${dir.deleteRecursively()}")
    println("Mai există: ${dir.exists()}")
}

Rezultat

delete(): false
deleteRecursively(): true
Mai există: false

Exemplul 3: Copierea unui director întreg

copyRecursively copiază toate fișierele și subdirectoarele.

import java.io.File

fun main() {
    File("proiect/src").mkdirs()
    File("proiect/src/main.kt").writeText("fun main() {}")
    File("proiect/README.md").writeText("# Proiect")
    File("proiect").copyRecursively(File("proiect-copie"))
    val fisiere = File("proiect-copie").walk().filter { it.isFile }.map { it.path }.sorted().toList()
    println(fisiere)
}

Rezultat

[proiect-copie/README.md, proiect-copie/src/main.kt]

Greșeli frecvente

  • Te aștepți ca copyTo să suprascrie destinația. Implicit aruncă excepție; adaugă overwrite = true dacă asta vrei.
  • Apelezi deleteRecursively() pe o cale construită greșit (de exemplu un text gol, care înseamnă directorul curent). Afișează și verifică întâi calea.

Comenzi înrudite

  • File.walk: Parcurge un director cu toate subdirectoarele și fișierele lui, ca o secvență de obiecte File.
  • File.readBytes: readBytes citește un fișier ca șir de octeți (ByteArray); writeBytes scrie octeți, pentru imagini, arhive sau date binare.
  • File.extension: extension dă partea de după ultimul punct din numele fișierului; nameWithoutExtension dă numele fără ea.