CodeGym /Kurslar /JAVA 25 SELF /Fayl və qovluqların yaradılması və silinməsi

Fayl və qovluqların yaradılması və silinməsi

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

1. Faylların yaradılması

Faylları proqram vasitəsilə yaratmaq tez-tez lazım olur: jurnallar, müvəqqəti məlumatlar, hesabatların ixracı, məlumatların idxalı, ayarların saxlanması və daha nələr üçün. Java-da bunun üçün, yəqin ki, artıq təxmin etdiyiniz kimi, ən yaxşısı müasir API — java.nio.file-dən istifadə etməkdir.

Əsas vasitə: Files.createFile(Path)

Bu metod göstərilən yol üzrə yeni fayl yaradır. Fayl artıq mövcuddursa, istisna atılacaq.

Nümunə: cari qovluqda mətn faylı yaradırıq

import java.nio.file.*;

public class CreateFileExample {
    public static void main(String[] args) {
        Path path = Path.of("hello.txt");
        try {
            Files.createFile(path);
            System.out.println("Fayl yaradıldı: " + path.toAbsolutePath());
        } catch (FileAlreadyExistsException e) {
            System.out.println("Fayl artıq mövcuddur: " + path);
        } catch (Exception e) {
            System.out.println("Faylın yaradılması zamanı xəta: " + e.getMessage());
        }
    }
}

Diqqət yetirin:
Files.createFile fayl artıq varsa FileAlreadyExistsException atır. Buna görə də çox vaxt faylı yaratmazdan əvvəl onun mövcudluğunu yoxlayırlar.

Faylın mövcudluğunu yoxlama

Path path = Path.of("hello.txt");
if (!Files.exists(path)) {
    Files.createFile(path);
}

Məsləhət:
Faylın mövcudluğunu yoxlama — bu, axınlar arasında yarış vəziyyətinə qarşı müdafiə deyil, lakin əksər istifadəçi ssenariləri üçün kifayət qədər işlək üsuldur.

Qısa olaraq: fayl yaradılarkən nə baş verir?

  • Fayl mövcud deyilsə və yol düzgündürsə — yeni boş fayl yaradılır.
  • Fayl artıq varsa — istisna atılır.
  • Yol səhvidirsə, icazələr yoxdursa və ya qovluq mövcud deyilsə — başqa bir istisna atılacaq (IOException, NoSuchFileException və s.).

2. Qovluqların yaradılması

Files.createDirectoryFiles.createDirectories arasındakı fərq

  • Files.createDirectory(Path) — yalnız bir qovluq yaradır. Valideyn qovluq yoxdursa — xəta olacaq.
  • Files.createDirectories(Path) — çatışmayan bütün qovluqlar zəncirini yaradır (elə bil ayaqlarınızın altında pilləkən quran sehrbaz kimi).

Nümunə: bir qovluq yaradırıq

Path dir = Path.of("data");
try {
    Files.createDirectory(dir);
    System.out.println("Qovluq yaradıldı: " + dir.toAbsolutePath());
} catch (FileAlreadyExistsException e) {
    System.out.println("Qovluq artıq mövcuddur: " + dir);
} catch (Exception e) {
    System.out.println("Qovluğun yaradılması zamanı xəta: " + e.getMessage());
}

Nümunə: iç-içə qovluq strukturu yaradırıq

Path nested = Path.of("data/reports/2024");
try {
    Files.createDirectories(nested);
    System.out.println("Qovluqlar strukturu yaradıldı: " + nested.toAbsolutePath());
} catch (Exception e) {
    System.out.println("Struktur yaradılarkən xəta: " + e.getMessage());
}

Nəzərə alın: qovluqlardan biri artıq mövcuddursa, createDirectories üçün bu problem deyil — sadəcə çatışmayanları yaradır. Əgər createDirectory iç qovluq üçün istifadə etsəniz, amma valideyn hələ yoxdursa — xəta alınacaq.

Cədvəl: qovluq yaratma metodlarının müqayisəsi

Metod Yalnız bir qovluq yaradır İç-içə qovluqlar yaradır Zəncirin bir hissəsi artıq varsa, xəta vermir
createDirectory
createDirectories

3. Faylların silinməsi

Faylları silmək demək olar ki, zibil atmaq kimidir: əsas məsələ — vacib bir şeyi atıb getməməkdir! Java-da bunun üçün iki əsas metod var:

  • Files.delete(Path) — faylı və ya boş qovluğu silir. Fayl yoxdursa — istisna atılır.
  • Files.deleteIfExists(Path) — faylı silir, lakin o yox idisə — səssizcə heç nə etmir.

Nümunə: müvəqqəti faylı silirik

Path tempFile = Path.of("temp.txt");
try {
    Files.delete(tempFile);
    System.out.println("Fayl silindi: " + tempFile);
} catch (NoSuchFileException e) {
    System.out.println("Fayl tapılmadı: " + tempFile);
} catch (DirectoryNotEmptyException e) {
    System.out.println("Qovluq boş deyil: " + tempFile);
} catch (Exception e) {
    System.out.println("Silmə zamanı xəta: " + e.getMessage());
}

Daha təhlükəsiz variant

boolean deleted = Files.deleteIfExists(tempFile);
if (deleted) {
    System.out.println("Fayl silindi.");
} else {
    System.out.println("Fayl tapılmadı — silinəcək heç nə yoxdur.");
}

Vacibdir!

  • Fayl başqa proqramda açıqdırsa — istisna atıla bilər (məsələn, Windows-da).
  • Boş olmayan qovluğu silməyə cəhd etsəniz — DirectoryNotEmptyException xətası yaranacaq.

4. Qovluqların silinməsi

Qovluqları Java-da təxminən fayllar kimi silirik. Yeganə nüans: standart metodlar yalnız boş qovluqları silir.

Nümunə: boş qovluğu silirik

Path emptyDir = Path.of("empty_folder");
try {
    Files.delete(emptyDir);
    System.out.println("Qovluq silindi: " + emptyDir);
} catch (DirectoryNotEmptyException e) {
    System.out.println("Qovluq boş deyil: " + emptyDir);
} catch (NoSuchFileException e) {
    System.out.println("Qovluq tapılmadı: " + emptyDir);
} catch (Exception e) {
    System.out.println("Qovluğun silinməsi zamanı xəta: " + e.getMessage());
}

Boş olmayan qovluqlarla nə etmək lazımdır?

Boş olmayan qovluqları silmək üçün bütün daxil olan fayl və alt qovluqları rekursiv şəkildə silmək lazımdır. Bu, ayrıca mühazirənin mövzusudur (və ayrıca bir macəra), amma tələssəniz, buyurun kod — araşdırın və təkrarlamağa çalışın:

import java.nio.file.*;
import java.io.IOException;

public class DeleteDirectoryRecursively {
    public static void deleteRecursively(Path path) throws IOException {
        if (Files.isDirectory(path)) {
            try (var entries = Files.list(path)) {
                for (Path entry : entries.toList()) {
                    deleteRecursively(entry);
                }
            }
        }
        Files.delete(path);
    }
}

Diqqət:
Bu kod qovluğun içində olan hər şeyi siləcək! Ehtiyatla istifadə edin.

5. Praktik məsləhətlər

Silməzdən əvvəl mövcudluğu yoxlama

if (Files.exists(path)) {
    Files.delete(path);
} else {
    System.out.println("Fayl/qovluq mövcud deyil.");
}

Amma əgər deleteIfExists istifadə edirsinizsə, bunu etmək vacib deyil.

İstisnaların emalı

Fayllarla işləyərkən tez-tez gözlənilməz hallar olur. Java bunun üçün müxtəlif istisnalar atır:

  • NoSuchFileException — fayl və ya qovluq tapılmadı. Məsələn, artıq sildiyiniz bir şeyi açmağa çalışırsınız.
  • DirectoryNotEmptyException — qovluğu silmək istəyirsiniz, amma içində hələ nəsə var.
  • IOException — ümumi bildiriş: nəsə yolunda getmədi. Səbəb müxtəlif ola bilər — giriş icazəsi yoxdur, fayl başqa proqram tərəfindən istifadə olunur, yol səhvdir.

Vizual sxem: əsas metodlar

+-------------------+         +--------------------+
| Files.createFile  | ---->   |    Yeni fayl       |
+-------------------+         +--------------------+

+---------------------+       +--------------------+
| Files.createDirectory|----> |    Yeni qovluq     |
+---------------------+       +--------------------+

+-------------------+         +--------------------+
| Files.delete      | ---->   |  Fayl/qovluq silindi |
+-------------------+         +--------------------+

(amma yalnız qovluq boşdursa!)

6. Fayl və qovluqların yaradılması və silinməsində tipik səhvlər

Səhv №1: Artıq mövcud olan fayl/qovluğu yaratmağa çalışırıq. Files.createFileFiles.createDirectory metodları obyekt artıq varsa istisna atır. Həll — əvvəlcədən mövcudluğu yoxlamaq və ya istisnanı tutmaq.

Səhv №2: createDirectory ilə iç qovluq yaratmağa çalışırıq, amma valideyn hələ yoxdur. Bu halda NoSuchFileException xətası olacaq. Qovluqlar zəncirini yaratmaq üçün createDirectories istifadə edin.

Səhv №3: Files.delete ilə boş olmayan qovluğu silməyə çalışırıq. DirectoryNotEmptyException alacaqsınız. Boş olmayan qovluqları silmək üçün rekursiya lazımdır.

Səhv №4: Göstərilən qovluqda yaratmaq/silmək üçün icazə yoxdur. AccessDeniedException və ya IOException atılacaq. Proqramı lazımi səlahiyyətlərlə işə salın və ya əlçatan qovluqlardan istifadə edin.

Səhv №5: Fayl başqa proses tərəfindən istifadə olunur. Windows-da (və bəzən digər OS-lərdə) fayl başqa proqramda açıqdırsa, onu silmək olmur. IOException alacaqsınız. Silmədən əvvəl fayldan istifadə edən bütün tətbiqləri bağlayın.

Səhv №6: “Harada olduğunuzu” anlamadan nisbi yolların istifadəsi. Fayl gözlədiyiniz yerdə deyil, başqa yerdə yaradılır. Dəqiqlik üçün toAbsolutePath() istifadə edin və yolu ekrana çıxarın.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION