Jak utworzyć katalog, jeśli nie istnieje, aby utworzyć plik?


202

Mam tutaj fragment kodu, który się psuje, jeśli katalog nie istnieje:

System.IO.File.WriteAllText(filePath, content);

Czy w jednym wierszu (lub kilku wierszach) można sprawdzić, czy katalog prowadzący do nowego pliku nie istnieje, a jeśli nie, należy go utworzyć przed utworzeniem nowego pliku?

Używam .NET 3.5.



@ TimSchmelter, „Możliwy duplikat” to sposób na oczyszczenie - aby zamknąć podobne pytania i zachować najlepsze odpowiedzi. Data nie jest niezbędna. Zobacz meta.stackexchange.com/questions/147643/… Jeśli zgadzasz się, że wymaga to wyjaśnienia, zagłosuj na meta.stackexchange.com/questions/281980/...
Michael Freidgeim

Odpowiedzi:


394

Aby utworzyć

(new FileInfo(filePath)).Directory.Create() Przed zapisaniem do pliku.

.... Lub, jeśli istnieje, stwórz (inaczej nic nie rób)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);

5
Eleganckie rozwiązanie, ponieważ obsługuje sytuacje wymagające utworzenia zagnieżdżonych folderów.
Denny Jacob

Dziękuję Ci! Widziałem stackoverflow.com/questions/9065598 , ale chciałem zacząć od bezwzględnej ścieżki do pliku i nie chciałem zajmować się dzieleniem ścieżki. Teraz wiem, że możesz uzyskać dostęp do katalogu z instancji FileInfo.
Johann

Czy istnieje asynchroniczny sposób na to?
Joe Phillips

1
Przypuszczam, że możesz to zrobić Task.Run(() => );.
Don


34

Jak powiedział @hitec, musisz mieć pewność, że masz odpowiednie uprawnienia, jeśli tak, możesz użyć tej linii, aby zapewnić istnienie katalogu:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

Eleganckim sposobem przeniesienia pliku do nieistniejącego katalogu jest utworzenie następującego rozszerzenia do natywnej klasy FileInfo:

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.MoveTo(destination);
    }
}

Następnie użyj zupełnie nowego rozszerzenia MoveTo:

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

Sprawdź dokumentację rozszerzenia Metody .


-1

Możesz użyć File.Exists, aby sprawdzić, czy plik istnieje i utworzyć go za pomocą File.Create, jeśli jest to wymagane. Sprawdź, czy masz dostęp do tworzenia plików w tej lokalizacji.

Gdy masz pewność, że plik istnieje, możesz bezpiecznie do niego zapisać. Chociaż dla zachowania ostrożności powinieneś umieścić swój kod w bloku try ... catch i wyłapać wyjątki, które funkcja może wywołać, jeśli coś nie pójdzie dokładnie zgodnie z planem.

Dodatkowe informacje dotyczące podstawowych pojęć we / wy pliku .


Początkowo źle przeczytałem twoje pytanie, które chciałeś zapisać do pliku, który może nie istnieć. Pojęcia są jednak zasadniczo takie same dla operacji na plikach i katalogach.
hitec

-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); Jeśli katalog już istnieje, ta metoda nic nie robi.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.