2012-01-30 67 views
448

Tôi sử dụng một điều khiển FileUploader trong ứng dụng của mình. Tôi muốn lưu một tập tin trong một thư mục được chỉ định. Bây giờ tôi muốn, nếu thư mục này không tồn tại, đầu tiên tạo nó, và sau đó lưu tập tin của tôi vào thư mục này. Nếu thư mục đã tồn tại, sau đó chỉ cần lưu tệp trong đó.Nếu một thư mục không tồn tại, hãy tạo nó

Tôi có thể làm như thế nào?

+0

@JoeBlow - Ha - nên đã chỉ định câu trả lời nào không chính xác - bây giờ trang thậm chí còn khó hiểu hơn. OMG!) ;-) – Bartosz

+0

Tôi đã kết thúc ở đây trong khi tìm kiếm những thứ khác, nhưng thật đáng kinh ngạc khi có bao nhiêu người đang chiến đấu để mâu thuẫn lẫn nhau với phiên bản của chính họ cùng một câu chuyện . Microsoft đã tạo ra .NET Framework và MSDN. Cho dù hành vi chính xác được tôn trọng bởi những người triển khai khác, chẳng hạn như Mono, không liên quan đến tính đúng đắn của hành vi được mô tả trong MSDN. Oh, và Mono cũng làm điều đúng, vậy đâu là đối số? –

+0

Có thể trùng lặp [Làm cách nào để tạo thư mục nếu nó không tồn tại để tạo tệp?] (Https://stackoverflow.com/questions/2955402/how-do-i-create-directory-if-it-doesnt -exist-to-create-a-file) – brichins

Trả lời

797

Như những người khác đã nói, sử dụng System.IO.Directory.CreateDirectory

Tuy nhiên, bạn không cần phải kiểm tra nếu nó tồn tại đầu tiên. Từ docs

Bất kỳ và tất cả các thư mục quy định tại con đường được tạo ra, trừ khi họ đã tồn tại hoặc trừ một số phần của con đường là không hợp lệ. Đường dẫn tham số chỉ định đường dẫn thư mục, không phải đường dẫn tệp. Nếu thư mục đã tồn tại, phương pháp này không làm gì cả.

+118

+1 cho chỉ ra rằng kiểm tra là không cần thiết – Peter

+23

Đối với các phiên bản .NET Framework 4.5 báo giá thực tế là ["Nếu thư mục đã tồn tại, phương pháp này không tạo ra một thư mục mới, nhưng nó trả về một đối tượng DirectoryInfo cho thư mục hiện có. "] (http://msdn.microsoft.com/en-us/library/54a0at6s%28v=vs.110%29.aspx) –

+7

và ví dụ mã microsoft mâu thuẫn với chính nó bằng cách kiểm tra xem thư mục có tồn tại trước không ... – ecoe

310

Sử dụng mã dưới đây theo 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

Xin lỗi, tôi đã bỏ lỡ thêm liên kết. – Ravia

+0

http://totaldotnet.com/Tip/ShowTip22_UsePhysicalAppPath.aspx Server.MapPath vs PhysicalApplicationPath. Bạn có đồng ý không? – Jaime

+37

Tại sao không: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check); – Dayan

24

Directory.Exists này sẽ giải thích làm thế nào để kiểm tra xem một filepath Exist

Directory.CreateDirectory này sẽ giải thích làm thế nào để thử và để tạo filepath nếu nó không tồn tại

+0

@Tavousi chức năng này được cung cấp bởi jeroenh sẽ là khởi đầu tốt;) –

+0

Liên kết không hoạt động .. –

+0

không có liên kết tài liệu msdn nào hoạt động vào lúc này, ngay cả qua tìm kiếm msdn ... – jeroenh

12

Bạn có thể sử dụng điều khoản try/catch và kiểm tra xem nó có tồn tại hay không:

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

Đây là câu trả lời hay, nhưng theo tài liệu MSDN, "Bất kỳ và tất cả các thư mục được chỉ định trong đường dẫn được tạo ra, trừ khi chúng đã tồn tại hoặc trừ khi một số phần của đường dẫn không hợp lệ. Tham số đường dẫn chỉ định đường dẫn thư mục chứ không phải đường dẫn tệp. Nếu thư mục đã tồn tại, phương thức này không làm gì cả. " Vì vậy, bạn không thực sự cần cuộc gọi đến Directory.Exists (đường dẫn). – ken

+1

Đó là sự thật nhưng đó cũng là một giả định vì vậy nó luôn luôn là tốt nhất để kiểm tra chứ không phải giả định bất kể những gì MSDN nói .. – MethodMan

+4

@ JD KRAZE, tôi tin rằng MSDN, trừ khi nó đã được chứng minh là sai. Bạn đề nghị ngược lại - bỏ qua những gì MSDN nói và thêm các kiểm tra thêm (không cần thiết) vào mã của bạn. Bạn ve con đương nay ở đâu vậy? – Polyfun

28

Bạn có thể tạo ra các đường dẫn nếu nó không tồn tại nhưng với một phương pháp như sau:

using System.IO; 

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

Kiểm tra 'if (! DirectoryExists)' là không cần thiết. – bazzilic

+7

@bazzilic có, nhưng nó cho thấy ý định. Tôi không phải đoán (hoặc biết chắc chắn) cách API xử lý việc này. Bất cứ ai đọc mã này sẽ biết chắc chắn điều gì sẽ xảy ra. –

+3

Trong môi trường đa luồng (chẳng hạn như trạng thái của hệ thống tập tin), bạn chỉ có thể chọn khóa hoặc thử và bắt. Đoạn mã trên có điều kiện chủng tộc. Hàm này có thể ném ra một ngoại lệ 'FileExists' (hoặc bất kỳ thứ gì được gọi trong C#) –

15
using System.IO 

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

Chỉ cần viết dòng này:

System.IO.Directory.CreateDirectory(myDir); 
  • Nếu thư mục không chưa hề tồn tại, nó sẽ được tạo.
  • Nếu thư mục tồn tại là, dòng sẽ là bỏ qua.

tham khảo: Article about Directory.CreateDirectory at MSDN

+8

Mã gọn gàng và giải thích! Bạn Guys làm cho kinh nghiệm stackoverflow tuyệt vời. – 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); 

} 

Các CreateDirectory cũng được sử dụng để tạo ra một thư mục phụ. Tất cả những gì bạn phải làm là chỉ định đường dẫn của thư mục mà thư mục con này sẽ được tạo. Đoạn mã sau tạo một thư mục con Mahesh trong C:\Temp directory.

// Create sub directory 

if (!Directory.Exists(subdir)) 
{ 

Directory.CreateDirectory(subdir); 

} 
10

Phương pháp này sẽ tạo ra thư mục nếu không tồn tại và không làm gì cả nếu tồn tại

Directory.CreateDirectory(path); 
+0

câu trả lời đơn giản và ngắn gọn – xameeramir

2

Sử dụng mã dưới đây. Tôi đã sử dụng mã này để sao chép tập tin và tạo thư mục mới.

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

Xuất phát/kết hợp từ nhiều câu trả lời, thực hiện nó cho tôi là dễ dàng như này:

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

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

Điểm đóng gói một phương thức vào bản chất chính xác là gì, chỉ với một cái tên hơi khác một chút? Bạn thực sự không đạt được gì từ điều này. – Krythic

0

chuỗi createfolder = "E:/tmp /" + UID;
System.IO.Directory.CreateDirectory (createfolder);

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

CreateDirectory đã xử lý kiểm tra nếu thư mục không tồn tại. – bergmeister

3

mã sau là dòng tốt nhất (s) của mã tôi sử dụng sẽ tạo ra thư mục nếu không có mặt.

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

Nếu thư mục đã tồn tại, phương pháp này không tạo thư mục mới, nhưng nó trả về đối tượng DirectoryInfo cho thư mục hiện có. >

+0

CreateDirectory đã xử lý kiểm tra nếu thư mục không tồn tại. – bergmeister

+0

@bergmeister, Cảm ơn. Tôi vừa vượt qua kiểm tra. Nó thực sự đã xóa kiểm tra có điều kiện. Đã cập nhật !! – UJS

Các vấn đề liên quan