Kotlin'de Tekrarlanan Dosyaları Bulup Silme Programı
Aşağıda, Kotlin kullanarak tekrarlanan dosyaları bulup silen bir program örneği bulunmaktadır. Bu program, belirtilen dizindeki tüm dosyaları kontrol eder, aynı içeriğe sahip olanları tespit eder ve kullanıcı onayıyla siler.
import java.io.File import java.security.MessageDigest import java.util.* fun main() { val scanner = Scanner(System.`in`) println("Tekrarlanan dosyaları bulup silme programına hoş geldiniz!") print("Taranacak dizin yolunu girin: ") val directoryPath = scanner.nextLine() val directory = File(directoryPath) if (!directory.exists() || !directory.isDirectory) { println("Geçersiz dizin yolu!") return } val files = directory.listFiles()?.filter { it.isFile } ?: emptyList() if (files.isEmpty()) { println("Dizinde hiç dosya bulunamadı.") return } println("${files.size} dosya taranıyor...") // Dosyaları hash değerlerine göre grupla val fileGroups = mutableMapOf<String, MutableList<File>>() files.forEach { file -> val fileHash = calculateFileHash(file) fileGroups.getOrPut(fileHash) { mutableListOf() }.add(file) } // Tekrarlanan dosyaları bul val duplicateFiles = fileGroups.values.filter { it.size > 1 } if (duplicateFiles.isEmpty()) { println("Tekrarlanan dosya bulunamadı.") return } println("\nBulunan tekrarlanan dosya grupları:") duplicateFiles.forEachIndexed { index, group -> println("\nGrup ${index + 1}:") group.forEach { file -> println(" - ${file.name} (${file.length()} bytes, son değiştirilme: ${Date(file.lastModified())})") } } print("\nTekrarlanan dosyaları silmek istiyor musunuz? (E/H): ") val response = scanner.nextLine().trim().uppercase() if (response == "E") { deleteDuplicateFiles(duplicateFiles) println("İşlem tamamlandı.") } else { println("İşlem iptal edildi.") } } fun calculateFileHash(file: File): String { val digest = MessageDigest.getInstance("SHA-256") file.inputStream().use { input -> val buffer = ByteArray(8192) var bytesRead: Int while (input.read(buffer).also { bytesRead = it } != -1) { digest.update(buffer, 0, bytesRead) } } return digest.digest().joinToString("") { "%02x".format(it) } } fun deleteDuplicateFiles(duplicateGroups: List<List<File>>) { var totalDeleted = 0 duplicateGroups.forEach { group -> // İlk dosyayı orijinal olarak koru, diğerlerini sil val (originals, duplicates) = group.partition { it == group.first() } duplicates.forEach { duplicate -> if (duplicate.delete()) { println("Silindi: ${duplicate.absolutePath}") totalDeleted++ } else { println("Silinemedi: ${duplicate.absolutePath}") } } } println("\nToplam $totalDeleted dosya silindi.") }
Programın Çalışma Mantığı
Kullanıcı Girdisi: Program, kullanıcıdan taranacak dizin yolunu ister.
Dizin Kontrolü: Girilen yolun geçerli bir dizin olup olmadığını kontrol eder.
Dosya Listeleme: Dizindeki tüm dosyaları listeler.
Hash Hesaplama: Her dosyanın SHA-256 hash değerini hesaplar (içerik kontrolü için).
Gruplama: Aynı hash değerine sahip dosyaları gruplar.
Raporlama: Tekrarlanan dosya gruplarını kullanıcıya gösterir.
Onay ve Silme: Kullanıcı onayı alarak her gruptaki orijinal dosyayı korurken diğerlerini siler.
Kullanım Örneği
Tekrarlanan dosyaları bulup silme programına hoş geldiniz! Taranacak dizin yolunu girin: C:\Users\Kullanici\Downloads 42 dosya taranıyor... Bulunan tekrarlanan dosya grupları: Grup 1: - resim1.jpg (1024 bytes, son değiştirilme: Wed May 01 10:15:23 TRT 2024) - resim_kopya.jpg (1024 bytes, son değiştirilme: Wed May 01 10:20:45 TRT 2024) Grup 2: - dokuman.pdf (2048 bytes, son değiştirilme: Tue Apr 30 09:10:15 TRT 2024) - dokuman(1).pdf (2048 bytes, son değiştirilme: Tue Apr 30 09:12:30 TRT 2024) Tekrarlanan dosyaları silmek istiyor musunuz? (E/H): E Silindi: C:\Users\Kullanici\Downloads\resim_kopya.jpg Silindi: C:\Users\Kullanici\Downloads\dokuman(1).pdf Toplam 2 dosya silindi.
Geliştirme Önerileri
Güvenlik: Silme işleminden önce yedek alma seçeneği ekleyebilirsiniz.
Performans: Büyük dosyalar için hash hesaplama süresini optimize edebilirsiniz.
Arayüz: Grafiksel kullanıcı arayüzü ekleyebilirsiniz.
Filtreleme: Belirli uzantılı dosyaları filtreleme seçeneği ekleyebilirsiniz.
Hiç yorum yok:
Yorum Gönder