Jeśli folder nie istnieje, utwórz go


720

Używam kontrolki FileUploader w mojej aplikacji. Chcę zapisać plik w określonym folderze. Teraz chcę, jeśli ten folder nie istnieje, najpierw go utworzyć, a następnie zapisać mój plik w tym folderze. Jeśli folder już istnieje, po prostu zapisz w nim plik.

Jak mogę to zrobić?


@JoeBlow - Ha - powinien był określić, która odpowiedź jest niepoprawna - teraz strona jest jeszcze bardziej zagmatwana. (Czy zmienił zaakceptowaną odpowiedź? A może nie? OMG!) ;-)
Bartosz

Skończyłem tutaj, szukając innych rzeczy, ale zdumiewające jest, jak wiele osób walczy ze sobą, aby zaprzeczyć sobie nawzajem własną wersją tej samej historii. Microsoft jest autorem .NET Framework i MSDN. To, czy inne podmioty wdrażające, takie jak Mono, przestrzegają prawidłowego zachowania, nie ma znaczenia dla poprawności zachowania opisanej w MSDN. Aha, i Mono też robi to dobrze, więc gdzie jest argument?
monkey0506,

Odpowiedzi:


1239

Jak powiedzieli inni, użyj System.IO.Directory.CreateDirectory

Ale nie musisz sprawdzać, czy najpierw istnieje. Z dokumentów

Wszystkie katalogi określone w ścieżce są tworzone, chyba że już istnieją lub jeśli część ścieżki jest niepoprawna. Jeśli katalog już istnieje, ta metoda nie tworzy nowego katalogu, ale zwraca obiekt DirectoryInfo dla istniejącego katalogu.



25
a jednak przykład kodu Microsoft jest sprzeczny, sprawdzając, czy katalog istnieje pierwszy ...
ecoe

1
Musimy więc sprawdzić, czy istnieje, czy nie? Jeśli sprawdzimy, a następnie ponownie sprawdzimy metodę CreateDirectory, sprawimy, że sprawdzimy dwa razy ... a działanie systemu plików AFAIK jest kosztowne
Giox

3
@Muflix taki jak ten - utwórz plik na przykład „FILENAME” w katalogu, ale nie nadawaj mu żadnego rozszerzenia. Następnie spróbuj zadzwonić do Directory.Exists („FILENAME”) zwróci false, tak jak powinno, ponieważ takiego katalogu nie ma. Teraz, jeśli wywołasz CreateDirectory („FILENAME”), zakończy się to niepowodzeniem tak, jak powinno, ponieważ istnieje już „coś” o tej nazwie. Mam nadzieję, że to ma sens.
Otávio Décio

1
ŹLE! I MUSISZ sprawdzić, czy folder istnieje. Właśnie zidentyfikowałem, że ta metoda ma poważny problem. Jeśli nie sprawdzisz istnienia folderu, uchwyt folderu wycieknie, chyba że go zwolnisz. Użyliśmy tego przykładu w aplikacji, która przetwarza miliony folderów. Za każdym razem, gdy wywoływano tę metodę, aplikacja zachowywała uchwyt pliku do katalogu. Po kilku godzinach w sieci korporacyjnej NAS w folderach otwarto miliony uchwytów plików. Aktualizacja w celu uwzględnienia czeku wolnego - uchwyt
soddoff Baldrick

356

Użyj poniższego kodu zgodnie z http://forums.asp.net/p/1226236/2209871.aspx :

string subPath ="ImagesPath"; // your code goes here

bool exists = System.IO.Directory.Exists(Server.MapPath(subPath));

if(!exists)
    System.IO.Directory.CreateDirectory(Server.MapPath(subPath));

41
Dlaczego nie: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan

158
Nie trzeba sprawdzać, czy folder istnieje. Przeczytaj uważnie instrukcję.
bazzilic

30
Sprawdzanie i tworzenie nie jest atomowe. Powyższy kod pachnie, jest warunek wyścigu. Lepiej po prostu bezwarunkowo utwórz katalog i wychwyć FileExistswyjątek (lub inny odpowiednik C #) w przypadku, gdy funkcja ma go wyrzucić.
Jo So

6
Jak zauważyli inni, wezwanie do nie jest potrzebne Existsi faktycznie tworzy nowy stan awarii.
Ed S.

3
@MartinSmith: Następnie po prostu utwórz katalog. Nie sprawdzaj wcześniej istnienia. To nie tylko krótsze. Nie daje również fałszywego obrazu tego, czym jest interfejs API System.IO.Directory.CreateDirectory. (I to jest szybsze, ale prawdopodobnie to nie ma znaczenia)
Jo So

223

Po prostu napisz ten wiersz:

System.IO.Directory.CreateDirectory("my folder");
  • Jeśli folder jeszcze nie istnieje , zostanie utworzony .
  • Jeśli folder już istnieje , wiersz zostanie zignorowany .

Odniesienie: Artykuł o Directory.CreateDirectory w MSDN

Oczywiście możesz także pisać using System.IO;u góry pliku źródłowego, a następnie po prostu pisać za Directory.CreateDirectory("my folder");każdym razem, gdy chcesz utworzyć folder.


28

Directory.CreateDirectory Wyjaśnia, jak spróbować utworzyć ścieżkę pliku, jeśli nie istnieje

Directory.ExistsWyjaśnia, jak sprawdzić, czy istnieje ścieżka pliku. Nie potrzebujesz tego jednak, ponieważ CreateDirectory sprawdzi, czy nie.


@Tavousi ta funkcja zapewniana przez jeroenh byłaby dobrym początkiem;)
Allan Chua

żaden z linków dokumentacji MSDN wydają się działać w tej chwili, nawet poprzez MSDN Szukaj ...
jeroenh

linki są teraz w porządku
Anand

Umożliwia to warunki wyścigu, patrz zaakceptowana odpowiedź .
ComFreek,

27

Możesz utworzyć ścieżkę, jeśli jeszcze nie istnieje, za pomocą metody takiej jak poniżej:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}

6
Czek if (!folderExists)nie jest potrzebny.
bazzilic

8
@bazzilic tak, ale ujawnia zamiar. Nie muszę zgadywać (ani wiedzieć na pewno), jak API to obsługuje. Każdy, kto czyta ten kod, na pewno będzie wiedział, co się stanie.
Dennis Traub

4
W środowiskach wielowątkowych (takich jak stan systemu plików) zawsze można wybrać blokowanie lub próbowanie. Powyższy fragment ma warunek wyścigu. Funkcja może zgłosić FileExistswyjątek (lub jakkolwiek to się nazywa w języku C #)
Jo So

9
„ujawnia zamiar” - To nie jest dobre uzasadnienie. Możesz po prostu napisać komentarz w kodzie.
Jim Balter

15

Ta metoda utworzy folder, jeśli nie istnieje i nic nie zrobi, jeśli istnieje

Directory.CreateDirectory(path);

15

Możesz użyć klauzuli try / catch i sprawdzić, czy istnieje:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }

8
To dobra odpowiedź, ale zgodnie z dokumentacją MSDN „Wszystkie katalogi określone w ścieżce są tworzone, chyba że już istnieją lub chyba, że ​​część ścieżki jest nieprawidłowa. Parametr path określa ścieżkę katalogu, a nie ścieżkę do pliku . Jeśli katalog już istnieje, ta metoda nic nie robi. " Tak więc tak naprawdę nie potrzebujesz połączenia z Directory.Exists (ścieżka).
Ken

2
To prawda, ale to również założenie, dlatego zawsze lepiej jest sprawdzać, niż zakładać, niezależnie od tego, co mówi MSDN ..
MethodMan

6
@DJ KRAZE, uważam, że MSDN, chyba że udowodniono, że jest błędny. Zalecamy coś przeciwnego - zignoruj ​​to, co mówi MSDN i dodaj dodatkowe (niepotrzebne) kontrole do swojego kodu. Gdzie rysujesz linię?
Polyfun 30.01.12

1
ShellShock nigdzie nie mówię zignoruj ​​.. jest to przekonujące stwierdzenie Mówię, że lepiej nie zakładać, niż zakładać .. przeczytaj to, co powiedziałem jeszcze raz .. dzięki
MethodMan

3
@DJKRAZE nikt niczego nie zakłada. W instrukcji jest napisane zwykłym angielskim, że sprawdzenie nie jest konieczne.
bazzilic


12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}

3
CreateDirectory już obsługuje sprawdzanie, czy katalog nie istnieje.
bergmeister

6

Poniższy kod jest najlepszym wierszem kodu, którego używam, który utworzy katalog, jeśli nie jest obecny.

System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/temp/"));

Jeśli katalog już istnieje, ta metoda nie tworzy nowego katalogu, ale zwraca obiekt DirectoryInfo dla istniejącego katalogu. >


CreateDirectory już obsługuje sprawdzanie, czy katalog nie istnieje.
bergmeister

@bergmeister, Dzięki. Właśnie przeszedłem sprawdzone. Naprawdę usunąłem kontrolę warunkową. Zaktualizowano !!
UJS

4

Oto odpowiedź, której szukałem, ale nie znalazłem łatwo:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • podano ścieżkę do nowego folderu
  • zmienna informacji o katalogu, abyś mógł dalej nią manipulować.

0

Użyj poniższego kodu. Użyłem tego kodu do kopiowania plików i utworzenia nowego folderu.

string fileToCopy = "filelocation\\file_name.txt";
String server = Environment.UserName;
string newLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\file_name.txt";
string folderLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\";
bool exists = System.IO.Directory.Exists(folderLocation);

if (!exists)
{
   System.IO.Directory.CreateDirectory(folderLocation);
   if (System.IO.File.Exists(fileToCopy))
   {
     MessageBox.Show("file copied");
     System.IO.File.Copy(fileToCopy, newLocation, true);

   }
   else
   {
      MessageBox.Show("no such files");

   }
}

0

string createfolder = "E: / tmp /" + uId;
System.IO.Directory.CreateDirectory (createfolder);


0

Użyj tego kodu, jeśli folder nie jest wyświetlany w folderze obrazów lub innych folderach

 string subPath = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/");
            bool exists = System.IO.Directory.Exists(subPath);
            if(!exists)
            System.IO.Directory.CreateDirectory(subPath); 
string path = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/" + OrderId + ".png");

-1

Fantazyjnym sposobem jest rozszerzenie FileUploadtej metody, którą chcesz.

Dodaj:

public static class FileUploadExtension
{
    public static void SaveAs(this FileUpload, string destination, bool autoCreateDirectory) { 

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

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

        file.SaveAs(destination);
    }
}

Następnie użyj go:

FileUpload file;
...
file.SaveAs(path,true);

-3
string root = @"C:\Temp";

string subdir = @"C:\Temp\Mahesh";

// If directory does not exist, create it.

if (!Directory.Exists(root))
{

Directory.CreateDirectory(root);

}

CreateDirectory służy również do utworzenia podkatalogu. Wszystko, co musisz zrobić, to podać ścieżkę do katalogu, w którym zostanie utworzony ten podkatalog. Poniższy fragment kodu tworzy podkatalog Mahesh C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}

-5

Pochodzenie / łączenie z wielu odpowiedzi, wdrożenie go było dla mnie tak proste, jak to:

public void Init()
{
    String platypusDir = @"C:\platypus";
    CreateDirectoryIfDoesNotExist(platypusDir);
}

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}

6
Jaki jest sens kapsułkowania metody w to, co jest w zasadzie dokładną kopią, z tylko nieco inną nazwą? Dosłownie nic z tego nie zyskujesz.
Krythic
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.