CodeGym /Kurslar /JAVA 25 SELF /Fayl atributlarının əldə edilməsi və dəyişdirilməsi

Fayl atributlarının əldə edilməsi və dəyişdirilməsi

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

1. Əsas atributların oxunması: BasicFileAttributes

Fayl və ya qovluq haqqında danışanda yalnız adını və ya ölçüsünü nəzərdə tutmuruq. Hər faylın “pasportu” — atributlar dəsti var, o da bunları ehtiva edir:

  • Yaradılma vaxtı
  • Son dəyişiklik vaxtı
  • Son giriş vaxtı
  • Ölçü
  • Giriş icazələri (kim oxuya, yaza, icra edə bilər)
  • Sahib haqqında məlumat (Unix-də)
  • “gizli”, “yalnız oxu” kimi xüsusiyyətlər və s.

Java-da bu atributlarla işləmək üçün java.nio.file.attribute paketində rahat və güclü API var. Platformadan asılı kod yazmağa ehtiyac yoxdur: lazım olan hər şey standart kitabxanadadır.

Əvvəlcə — lazım olan sinifləri import edək:

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

Faylın əsas atributlarını necə əldə etmək olar?

Files.readAttributes metodundan istifadə edək:

Path path = Paths.get("example.txt");
try {
    BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);

    System.out.println("Yaradılıb: " + attrs.creationTime());
    System.out.println("Dəyişdirilib: " + attrs.lastModifiedTime());
    System.out.println("Son giriş: " + attrs.lastAccessTime());
    System.out.println("Ölçü: " + attrs.size());
    System.out.println("Bu qovluqdur? " + attrs.isDirectory());
    System.out.println("Bu fayldır? " + attrs.isRegularFile());
    System.out.println("Bu simvolik keçiddir? " + attrs.isSymbolicLink());
} catch (IOException e) {
    System.out.println("Atributlar oxunarkən xəta: " + e.getMessage());
}

Təsəvvür edin ki, siz inspektorsunuz və mənzili yoxlamağa gəlmisiniz. Təkcə qapının olub-olmamasına (faylın mövcudluğuna) baxmırsınız, həm də sakinlərdən soruşursunuz: “Evi nə vaxt tikiblər? Son dəfə nə vaxt təmir olunub? Sahibi kimdir?”.

BasicFileAttributes xassələri qısaca

Xassə Nə qaytarır?
creationTime()
Fayl/qovluğun yaradılma tarixi və vaxtı
lastModifiedTime()
Son dəyişiklik tarixi və vaxtı
lastAccessTime()
Son giriş tarixi və vaxtı
size()
Faylın ölçüsü (baytla)
isDirectory()
Bu qovluqdur?
isRegularFile()
Bu adi fayldır?
isSymbolicLink()
Bu simvolik keçiddir?

2. Genişləndirilmiş atributlar: POSIX və DOS

POSIX atributları (Linux, macOS və digər Unix-oxşar OS-lər)

Unix sistemində işləyirsinizsə, geniş məlumat əldə etmək olar: icazələr, sahibi, qrup.

try {
    PosixFileAttributes posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
    System.out.println("Sahib: " + posixAttrs.owner().getName());
    System.out.println("Qrup: " + posixAttrs.group().getName());
    System.out.println("İcazələr: " + PosixFilePermissions.toString(posixAttrs.permissions()));
} catch (UnsupportedOperationException e) {
    System.out.println("Bu OS-də POSIX atributları dəstəklənmir.");
} catch (IOException e) {
    System.out.println("POSIX atributları oxunarkən xəta: " + e.getMessage());
}

Qeyd: Windows-da bu kod UnsupportedOperationException atacaq — bu normaldır.

DOS atributları (Windows)

Windows-da «yalnız oxu», «gizli», «arxiv», «sistem» xüsusiyyətləri ilə işləmək olar:

try {
    DosFileAttributes dosAttrs = Files.readAttributes(path, DosFileAttributes.class);
    System.out.println("Gizlidir: " + dosAttrs.isHidden());
    System.out.println("Yalnız oxu: " + dosAttrs.isReadOnly());
    System.out.println("Sistemdir: " + dosAttrs.isSystem());
    System.out.println("Arxivdir: " + dosAttrs.isArchive());
} catch (UnsupportedOperationException e) {
    System.out.println("Bu OS-də DOS atributları dəstəklənmir.");
} catch (IOException e) {
    System.out.println("DOS atributları oxunarkən xəta: " + e.getMessage());
}

3. Fayl atributlarının dəyişdirilməsi

Başqasının pasportunu oxumaq bir şeydir, amma doğum tarixini və ya soyadını dəyişmək tamam başqa! Java-da fayl atributlarını dəyişə bilərik (əlbəttə, lazımi icazələrlə).

Son modifikasiya vaxtının dəyişdirilməsi

import java.nio.file.attribute.FileTime;

Path file = Paths.get("example.txt");
try {
    FileTime newTime = FileTime.fromMillis(System.currentTimeMillis() - 24 * 60 * 60 * 1000); // 1 gün çıxılır
    Files.setLastModifiedTime(file, newTime);
    System.out.println("Son modifikasiya vaxtı dəyişdirildi!");
} catch (IOException e) {
    System.out.println("Vaxt dəyişdirilərkən xəta: " + e.getMessage());
}

Giriş icazələrinin dəyişdirilməsi (POSIX)

Yalnız Unix sistemləri üçün! Məsələn, faylı hamı üçün icra edilə bilən etmək:

try {
    Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-xr-x");
    Files.setPosixFilePermissions(file, perms);
    System.out.println("İcazələr dəyişdirildi!");
} catch (UnsupportedOperationException e) {
    System.out.println("Bu OS-də POSIX icazələri dəstəklənmir.");
} catch (IOException e) {
    System.out.println("İcazələr dəyişdirilərkən xəta: " + e.getMessage());
}

Sətirin izahı "rwxr-xr-x":

  • r — read (oxuma)
  • w — write (yazma)
  • x — execute (icra)
  • 3 simvoldan ibarət birinci blok — sahib, ikinci — qrup, üçüncü — digərləri.

Gizli/yalnız oxu statusunun dəyişdirilməsi (DOS atributları, Windows)

Faylı gizli etmək:

try {
    Files.setAttribute(file, "dos:hidden", true);
    System.out.println("Fayl gizli oldu (Windows)!");
} catch (UnsupportedOperationException e) {
    System.out.println("Bu OS-də DOS atributları dəstəklənmir.");
} catch (IOException e) {
    System.out.println("Atribut dəyişdirilərkən xəta: " + e.getMessage());
}

Faylı «yalnız oxu» etmək:

try {
    Files.setAttribute(file, "dos:readonly", true);
    System.out.println("Fayl indi «yalnız oxu»dur (Windows)!");
} catch (UnsupportedOperationException e) {
    System.out.println("Bu OS-də DOS atributları dəstəklənmir.");
} catch (IOException e) {
    System.out.println("Atribut dəyişdirilərkən xəta: " + e.getMessage());
}

4. Giriş icazələrinin yoxlanması

Bəzən faylı oxuma, yazma və ya icra üçün açıla bilib-bilmədiyini tez yoxlamaq vacibdir:

Path file = Paths.get("example.txt");
System.out.println("Oxuma icazəlidir: " + Files.isReadable(file));
System.out.println("Yazma icazəlidir: " + Files.isWritable(file));
System.out.println("İcra icazəlidir: " + Files.isExecutable(file));

Bu, bütün platformalarda eyni işləyir, baxmayaraq ki, real davranış OS-dən və təhlükəsizlik parametrlərindən asılıdır.

5. Təcrübə: fayl haqqında ətraflı məlumatın çıxışı

Faylın yolunu verən kimi maksimum məlumatı göstərən və bəzi atributları dəyişməyə cəhd edən kiçik bir proqram yazaq.

import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.Set;
import java.io.IOException;

public class FileAttributesDemo {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("example.txt");

        if (!Files.exists(path)) {
            System.out.println("Fayl tapılmadı!");
            return;
        }

        // Əsas atributlar
        BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
        System.out.println("Ad: " + path.getFileName());
        System.out.println("Yol: " + path.toAbsolutePath());
        System.out.println("Ölçü: " + attrs.size() + " bayt");
        System.out.println("Yaradılıb: " + attrs.creationTime());
        System.out.println("Dəyişdirilib: " + attrs.lastModifiedTime());
        System.out.println("Son giriş: " + attrs.lastAccessTime());
        System.out.println("Bu qovluqdur? " + attrs.isDirectory());
        System.out.println("Bu fayldır? " + attrs.isRegularFile());

        // Giriş icazələrinin yoxlanması
        System.out.println("Oxuma icazəlidir: " + Files.isReadable(path));
        System.out.println("Yazma icazəlidir: " + Files.isWritable(path));
        System.out.println("İcra icazəlidir: " + Files.isExecutable(path));

        // Modifikasiya vaxtını dəyişməyə cəhd edək
        FileTime now = FileTime.fromMillis(System.currentTimeMillis());
        Files.setLastModifiedTime(path, now);
        System.out.println("Son modifikasiya vaxtı yeniləndi!");

        // Faylı gizli etməyə cəhd edək (dəstəklənirsə)
        try {
            Files.setAttribute(path, "dos:hidden", true);
            System.out.println("Fayl gizli oldu (OS dəstəkləyirsə).");
        } catch (UnsupportedOperationException e) {
            System.out.println("Bu OS-də gizli fayllar dəstəklənmir.");
        }

        // POSIX icazələrini göstərməyə cəhd edək (dəstəklənirsə)
        try {
            PosixFileAttributes posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
            System.out.println("Sahib: " + posixAttrs.owner().getName());
            System.out.println("İcazələr: " + PosixFilePermissions.toString(posixAttrs.permissions()));
        } catch (UnsupportedOperationException e) {
            System.out.println("Bu OS-də POSIX atributları dəstəklənmir.");
        }
    }
}

6. Faydalı nüanslar

Kross‑platform fərqlər və məsləhətlər

  • Bütün atributlar bütün OS-lərdə mövcud deyil! Windows-da POSIX icazələri yoxdur, Linux-da isə DOS atributları yoxdur.
  • Həmişə try-catch istifadə edin! Metodlar UnsupportedOperationException və ya IOException ata bilər.
  • Giriş icazələri həmişə yalnız «rwx» demək deyil! Windows-da icazə modeli fərqlidir, «yalnız oxu» OS-in təhlükəsizlik siyasəti ilə təyin oluna bilər.
  • Gizli fayllar — nisbətə bağlı anlayışdır. Unix-də fayl adı nöqtə ilə başlayırsa (.hidden), gizli sayılır; Windows-da isə atribut dos:hidden qurulubsa.

Cədvəl: hansı atributlar harada mövcuddur

Atribut Windows (dos:*) Linux/macOS (posix:*)
Yaradılma vaxtı + +
Son dəyişiklik vaxtı + +
Son giriş vaxtı + +
Gizli fayl + Yalnız ad nöqtə ilə
Yalnız oxu + +
İcazələr (rwx) - +
Sahib, qrup - +
Arxiv, sistem + -

7. Fayl atributları ilə işləyərkən tipik səhvlər

Səhv №1: Windows-da POSIX atributlarını oxumağa və ya dəyişməyə cəhd. Windows-da UnsupportedOperationException alacaqsınız. Kross‑platform kod yazarkən bu istisnanı həmişə emal edin.

Səhv №2: Başqa proses tərəfindən açıq olan faylın modifikasiya vaxtını dəyişmək. Bəzi sistemlərdə fayl bloklana bilər və əməliyyat xətayla başa çatar.

Səhv №3: «faylı gizlət» əməliyyatının bütün OS-lərdə eyni işləyəcəyini gözləmək. Unix-də adı nöqtə ilə başlayan (.gitignore) fayl gizlidir, Windows-da isə atribut dos:hidden qoyulubsa. Bu yanaşmaları qarışdırmayın.

Səhv №4: Əməliyyatdan əvvəl faylın mövcudluğunu yoxlamamaq. Fayl yoxdursa, atributları əldə etməyə və ya dəyişməyə cəhd edərkən NoSuchFileException alacaqsınız.

Səhv №5: Giriş icazələrinin yoxlanmaması. İstifadəçinin atributları dəyişməyə icazəsi yoxdursa, əməliyyat xətayla bitəcək. Dəyişiklikdən əvvəl Files.isWritable(path) yoxlayın.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Təhlükəsizlik eksperti: giriş icazələrinin auditi
Təhlükəsizlik eksperti: giriş icazələrinin auditi
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Arxiv mühafizi: zaman möhürünün yenilənməsi
Arxiv mühafizi: zaman möhürünün yenilənməsi
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Fayl sistemi ilə iş
Fayl sistemi ilə iş
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION