Yazılım Mimarileri ve Tasarım Desenleri Üzerine

File İşlemlerinde “İşlem, Başka Bir İşlem Tarafından Kullanıldığından ‘…’ Dosyasına Erişemiyor” Hatası ve Çözümü

Bu yazımızda C# ile File(Dosya) işlemleriyle uğraşırken “İşlem, başka bir işlem tarafından kullanıldığından ‘…’ dosyasına erişemiyor.” hatasına ve çözümüne değineceğiz.

Öncelikle alınan hatamızın görsel halini görmemiz gerekirse aşağıdaki ekran görüntüsünü inceleyiniz.

Bu hatayı alabileceğimiz olası bir kaç durumu örneklendirmek istiyorum.

            if (!File.Exists("D:\\MetinBelgesi.txt"))
                File.Create("D:\\MetinBelgesi.txt");

            string[] YazilacakIcerik = new string[] { "Gençay", "Mustafa", "Necati", "Cemil", "İbrahim" };
            File.AppendAllLines("D:\\MetinBelgesi.txt", YazilacakIcerik);

Yukarıdaki gibi File.Create ile oluşturulan bir dosya üzerinde daha sonradan yapılmak istenen işlemlerde bu hatayla karşılaşabiliriz.

            if (!File.Exists("D:\\Ornek.jpg"))
                File.Create("D:\\Ornek.jpg");
            .
            .
            .
            File.Delete("D:\\Ornek.jpg");

Ya da oluşturulmuş bir dosyayı, silmek istediğimiz durumlarda da bu hata karşımıza çıkabilir.

            if (!File.Exists("D:\\Ornek.jpg"))
                File.Create("D:\\Ornek.jpg");
            .
            .
            .
            File.Open("D:\\Ornek.jpg", FileMode.Open);

Ya da oluşturulmuş bir dosyayı açmak istediğimizde…

            File.Open("D:\\Ornek.jpg", FileMode.Open);
            .
            .
            .
            File.Delete("D:\\Ornek.jpg");

Açık bir dosyayı silmek istediğimizde…

            File.Open("D:\\Ornek.jpg", FileMode.Open);
            .
            .
            .
            File.Copy("D:\\Ornek.jpg","abc");

vs… vs…

Anlayacağınız önceden File ile bir dosya üzerinde işlem gerçekleştiriyorsak, ardından aynı dosya üzerinde farklı bir işlem uygulamaya çalıştığımızda bu hatayla karşılaşmaktayız.

Bu hatanın teknik sebebi, ilgili dosya halen kullanıldığı için onu silemiyor, güncelleyemiyor, kopyalayamıyor, kesemiyor, açamıyor, kapatamıyor vs. vs. üzerinde herhangi bir işlem yapamıyorsunuz…Eğer bir dosya üzerinde bir işlem yaptıysanız o işlem neticesinde o dosya hala kullanılıyor gözükecektir.O yüzden her işlem neticesinde ilgili dosyayı Close etmeniz gerekmektedir.

Örnek olarak aşağıdaki kod bloğunu inceleyiniz.

            File.Open("D:\\Ornek.jpg", FileMode.Open).Close();
            .
            .
            .
            File.Copy("D:\\Ornek.jpg","Dosya");

Gördüğünüz gibi ilgili dosya üzerinde Open metodu ile açma işlemi uyguladıktan sonra o dosyanın kullanımını Close ile durduruyorum.Bu sayede bir sonraki Copy metodu için hatasız kullanım sağlanmaktadır.

Benzer şekilde diğer işlemler içinde yaptığınız işlemi Close etmeyi unutmayınız!

Yazımızın sonuna gelmeden önce aynı işlemi yapabileceğimiz bir başka teknik göstermek istiyorum.

            FileStream fs = new FileStream("D:\\Ornek.jpg", FileMode.OpenOrCreate); 

            fs.Flush();
            fs.Close();

            File.Open("D:\\Ornek.jpg", FileMode.Open);

Yukarıdaki kod bloğunu incelerseniz eğer File sınıfından ziyade FileStream sınıfı üzerinde çalışıyoruz.İlgili dosyayı FileStream nesnesi üzerine alarak işlemimizi FileMode.OpenOrCreate parametresiyle görüyoruz ve ardından ilgili dosyayla olan ilişkimizi Flush ve Close metodlarıyla kesiyoruz.Haliyle Open, Delete veyahut Copy gibi metodlar bu mantıksal işlevden sonra sorunsuz çalıştırılmaktadırlar.

Bu yazımızında sonuna gelmiş bulunmaktayız…

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…

Mobil sürümden çık