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? |
|---|---|
|
Fayl/qovluğun yaradılma tarixi və vaxtı |
|
Son dəyişiklik tarixi və vaxtı |
|
Son giriş tarixi və vaxtı |
|
Faylın ölçüsü (baytla) |
|
Bu qovluqdur? |
|
Bu adi fayldır? |
|
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.
GO TO FULL VERSION