C# File.Exists(dosyaYolu) bool döndürür: true ise yol mevcut bir dosyaya işaret eder ve dosya işlemini başlatabilirsin, false ise yolu ve dosyanın durumunu ayrıca ele alman gerekir. File.Exists dosyayı açmaz; yalnızca belirtilen yolun mevcut bir dosyaya işaret edip etmediğini kontrol eder. Bu yazıda metodun doğru kullanımını, çalışan bir örneği ve false sonucunun nedenini bulmak için izleyebileceğin sırayı bulacaksın.
File.Exists nasıl yazılır ve if ile nasıl kullanılır?
File.Exists, System.IO ad alanında bulunan statik bir metottur. Bu yüzden dosyanın başına using System.IO; eklemen gerekir. Metot, bir string yol alır ve bool döndürür; resmî Microsoft dokümantasyonu da imzayı bu biçimde tanımlar.
Dönüş değeri bir koşul ifadesi olduğu için doğrudan if içine yazılabilir:
using System;
using System.IO;
class Program
{
static void Main()
{
string yol = @"C:Verilernotlar.txt";
if (File.Exists(yol))
{
Console.WriteLine("Dosya bulundu, işleme başlanabilir.");
}
else
{
Console.WriteLine("Yol mevcut bir dosyaya işaret etmiyor.");
}
}
}
Bilgisayarında C:Verilernotlar.txt adlı bir dosya varsa ilk mesaj, yoksa ikinci mesaj yazılır. Yolun başındaki @ işareti, ters eğik çizgilerin kaçış karakteri olarak yorumlanmasını engeller. Bu işareti yazmazsan V gibi diziler derleme hatasına yol açar.
Dönüş değerini doğru yorumlamak önemlidir:
- true: Yol, kontrol anında mevcut bir dosyaya işaret ediyor.
- false: Yol mevcut bir dosyaya işaret etmiyor. Bu, dosyanın kesin olarak bulunmadığı anlamına gelmek zorunda değildir. Yol yanlış yere çözümleniyor, bir klasörü gösteriyor ya da yazım hatası içeriyor olabilir.
Dosya içeriğini okuma ya da yazma konusu bu yazının kapsamı dışındadır; burada yalnızca "yol bir dosyaya çıkıyor mu?" sorusuna odaklanıyoruz.
Çalışan örnek: geçici dosya ile True ve False çıktısı

Aşağıdaki program kendi dosyasını kendisi oluşturduğu için her bilgisayarda aynı sonucu verir. Önce diskte gerçekten var olan bir dosya, sonra hiç var olmayan bir yol üretir ve ikisini File.Exists ile dener.
using System;
using System.IO;
class Program
{
static void Main()
{
// Diskte 0 baytlık benzersiz bir geçici dosya oluşturur
string varOlanYol = Path.GetTempFileName();
// Rastgele bir ad üretir; bu dosyayı hiç oluşturmuyoruz
string olmayanYol = Path.Combine(
Path.GetTempPath(),
Guid.NewGuid().ToString() + ".txt");
Console.WriteLine(File.Exists(varOlanYol));
Console.WriteLine(File.Exists(olmayanYol));
File.Delete(varOlanYol);
Console.WriteLine(File.Exists(varOlanYol));
}
}
Beklenen çıktı:
True
False
False
- İlk satır (True):
Path.GetTempFileName()yalnızca bir ad üretmez; benzersiz adlı, 0 baytlık bir dosyayı geçici klasörde diskte yaratır. Yol artık mevcut bir dosyaya işaret ettiği için sonuçTrueolur. - İkinci satır (False):
Guid.NewGuid()ile üretilen ad daha önce kullanılmamıştır ve bu yolda hiçbir dosya oluşturmadık. Metotfalsedöndürür. - Üçüncü satır (False):
File.Deletedosyayı sildikten sonra aynı yol artık bir dosyaya işaret etmez. Yol değişkeni aynı kalsa da sonuç değişir; çünküFile.Existsher çağrıldığında dosya sisteminin o anki durumuna bakar.
Son nokta önemlidir: sonuç bir kez hesaplandıktan sonra sabit kalmaz. Bunun pratikte ne anlama geldiğini yazının son bölümünde ele alacağız.
False dönünce hangi sırayla kontrol etmelisin? Dört adımlı teşhis
File.Exists beklemediğin bir false döndürdüğünde rastgele denemeler yapmak yerine aşağıdaki sırayı izleyebilirsin. Adımlar, en ucuz ve en sık görülen kontrolden başlayarak ilerler.
| Adım | Sorulacak soru | Nasıl kontrol edilir |
|---|---|---|
| 1 | Yol boş ya da null mı? | string.IsNullOrWhiteSpace(yol) ile değişkenin dolu olduğunu doğrula. |
| 2 | Yol tam olarak hangi konuma çözümleniyor? | Path.GetFullPath(yol) sonucunu yazdır ve çıkan yolu dosya gezgininde ara. |
| 3 | Yol bir klasöre mi çıkıyor, dosyaya mı? | Directory.Exists(yol) sonucunu File.Exists(yol) ile karşılaştır. |
| 4 | Ad, uzantı, ters eğik çizgi ya da izin sorunu var mı? | Dosya adını ve uzantısını klasördeki gerçek adla harf harf karşılaştır, yoldaki karakterlerini incele, hesabının klasöre erişimi olup olmadığına bak. |
Akışı uygularken her adımda bir şeyi değiştirip sonucu yeniden dene; böylece sorunun hangi adımda çözüldüğünü bilirsin. Örneğin yolu ekrana yazdırdığında beklediğinden farklı bir klasör görürsen 2. adımda durup yolun kaynağını düzeltebilirsin. 3. adımda Directory.Exists true dönüyorsa elindeki yol bir dosyanın değil bir klasörün yoludur. Hiçbir adımda belirgin bir bulgu çıkmazsa 4. adımdaki ayrıntılara geç.
Her adımın ayrıntıları, örnekleriyle birlikte sonraki bölümlerde işleniyor; bu tablo yalnızca sıralamayı gösteren bir kontrol listesi olarak işine yarar.
Göreli yol mu mutlak yol mu: yol gerçekte neye çözümleniyor?
Mutlak yol sürücüden başlayan tam konumdur, örneğin C:ProjelerDenemeveri.txt. Göreli yol ise yalnızca veri.txt gibi kısmi bir ifadedir ve programın çalışma dizinine göre çözümlenir. Çalışma dizini her zaman kaynak kodun durduğu klasör değildir. Derlenmiş çıktı klasörü olabilir, uygulamayı IDE'den mi komut satırından mı başlattığına göre de değişebilir.
Path.GetFullPath, göreli bir yolu geçerli çalışma dizinine göre tam yola çevirir (Microsoft dokümantasyonunda da bu şekilde tanımlanır). Böylece File.Exists'in dosyayı gerçekte nerede aradığını görebilirsin:
using System;
using System.IO;
class Program
{
static void Main()
{
Console.WriteLine(Directory.GetCurrentDirectory());
Console.WriteLine(Path.GetFullPath("veri.txt"));
Console.WriteLine(File.Exists("veri.txt"));
}
}
Örnek bir çıktı (klasör adları makinene göre değişir):
C:ProjelerDenemebinDebug
C:ProjelerDenemebinDebugveri.txt
False
İkinci satır önemlidir: çıktıdaki tam yol, dosyanın gerçekte aranan konumudur. Dosyayı proje klasörüne koyup binDebug altına koymadıysan sonuç False olur. O tam yolu dosya gezgininde açıp dosyanın orada olup olmadığına bak. Yoksa dosyayı oraya taşıyabilir ya da kodda mutlak yol kullanabilirsin.
Klasör yolu, yazım hatası, eksik uzantı ve ters eğik çizgi sorunları

Klasör yolu File.Exists için false verir
File.Exists yalnızca dosyaları denetler. Yol var olan bir klasöre işaret etse bile sonuç False döner. Klasör için Directory.Exists kullanılır:
using System;
using System.IO;
class Program
{
static void Main()
{
string klasor = Path.GetTempPath();
Console.WriteLine(File.Exists(klasor));
Console.WriteLine(Directory.Exists(klasor));
}
}
Beklenen çıktı:
False
True
Yani False gördüğünde yolun bir klasörü gösterip göstermediğini de kontrol et.
Yazım hatası ve eksik uzantı
Karakter karakter eşleşme gerekir: veri ile veri.txt farklı adlardır. Windows'ta bilinen dosya türlerinin uzantıları Dosya Gezgini'nde varsayılan olarak gizli olabilir. Dosyaya "veri.txt" adını verip kaydettiğinde gerçek ad veri.txt.txt olabilir. Uzantıları göster seçeneğini açıp adı gözle doğrula, ya da klasörün içeriğini kodla listele.
Ters eğik çizgi ve kaçış dizileri
C# normal dizelerde karakterini kaçış başlangıcı sayar. "C:Belgelernot.txt" yazımında B tanınmayan bir kaçış dizisi olduğu için derleme hatası alırsın. Daha sinsi olan durum "C:tempnot.txt"'dir: t sekme karakteri olarak yorumlanır, kod derlenir ama yol yanlış olur. Üç çözüm yolu var:
string a = @"C:Belgelernot.txt"; // verbatim string
string b = "C:\Belgeler\not.txt"; // her iki kez
string c = Path.Combine(@"C:Belgeler", "not.txt"); // parçalardan kur
Üçü de aynı yolu üretir. Path.Combine, ayırıcı karakteri senin yerine ekler ve klasör ile dosya adını ayrı değişkenlerde tutarken işini kolaylaştırır.
Erişim izni ve geçersiz yol durumlarında File.Exists ne döndürür?
Dosya işlemlerinin çoğu sorun olduğunda istisna fırlatır, File.Exists ise genel olarak istisna fırlatmayacak biçimde tasarlanmıştır. Microsoft dokümantasyonuna göre yol null, geçersiz ya da boş bir dize olduğunda metot false döndürür. Çağıran, belirtilen dosyayı okumak için gerekli izne sahip değilse de istisna oluşmaz ve dosya gerçekte var olsa bile false döner. Dokümantasyon ayrıca, dosyanın var olup olmadığı belirlenmeye çalışılırken herhangi bir hata oluşursa sonucun false olacağını belirtir. Yolda geçersiz karakter bulunması ya da yolun çok uzun olması bu hataların örnekleri arasında sayılır.
Bunun pratik anlamı şudur: False sonucu "dosya yok" ile "dosyaya bakılamadı" durumlarını birbirinden ayırmaz. Dosyanın var olduğundan eminsen ve hâlâ False alıyorsan şu sırayla ilerleyebilirsin:
- Yazdırdığın tam yolun doğru olduğunu ve içinde geçersiz karakter bulunmadığını doğrula.
- Değişkenin
nullya da boş olmadığına bak. - Programı çalıştıran hesabın ilgili klasöre ve dosyaya okuma izni olup olmadığını işletim sisteminin özellikler penceresinden kontrol et.
- Dosyanın başka bir sürücüde ya da ağ konumunda olması durumunda, o konuma erişimin açık olduğunu denetle.
Sebebi ayrıntılı görmek istiyorsan dosyayı gerçekten açmayı dene ve oluşan istisnanın türüne bak. Bu yaklaşımı yazının son bölümünde ele alıyoruz.
Kontrol ile kullanım arasında dosya değişebilir: try-catch ile koru
File.Exists true döndürdüğü an yalnızca o anın fotoğrafını verir. Sonraki satıra geçmeden dosya silinebilir, taşınabilir ya da başka bir program tarafından kilitlenebilir. Bu yüzden File.Exists ön kontrol olarak kalır, asıl dosya işlemi try-catch ile korunur.
using System;
using System.IO;
class Program
{
static void Main()
{
string yol = "notlar.txt";
if (!File.Exists(yol))
{
Console.WriteLine("Dosya bulunamadı: " + yol);
return;
}
try
{
string metin = File.ReadAllText(yol);
Console.WriteLine("Okunan karakter sayısı: " + metin.Length);
}
catch (FileNotFoundException)
{
Console.WriteLine("Kontrolden sonra dosya silinmiş ya da taşınmış.");
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("Bu dosyaya erişim iznin yok.");
}
catch (IOException ex)
{
Console.WriteLine("Dosya kullanılamıyor: " + ex.Message);
}
}
}
Dosya sağlam ve okunabilirse karakter sayısı yazılır. Kontrol geçtikten sonra dosya kaybolursa ikinci mesaj, erişim engellenirse üçüncü mesaj çıkar. Dosya başka bir işlem tarafından kullanılıyorsa genellikle IOException yakalanır.
Sıra önemlidir: FileNotFoundException, IOException sınıfından türediği için ondan önce yazılmalıdır. Aksi hâlde genel yakalayıcı hatayı önce alır. UnauthorizedAccessException ise ayrı bir türdür ve sırası fark etmez.
Dosya işlemlerinde nerede olduğunu görmek istersen ücretsiz C# bilgi testi seviyeni ölçmene yardımcı olabilir. Bu test yalnızca seviye ölçümüdür.
Özetle: önce File.Exists ile yolu yokla, sonra dosya işlemini try-catch içinde yap. False döndüğünde yolu, dosya adını ve uzantıyı gözden geçir, true döndüğünde de işlemin başarısız olabileceğini hesaba kat.