CodeGym /Kurslar /C# SELF /Faylların və qovluqların köçürülməsi

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

C# SELF
Səviyyə, Dərs
Mövcuddur

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.

2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Bütün faylları bir qovluqdan digərinə köçürmək
Bütün faylları bir qovluqdan digərinə köçürmək
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION