2012-01-30 16 views
448

Używam formantu 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 do tego folderu. Jeśli folder już istnieje, po prostu zapisz w nim plik.Jeśli folder nie istnieje, utwórz go

Jak mogę to zrobić?

+0

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

+0

Skończyłem tutaj, szukając innych rzeczy, ale to niesamowite, jak wiele osób walczy, aby zaprzeczyć sobie nawzajem z własną wersją tej samej historii . Microsoft jest autorem architektury .NET Framework i MSDN. To, czy prawidłowe zachowanie jest respektowane przez innych implementatorów, takich jak Mono, nie ma znaczenia dla poprawności zachowania opisanego w MSDN. Aha, i Mono robi również poprawną rzecz, więc gdzie jest argument? –

+0

Możliwy duplikat [Jak utworzyć katalog, jeśli nie istnieje, aby utworzyć plik?] (Https://stackoverflow.com/questions/2955402/how-do-i-create-directory-if-it-doesnt -exist-to-create-a-file) – brichins

Odpowiedz

797

Jak mówili inni, użyj System.IO.Directory.CreateDirectory

Ale nie trzeba sprawdzić, czy istnieje pierwszy. Z docs

Każda i wszystkie katalogi wymienione w ścieżce są tworzone, chyba że już istnieje lub chyba jakiejś części ścieżki jest nieprawidłowy. Parametr ścieżka określa ścieżkę katalogu, a nie ścieżkę do pliku. Jeśli katalog już istnieje, ta metoda nic nie robi.

+118

+1 dla wskazania, że ​​czek nie jest potrzebny – Peter

+23

Dla wersji .NET Framework 4.5 faktyczna oferta to ["Jeśli katalog już istnieje, ta metoda nie tworzy nowego katalogu, ale zwraca obiekt DirectoryInfo dla istniejący katalog. "] (http://msdn.microsoft.com/en-us/library/54a0at6s%28v=vs.110%29.aspx) –

+7

a mimo to przykład kodu microsoft przeczy sam sobie, sprawdzając, czy katalog istnieje ... – ecoe

310

Korzystanie poniższy kod zgodnie 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)); 
+0

Niestety, przegapiłem dodanie linku. – Ravia

+0

http://totaldotnet.com/Tip/ShowTip22_UsePhysicalAppPath.aspx Server.MapPath vs PhysicalApplicationPath. Czy sie zgadzasz? – Jaime

+37

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

24

Directory.Exists to wyjaśni, jak sprawdzić, czy FilePath Exist

Directory.CreateDirectory to wyjaśni, jak spróbować, aby utworzyć filePath jeśli nie istnieje

+0

@Tavousi ta funkcja zapewniona przez jeroenh byłaby dobrym początkiem;) –

+0

Link nie działa. –

+0

Żadne z odsyłaczy do dokumentacji msdn nie działa, nawet za pośrednictwem wyszukiwania msdn ... – jeroenh

12

można 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 jest dobra odpowiedź, ale zgodnie z dokumentacją MSDN "Wszystkie katalogi określone w Ścieżka jest tworzona, chyba że już istnieją lub dopóki część ścieżki nie jest niepoprawna Parametr ścieżki określa ścieżkę do katalogu, a nie ścieżkę do pliku.Jeśli katalog już istnieje, ta metoda nic nie robi. " Tak naprawdę nie potrzebujesz wywołania Directory.Exists (ścieżka). – ken

+1

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

+4

@DJ KRAZE, Wierzę, że MSDN, chyba że udowodniono, że jest źle. Polecamy coś przeciwnego - zignoruj ​​to, co mówi MSDN i dodaj dodatkowe (niepotrzebne) kontrole do kodu. Gdzie narysujesz linię? – Polyfun

28

Można utworzyć ścieżkę, jeśli jeszcze nie istnieje w sposób 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)); 
} 
+3

Sprawdź, czy 'if (! FolderExists)' nie jest potrzebne. – bazzilic

+7

@bazzilic tak, ale ujawnia zamiar. Nie muszę zgadywać (lub wiem na pewno), w jaki sposób API to obsługuje. Każdy, kto przeczyta ten kod, będzie wiedział na pewno, co się stanie. –

+3

W środowiskach wielowątkowych (takich jak stan systemu plików) można tylko wybrać blokowanie lub próbowanie i przechwytywanie. Powyższy fragment ma warunki wyścigu. Funkcja może rzucić wyjątek 'FileExists' (lub cokolwiek to jest wywoływane w języku C#) –

15
using System.IO 

if (!Directory.Exists(yourDirectory)) 
    Directory.CreateDirectory(yourDirectory); 
168

Wystarczy napisać ten wiersz:

System.IO.Directory.CreateDirectory(myDir); 
  • Jeśli folder nie istnieje jeszcze nie , to będzie stworzony.
  • Jeśli folder istnieje już, linia będzie zignorowana.

referencyjny: Article about Directory.CreateDirectory at MSDN

+8

Schludny kod i objaśnienie! Wy, faceci, sprawiamy, że stackoverflow jest cudowny. – Martin

0
string root = @"C:\Temp"; 

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

// If directory does not exist, create it. 

if (!Directory.Exists(root)) 
{ 

Directory.CreateDirectory(root); 

} 

createDirectory jest również wykorzystywane do tworzenia podkatalogu. Wszystko, co musisz zrobić, to podać ścieżkę do katalogu, w którym zostanie utworzony ten podkatalog. Poniższy fragment kodu tworzy podkatalog Mahesha w C:\Temp directory.

// Create sub directory 

if (!Directory.Exists(subdir)) 
{ 

Directory.CreateDirectory(subdir); 

} 
10

Metoda ta utworzy folder, jeśli nie istnieje i nic nie robić, jeśli istnieje

Directory.CreateDirectory(path); 
+0

prosta i krótka odpowiedź – xameeramir

2

skorzystać z 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"); 

    } 
} 
-1

Pochodzące/połączony z wieloma odpowiedziami, wdrożenie to dla mnie było tak łatwe, jak to:

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

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

Jaki jest sens enkapsulacji metody w zasadzie w zasadzie dokładną kopię, z tylko nieco inną nazwą? Dosłownie nic z tego nie zyskujesz. – Krythic

0

strun CreateFolder = "E:/tmp /" + UID;
System.IO.Directory.CreateDirectory (createfolder);

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

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

3

następujący kod jest najlepsza linia (y) kodu używam że stworzy katalog, jeśli nie występuje.

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

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

+0

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

+0

@bergmeister, Dzięki. Właśnie przeszedłem sprawdzone. Naprawdę usunięto warunkowe sprawdzenie. Aktualizowano !! – UJS

Powiązane problemy