CodeGym /Kursy /C# SELF /Sprawdzanie istnienia pliku/folderu

Sprawdzanie istnienia pliku/folderu

C# SELF
Poziom 38, Lekcja 2
Dostępny

1. Wprowadzenie

Dlaczego ważne jest sprawdzanie, czy plik lub folder istnieje?

Wyobraź sobie, że piszesz dziennik, i twoja aplikacja pozwala dopisać wpis na końcu pliku. Wszystko działa dopóki plik istnieje. Ale jeśli plik zostanie przypadkowo usunięty, program wyrzuci błąd, i wszystkie twoje genialne myśli o sensie życia lub, w najgorszym wypadku, o pogodzie, znikną bez śladu. Podobnie, jeśli chcesz stworzyć nowy plik, żeby nic nie stracić, warto upewnić się, że takiego pliku jeszcze nie ma.

W realnych aplikacjach — zwłaszcza w korporacyjnym i przemysłowym developmentcie — wstępne sprawdzenia istnienia plików i folderów pozwalają uniknąć nie tylko błędów po stronie użytkownika i krytycznych awarii, ale też oszczędzić zespołowi masę czasu, wysiłku i, co nie mniej ważne, pozbyć się zbędnego bólu głowy.

Praca z systemem plików w .NET

Na platformie .NET do pracy z plikami i folderami przydadzą się następujące podstawowe klasy (żyją w przestrzeni nazw System.IO):

  • File — metody statyczne do pracy z plikami: sprawdzenia, kopiowanie, usuwanie itd.
  • Directory — metody statyczne do pracy z folderami.

Aby sprawdzić istnienie wystarczą dwie metody:

  • File.Exists(path) — zwraca true, jeśli plik istnieje.
  • Directory.Exists(path) — zwraca true, jeśli folder istnieje.

2. Sprawdzanie istnienia pliku przed otwarciem

Przykład z życia

Załóżmy, że dodałeś funkcję wyświetlania zawartości dziennika:

string diaryPath = "diary.txt";
        
if (File.Exists(diaryPath))
{
    // Plik istnieje, czytamy i wyświetlamy zawartość
    using var reader = new StreamReader(diaryPath);
    string content = reader.ReadToEnd();
    Console.WriteLine("Twój dziennik:\n" + content);
}
else
{
    Console.WriteLine("Plik dziennika nie został znaleziony!");
    // Można od razu stworzyć nowy plik, jeśli potrzeba
    File.WriteAllText(diaryPath, "To jest początek twojego dziennika.\n");
    Console.WriteLine("Utworzono nowy plik dziennika.");
}

W realnych projektach takie podejście to must-have: nie polegasz na "cudach", tylko sam kontrolujesz sytuację.

3. Sprawdzanie istnienia pliku przed zapisem

Scenariusz: aplikacja tworzy raporty według harmonogramu. Trzeba, żeby każdy nowy raport nie nadpisał poprzedniego.

Warto sprawdzić: może plik już istnieje? Jeśli tak — można np. poprosić użytkownika o inne imię albo stworzyć plik z unikalną nazwą.

string reportPath = "report.txt";
        
if (File.Exists(reportPath))
{
    Console.WriteLine($"Plik '{reportPath}' już istnieje. Zmień nazwę lub usuń stary plik.");
}
else
{
    using var writer = new StreamWriter(reportPath);
    writer.WriteLine("To nowy raport na dzisiaj!");
    Console.WriteLine("Plik raportu został pomyślnie utworzony.");
}

Taka kontrola uratuje twoich użytkowników (i ciebie samego!) przed niemiłymi niespodziankami w postaci nadpisanych plików.

4. Sprawdzanie istnienia folderu przed zapisem

Pliki rzadko leżą bezpośrednio w root projektu. Często trzyma się je w specjalnych katalogach: logs/, reports/, data/ itd. Przed zapisaniem pliku warto upewnić się, że potrzebny folder istnieje.

string logsDir = "logs";
string logPath = Path.Combine(logsDir, "log.txt"); // Path.Combine pomaga bezpiecznie łączyć części ścieżki
        
if (!Directory.Exists(logsDir))
{
    Console.WriteLine("Folder 'logs' nie znaleziony. Tworzymy go...");
    Directory.CreateDirectory(logsDir);
}

using var writer = new StreamWriter(logPath, append: true);
writer.WriteLine($"[{DateTime.Now}] Aplikacja uruchomiona.");
Console.WriteLine("Zapis do pliku dziennika wykonany pomyślnie.");

Przy okazji, metoda Directory.CreateDirectory nie rzuci błędu, jeśli folder już istnieje — po prostu to zignoruje, więc sprawdzenie można pominąć, jeśli taki styl ci pasuje.

5. Ważne niuanse

Szczegóły: ścieżki względne i absolutne

Częsty błąd początkujących: mylą ścieżki względne i absolutne. Na przykład, jeśli wywołasz File.Exists("data.txt"), program szuka pliku w bieżącym katalogu roboczym. A gdzie to jest? To zależy skąd uruchomiono aplikację.

Dla niezawodności używaj ścieżek absolutnych lub buduj ścieżkę przez Path.Combine:

string myDocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string filePath = Path.Combine(myDocs, "myapp", "settings.txt");

Ścieżka zawsze jest podana jawnie i nie zgubisz pliku z pola widzenia.

Ważne szczegóły sprawdzania

  • Czasem robi się sprawdzenie, ale zaraz po nim wykonywane są powtórne akcje na tym samym obiekcie pliku/folderu. Między File.Exists a późniejszym stworzeniem/usunięciem może minąć czas, i inny proces zdąży zmienić stan. W krytycznych scenariuszach dodawaj obsługę błędów przez try-catch.
  • Sprawdzaj nie tylko istnienie, ale i prawa dostępu. Czasem plik jest, ale użytkownik nie ma do niego praw.
  • Dla katalogów używaj Directory.Exists, nie File.Exists — inaczej zawsze dostaniesz false.
  • Jeśli ścieżka składa się z kilku zagnieżdżonych katalogów, np. "data/2024/04", to Directory.CreateDirectory("data/2024/04") stworzy całe drzewo — to wygodne i oszczędza zbędnych sprawdzeń.

A co się stanie, jeśli nie sprawdzać?

Jeśli spróbujesz otworzyć nieistniejący plik do czytania — dostaniesz FileNotFoundException. Jeśli spróbujesz stworzyć plik w nieistniejącym folderze — DirectoryNotFoundException. Jeśli program działa pod kontem użytkownika, on zobaczy błąd i będzie wkurzony. W przemyśle — tracisz dane/pieniądze/czas. Więc „sprawdzanie istnienia” to nie marudzenie, tylko przejaw dbania o użytkownika (i swoje własne spokoju umysłu).

2
Zadanie
C# SELF, poziom 38, lekcja 2
Niedostępne
Sprawdzanie istnienia katalogu i tworzenie pliku w nim
Sprawdzanie istnienia katalogu i tworzenie pliku w nim
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION