CodeGym /Kurslar /JAVA 25 SELF /Fayl və qovluqların kopyalanması və köçürülməsi

Fayl və qovluqların kopyalanması və köçürülməsi

JAVA 25 SELF
Səviyyə, Dərs
Mövcuddur

1. Faylların kopyalanması

Metod Files.copy: əsas sintaksis

Java-da fayl və qovluqları kopyalamaq üçün Files.copy adlı statik metoddan (paket: java.nio.file) istifadə olunur. Biz artıq onunla rastlaşmışıq, indi isə daha ətraflı öyrənəcəyik. Files.copy üçün əsas sintaksis:

Files.copy(Path source, Path target, CopyOption... options)
  • source — mənbə fayla və ya qovluğa yol.
  • target — kopyalanacaq yerin yolu.
  • options — əlavə seçimlər (məsələn, üzərinə yazmağa icazə).

Ən sadə nümunə

Gəlin "input.txt" faylını cari qovluqdan "backup" qovluğuna "input_backup.txt" adı ilə kopyalayaq:

import java.nio.file.*;

public class CopyExample {
    public static void main(String[] args) throws Exception {
        Path source = Path.of("input.txt");
        Path target = Path.of("backup/input_backup.txt");

        Files.copy(source, target);
        System.out.println("Fayl kopyalandı!");
    }
}

Vacib məqamlar:

  • Əgər təyinat faylı artıq mövcuddursa, FileAlreadyExistsException istisnası atılacaq.
  • Əgər "backup" qovluğu mövcud deyilsə, metod xəta atacaq — qovluq əvvəlcədən yaradılmalıdır!

Üzərinə yazmaqla kopyalama

Faylın üzərinə yazmağa icazə vermək üçün StandardCopyOption.REPLACE_EXISTING seçimindən istifadə edin:

Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);

Cədvəl: kopyalama üçün əsas seçimlər

Seçim Təsvir
StandardCopyOption.REPLACE_EXISTING
Fayl artıq mövcuddursa, üzərinə yazır
StandardCopyOption.COPY_ATTRIBUTES
Atributları kopyalayır (yaradılma tarixi və s.)
StandardCopyOption.ATOMIC_MOVE
Atomik köçürmə (yalnız move ilə istifadə olunur)

Faylın başqa qovluğa kopyalanması

Kopyalamadan əvvəl təyinat qovluğunun mövcud olduğundan əmin olun:

Path targetDir = Path.of("backup");
if (!Files.exists(targetDir)) {
    Files.createDirectory(targetDir);
}
Files.copy(source, targetDir.resolve("input_backup.txt"), StandardCopyOption.REPLACE_EXISTING);

Qovluqların kopyalanması: incə məqam

Metod Files.copy qovluqları yalnız “boş qabıq” kimi kopyalaya bilir — məzmun (fayllar və alt qovluqlar) kopyalanmır! Əgər faylları olan qovluğu kopyalamağa çalışsanız, yalnız boş qovluq əldə edəcəksiniz. Bütöv qovluqları məzmunu ilə kopyalamaq üçün rekursiv keçid və hər faylın ayrıca kopyalanması tələb olunur (buna növbəti mühazirələrdə qayıdacağıq).

Nümunə: faylı bir qovluqdan digərinə kopyalayırıq

Path source = Path.of("data/report.txt");
Path target = Path.of("backup/report.txt");

Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);

Kopyalama zamanı xətaların emalı

Kopyalama müxtəlif səbəblərdən uğursuz ola bilər: giriş icazəsi yoxdur, fayl məşğuldur, yaddaş çatmır, fayl artıq mövcuddur və s. Həmişə try-catch istifadə etmək daha yaxşıdır:

try {
    Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
    System.out.println("Kopyalama uğurla başa çatdı!");
} catch (FileAlreadyExistsException e) {
    System.out.println("Fayl artıq mövcuddur: " + target);
} catch (IOException e) {
    System.out.println("Giriş-çıxış xətası: " + e.getMessage());
}

2. Fayl və qovluqların köçürülməsi

Metod Files.move: sintaksis

Fayl və qovluqların köçürülməsi aşağıdakı metodla həyata keçirilir:

Files.move(Path source, Path target, CopyOption... options)

Burada source — fayla yol (haradan daşıyırıq), target — faylı və ya qovluğu hara yerləşdirmək istədiyimiz yol, options — əlavə tənzimləmələr (məsələn, mövcud faylın əvəzlənməsi).

Yeri gəlmişkən, köçürmə təkcə faylın “yerinin dəyişdirilməsi” deyil, həm də adını dəyişdirmə üsuludur (yalnız ad dəyişirsə). Əgər təyinat qovluğunda həmin adla fayl artıq varsa, REPLACE_EXISTING seçimi göstərilməsə, istisna atılacaq.

Nümunə: faylın başqa qovluğa köçürülməsi

Path source = Path.of("data/report.txt");
Path target = Path.of("archive/report.txt");

Files.move(source, target);
System.out.println("Fayl köçürüldü!");

Mövcud faylın əvəzlənməsi ilə köçürmə

Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);

Qovluğun köçürülməsi

Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("archive/old_reports");

Files.move(oldDir, newDir);

Bütün qovluq, daxilindəki fayl və alt qovluqlar da daxil olmaqla, yeni yerə köçürüləcək.
Lakin təyinat yerində eyni adlı qovluq artıq varsa — xəta alacaqsınız.

Müxtəlif fayl sistemləri arasında köçürmə

Əgər faylı müxtəlif disklər arasında köçürürsünüzsə (məsələn, "C:"-dən "D:"-yə), daxildə əvvəlcə kopyalama, sonra isə mənbə faylın silinməsi baş verəcək. Əməliyyat atomik kimi dəstəklənmirsə, AtomicMoveNotSupportedException istisnası atıla bilər.

move ilə copy arasındakı fərq

  • copy — ilkin fayl/qovluq yerində qalır, surəti yaranır.
  • move — ilkin fayl/qovluq silinir, yalnız yeni nüsxə qalır.

3. Fayl və qovluqların adının dəyişdirilməsi

Java-da ayrıca “faylın adını dəyişdirmək” metodu yoxdur. Adın dəyişdirilməsi köçürmənin xüsusi halıdır: eyni qovluqda yeni adla yeni yol göstərirsiniz.

Nümunə: faylın adını dəyişdirmək

Güman edək ki, bizdə "report.txt" faylı var və onu eyni qovluqda "report_old.txt" adına dəyişmək istəyirik:

Path dir = Path.of("data");
Path oldName = dir.resolve("report.txt");
Path newName = dir.resolve("report_old.txt");

Files.move(oldName, newName);
System.out.println("Faylın adı dəyişdirildi!");

Vacib nüanslar

Əgər təyinat qovluğunda göstərdiyiniz adla fayl və ya qovluq artıq mövcuddursa, metod istisna atacaq. Bu məhdudiyyəti aşmaq və əvəzləməyə icazə vermək üçün StandardCopyOption.REPLACE_EXISTING seçimindən istifadə edə bilərsiniz.

Nümunə:

Path source = Paths.get("old_name.txt");
Path target = Paths.get("new_name.txt");

// Faylın adını dəyişdirək, əgər artıq varsa — əvəz edək
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);

Bu nümunədə "old_name.txt" faylının adı "new_name.txt" olaraq dəyişdiriləcək. Əgər qovluqda həmin adlı fayl artıq mövcud idisə, onun üzərinə yazılacaq.

Qovluğun adının dəyişdirilməsi

Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("data/archived_reports");

Files.move(oldDir, newDir);
System.out.println("Qovluğun adı dəyişdirildi!");

4. Kopyalama, köçürmə və adın dəyişdirilməsi zamanı xətaların emalı

Fayl sistemi ilə iş həmişə gözlənilməz halların riskini daşıyır. Ən çox rast gəlinən problemlər:

Fayl artıq mövcuddur.
İstisna: FileAlreadyExistsException. Həll: əvəz etmək istəyirsinizsə, REPLACE_EXISTING istifadə edin.

Fayl və ya qovluq başqa proses tərəfindən istifadə olunur.
İstisna: IOException. Məsələn, fayl başqa proqramda açıqdır.

Fayl və ya qovluğa giriş yoxdur.
İstisna: AccessDeniedException. İstifadəçi icazələri ilə problem.

Müxtəlif fayl sistemləri arasında köçürmə.
İstisna: AtomicMoveNotSupportedException. Bütün fayl sistemləri atomik köçürməni dəstəkləmir.

Təyinat qovluğu mövcud deyil.
Kopyalama/Köçürmə üçün təyinat qovluğunun əvvəlcədən yaradıldığına əmin olun!

Xətaların emalı nümunəsi

try {
    Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
    System.out.println("Təyinat faylı artıq mövcuddur: " + target);
} catch (AtomicMoveNotSupportedException e) {
    System.out.println("Atomik köçürmə dəstəklənmir: " + e.getMessage());
} catch (IOException e) {
    System.out.println("Köçürmə zamanı xəta: " + e.getMessage());
}

5. Praktik tövsiyələr

Təyinat faylının/qovluğunun mövcudluğunu yoxlamaq

Kopyalamadan və ya köçürmədən əvvəl təyinat yolunun məşğul olub-olmadığını yoxlamaq faydalıdır:

if (Files.exists(target)) {
    System.out.println("Fayl artıq var, üzərinə yazmayaq.");
} else {
    Files.copy(source, target);
}

Təhlükəsiz əməliyyatlar üçün müvəqqəti fayllardan istifadə

Mürəkkəb əməliyyatlarda (məsələn, vacib faylların yenilənməsi) tez-tez müvəqqəti fayllardan istifadə edilir — əvvəlcə müvəqqəti fayla kopyalanır, sonra əsas fayl əvəz olunur:

Path temp = Path.of("data/report.tmp");
Files.copy(source, temp, StandardCopyOption.REPLACE_EXISTING);
Files.move(temp, target, StandardCopyOption.REPLACE_EXISTING);

Bu yanaşma nasazlıqlar zamanı məlumat itkisi riskini minimuma endirir.

Nümunə: əvəzləmədən əvvəl faylın ehtiyat nüsxəsini yaratmaq

Path file = Path.of("data/report.txt");
Path backup = Path.of("data/report_backup.txt");

if (Files.exists(file)) {
    Files.copy(file, backup, StandardCopyOption.REPLACE_EXISTING);
    System.out.println("Ehtiyat nüsxə yaradıldı.");
}

6. Cədvəl: əsas metodlar və seçimlər

Əməliyyat Java NIO metodu Xüsusiyyətlər
Kopyalama
Files.copy(source, target, ...)
Qovluqların məzmununu kopyalamır!
Köçürmə
Files.move(source, target, ...)
Adın dəyişdirilməsi üçün istifadə oluna bilər
Adın dəyişdirilməsi
Files.move(source, target, ...)
Eyni qovluqda yeni yol
Üzərinə yazma
StandardCopyOption.REPLACE_EXISTING
Təyinat faylının/qovluğunun üzərinə yazır
Yoxlama
Files.exists(path)
Faylın/qovluğun mövcudluğunu yoxlayır

7. Faylları kopyalama, köçürmə və adını dəyişdirmə zamanı tipik səhvlər

Səhv №1: faylı mövcud olmayan qovluğa kopyalamağa cəhd. Əgər təyinat qovluğu yaradılmayıbsa, NoSuchFileException alacaqsınız. Həll: qovluğu əvvəlcədən Files.createDirectories ilə yaradın.

Səhv №2: qovluğu tam şəkildə Files.copy ilə kopyalamağa cəhd. Metod yalnız “boş qabıq” kopyalayır, məzmunu yox. Tam kopyalama üçün rekursiv keçid lazımdır.

Səhv №3: mövcud fayl halının emal edilməməsi. REPLACE_EXISTING ötürməsəniz və fayl artıq mövcuddursa, istisna atılacaq. Bu halı açıq şəkildə emal etmək daha yaxşıdır.

Səhv №4: yeni adla fayl artıq mövcud ikən faylın adını dəyişdirmək cəhdi. Eyni şəkildə, FileAlreadyExistsException alacaqsınız. Adını dəyişdirməzdən əvvəl faylın mövcudluğunu yoxlamaq olar.

Səhv №5: müxtəlif fayl sistemləri arasında köçürmə. Bəzən əməliyyat “atomik” dəstəklənmir və AtomicMoveNotSupportedException atılır. Bu halda atomik olmadan adi köçürmədən istifadə edin.

Səhv №6: giriş hüquqlarının olmaması və ya faylın bloklanması. Əgər fayl başqa proqramda açıqdırsa və ya yazma/oxuma hüququ yoxdur, AccessDeniedException və ya IOException alacaqsınız. Həmişə belə istisnaları emal edin.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Təzə hesabatın arxivə köçürülməsi 📦
Təzə hesabatın arxivə köçürülməsi 📦
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Köhnəlmiş sənədin adının dəyişdirilməsi 📝
Köhnəlmiş sənədin adının dəyişdirilməsi 📝
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION