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.

Napęd
źródło
1
Możliwy duplikat Jeśli folder nie istnieje, utwórz go
Michael Freidgeim
@ 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);
Don
źródło
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
107

Możesz użyć następującego kodu

  DirectoryInfo di = Directory.CreateDirectory(path);
Baran
źródło
41
Directory.CreateDirectoryrobi dokładnie to, co chcesz: tworzy katalog, jeśli jeszcze nie istnieje. Najpierw nie ma potrzeby wykonywania jawnej kontroli .
Paolo Moretti
13
Zgłasza wyjątek IOException, jeśli pathjest plikiem, a nie katalogiem. msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
scaryman
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))

willvv
źródło
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 .

MiguelSlv
źródło
-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 .

hitec
źródło
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();

Godwin Awojobi
źródło