1. Giriş
Köçürmə əməliyyatlarına ehtiyac olan ssenarilər çoxdur: yüklənmiş "downloaded" faylları müvəqqəti qovluqdan sənədlər qovluğuna köçürmək, şəkilləri kütləvi şəkildə çeşidləmək, şablona görə ad dəyişmək, poçt və log fayllarını emal etmək. Fayl sistemi nizamı sevir — ya ən azından onun təsvirini! Yaxşı proqramçı bu nizamı qura bilməlidir.
Bundan əlavə, bu tapşırıqlar tez-tez müsahibələrdə verilir: "Bütün faylların adını versiya nömrəsi əlavə edərək dəyişən utiliti yazın", yaxud "Köhnə sənədləri arxivə köçürən komand yazın". Gəlin C#-də bunu necə etmək olar, baxaq.
İmkanlara ümumi baxış
.NET-də köçürmə və ad dəyişdirmə üçün iki əsas yol var — statik metodlardan istifadə etmək (File.Move, Directory.Move) və ya instans metodlardan (FileInfo.MoveTo, DirectoryInfo.MoveTo). Bu metodlar əslində demək olar ki, eyni işi görür — fərq əsasən sintaksisdədir.
.NET köçürmə və ad dəyişdirməni necə "görür"?
Diqqət! Adın dəyişdirilməsi və köçürülmə — mahiyyətcə eyni əməliyyətdir: fayl və ya qovluq fayl sistemində yerini yoluyla müəyyən edir. Yol dəyişərsə — obyekt "köçürüldü" və ya "yenidən adlandırıldı" hesab olunur. Əgər yalnız adı dəyişdirirsiniz, eyni kataloqda qalırsa — bu ad dəyişdirmədir. Əgər tam yol dəyişirsə — köçürmə. Filozofiya Schrödinger-in pişiyi kimidir: yeni yol və yeni ad göstərsəniz, obyekt həm köçürülmüş, həm də adı dəyişdirilmiş olur!
2. Faylların köçürülməsi və ad dəyişdirilməsi: nümunələr
Sadədən mürəkkəbə doğru gedəcəyik və mini fayl menecerimiz əsasında davam edəcəyik.
Statik metod File.Move
Faylı necə köçürmək (və ya yenidən adlandırmaq) nümunəsi:
// Faylı test1.txt-i başqa qovluğa yeni adla köçürürük
File.Move(@"C:\Temp\test1.txt", @"C:\Archive\test1_archived.txt");
Əgər eyni qovluqda sadəcə faylın adını dəyişmək istəsəniz:
// Sadəcə faylın adını dəyişirik
File.Move(@"C:\Temp\test1.txt", @"C:\Temp\test_renamed.txt");
Budur bütün sehr! .NET sadəcə bir yolu "kəsib" obyekti başqa yola "təyin edir", əgər hər iki yol əlçatan və münaqişəsizdirsə.
Statik metod Directory.Move
Qovluqlarla da bənzər:
// Qovluğu köçürürük
Directory.Move(@"C:\Temp\OldFolder", @"C:\Temp\NewFolder");
Qovluğu eyni kataloqda adını dəyişmək də olar, həmçinin tamamilə başqa yerə köçürmək də.
3. Instans metodlar: FileInfo.MoveTo və DirectoryInfo.MoveTo
Əgər artıq FileInfo və ya DirectoryInfo obyekti varsa, MoveTo() metodu çağırıla bilər:
var fileInfo = new FileInfo(@"C:\Temp\test1.txt");
fileInfo.MoveTo(@"C:\Archive\test1_archived.txt");
// Qovqlar üçün:
var dirInfo = new DirectoryInfo(@"C:\Temp\OldFolder");
dirInfo.MoveTo(@"C:\Temp\NewFolder");
Burada da eyni qayda: yeni yol eyni kataloqda başqa adsa — ad dəyişmə; başqa kataloqdadırsa — köçürmə baş verir.
4. Məqsəd yerində fayl artıq varsa nə olur?
Buranı qorxulu detalları başlayır, hansılar ki pis vaxtda "dişləyə" bilər.
File.Move
Əgər təyinat yolunda artıq fayl varsa — IOException atılacaq və kodunuz "yıxılacaq":
try
{
File.Move("data.txt", "archive\\data.txt");
}
catch (IOException ex)
{
Console.WriteLine("Məqsəd faylı artıq mövcuddur! " + ex.Message);
}
FileInfo.MoveTo
Tam eyni vəziyyət — əgər təyinat faylı artıq varsa IOException atılır.
Directory.Move
Qovluqlarda vəziyyət daha sərtdir: əgər hədəf qovluq artıq mövcuddursa — istisna atılacaq. Bir qovluğu artıq dolu olan qovluğa köçürmək olmaz.
Məsələ: Həmişə yoxlayın, hədəfdə belə fayl və ya qovluq yoxdur!
// Sakitcə yoxlayırıq, hədəf yolunda fayl varmı
if (!File.Exists("archive\\data.txt"))
{
File.Move("data.txt", "archive\\data.txt");
}
else
{
Console.WriteLine("Məqsəd faylı artıq mövcuddur!");
}
5. Faydalı nüanslar
Qovluğun adının dəyişdirilməsi nümunəsi
var oldDir = @"C:\Projects\OldReport";
var newDir = @"C:\Projects\NewReport";
// Yeni qovluq yoxdur və köhnə mövcuddursa yoxlayırıq
if (Directory.Exists(oldDir) && !Directory.Exists(newDir))
{
Directory.Move(oldDir, newDir);
Console.WriteLine("Qovluğun adı uğurla dəyişdirildi.");
}
else
{
Console.WriteLine("Səhv: mənbə qovluq tapılmadı və ya yeni artıq mövcuddur.");
}
Daxili məzmunu nəzərə alaraq ad dəyişdirmə
Qovluğun bütün məzmunu (altqovluqlar, fayllar) əlavə əmrlər tələb etmədən onunla birlikdə köçürüləcək! Bu rahatdır: bir əmrlə istənilən dərinlikdə qovluq yeni yerə düşür.
Ən yaxşı təcrübələr və Path sinfinin faydalı metodları
Faylları adlandırarkən və ya köçürərkən System.IO.Path sinfinin metodlarından istifadə edin ki, yeni yolu düzgün qurasınız və ya fayl adını dəyişəsiniz:
- Fayl adını uzantısız almaq: Path.GetFileNameWithoutExtension(path)
- Yalnız uzantını dəyişmək: Path.ChangeExtension(path, ".bak")
- Başqa adla yeni yol qurmaq: Path.Combine(Path.GetDirectoryName(path), "newname.txt")
string oldPath = @"C:\Reports\2023_Final.docx";
string newName = "2023_Archive.docx";
string newPath = Path.Combine(Path.GetDirectoryName(oldPath)!, newName);
File.Move(oldPath, newPath);
6. Vacib nüanslar və tipik səhvlər
İcazələr və bloklanma
Əgər yollardan birində yazmaq icazəniz yoxdursa — UnauthorizedAccessException atılacaq. Eyni şəkildə, fayl başqa proses tərəfindən istifadə olunursa (məsələn, Word-də açılıbsa), səhv alacaqsınız. Bu çox yayılmış haldır.
Müxtəlif disk və volümlər arasında köçürmə
Əslində File.Move eyni volüm/disk daxilində sürətli ad dəyişdirmə əməliyyatını həyata keçirir. Faylı C diskindən D diskə köçürməyə çalışsanız — .NET avtomatik olaraq kopyalama + mənbə faylın silinməsi əməliyyatını edəcək. Hədəf diskin dolu olması kimi qüsur olarsa, mənbə fayl yerində qalacaq.
Maraqlı fakt: demək olar ki, bütün müasir fayl sistemləri volümdaxili "sürətli ad dəyişdirmə/köçürmə"ni dəstəkləyir; volümlər arasında isə kopyalama + silmə olur.
Tam qovluqları köçürmə (Directory.Move)
Bir qovluğu özünün içinə və ya onun alt qovluğuna köçürmək olmaz (məsələn, C:\Data-nı C:\Data\Archive-a) — bu səhvə səbəb olacaq.
Necə təhlükəsiz köçürmək?
Hər hansı köçürmədən əvvəl, xüsusən kütləvi əməliyyatda, mənbənin mövcudluğunu (File.Exists, Directory.Exists) və hədəfdə münaqişə olmadığını yoxlayın. Və try-catch-i unutmayın: fayl sistemi həssasdır, gözlənilməz vaxtda səhv verə bilər.
GO TO FULL VERSION