Nếu một thư mục không tồn tại, hãy tạo nó


720

Tôi sử dụng đ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, trước tiên hãy tạo nó, sau đó lưu tệp của tôi vào thư mục này. Nếu thư mục đã tồn tại, thì chỉ cần lưu tệp trong đó.

Làm thế nào tôi có thể làm điều này?


@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. (Anh ấy thay đổi câu trả lời được chấp nhận hoặc đã làm anh không OMG?!) ;-)
Bartosz

Tôi đã kết thúc ở đây trong khi tìm kiếm những thứ khác, nhưng thật đáng ngạc nhiên khi có nhiều người đang đấu tranh để mâu thuẫn với nhau bằng chính phiên bản của cùng một câu chuyện. Microsoft là tác giả của .NET Framework và MSDN. Liệu hành vi đúng được tôn trọng bởi những người thực hiện khác, chẳng hạn như Mono, không liên quan đến tính chính xác của hành vi được mô tả trong MSDN. Ồ, và Mono cũng làm điều đúng, vậy tranh luận ở đâu?
khỉ0506

Câu trả lời:


1239

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

Nhưng, bạn không cần kiểm tra nếu nó tồn tại trước. Từ các tài liệu

Bất kỳ và tất cả các thư mục được chỉ định trong đường dẫn đều được tạo, trừ khi chúng đã tồn tại hoặc trừ khi một phần của đường dẫn không hợp lệ. Nếu thư mục đã tồn tại, phương thức này không tạo thư mục mới, nhưng nó trả về một đối tượng DirectoryInfo cho thư mục hiện có.



25
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

1
Vậy chúng ta phải kiểm tra xem nó có tồn tại hay không? Nếu chúng tôi kiểm tra và sau đó kiểm tra lại phương thức CreatDirectory, chúng tôi sẽ kiểm tra hai lần ... và hoạt động của hệ thống tập tin AFAIK rất tốn kém
Giox

3
@Muflix như thế này - tạo một tệp ví dụ "FILENAME" trên một thư mục nhưng không cung cấp cho nó bất kỳ tiện ích mở rộng nào. Sau đó thử gọi Directory.Exists ("FILENAME") sẽ trả về false, vì nó không có vì thư mục đó. Bây giờ nếu bạn gọi CreatDirectory ("FILENAME"), nó sẽ thất bại thảm hại vì nó đã có "cái gì đó" với tên đó ở đó. Hy vọng rằng có ý nghĩa.
Otávio Décio

1
SAI LẦM! Tôi phải kiểm tra xem thư mục có tồn tại không Tôi chỉ xác định rằng phương pháp này có một vấn đề nghiêm trọng. Nếu bạn không kiểm tra sự tồn tại của thư mục, tay cầm Thư mục sẽ bị rò rỉ trừ khi bạn phát hành cụ thể. Chúng tôi đã sử dụng ví dụ này trong một ứng dụng xử lý hàng triệu thư mục. Mỗi lần phương thức này được gọi, ứng dụng giữ lại phần xử lý tệp vào thư mục. Sau vài giờ, NAS mạng công ty đã có hàng triệu tệp xử lý tệp được mở trên các thư mục. Cập nhật để bao gồm kiểm tra miễn phí, tay cầm
soddoff Baldrick

356

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));

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

159
Không cần kiểm tra nếu thư mục tồn tại. Đọc hướng dẫn cẩn thận.
bazzilic

30
Kiểm tra và tạo ra không phải là nguyên tử. Các mã trên có mùi, có một điều kiện chủng tộc. Tốt hơn hết là bạn nên tạo thư mục một cách vô điều kiện và bắt một FileExistsngoại lệ (hoặc bất cứ thứ gì tương đương với C #) trong trường hợp hàm được thiết kế để ném.
Jo So

6
Giống như những người khác đã chỉ ra, không cần phải gọi Existsvà nó thực sự tạo ra một điều kiện thất bại mới.
Ed S.

3
@MartinSmith: Sau đó, chỉ cần tạo thư mục. Đừng kiểm tra sự tồn tại trước đó. Điều đó không chỉ ngắn hơn. Nó cũng không tạo ấn tượng sai về API System.IO.Directory.CreateDirectorylà gì. (Và nó nhanh hơn, nhưng có lẽ điều đó không thành vấn đề)
Jo So

224

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

System.IO.Directory.CreateDirectory("my folder");
  • Nếu thư mục chưa tồn tại , nó sẽ được tạo .
  • Nếu thư mục đã tồn tại , dòng sẽ bị bỏ qua .

Tham khảo: Bài viết về Directory.CreateDirectory tại MSDN

Tất nhiên, bạn cũng có thể viết using System.IO;ở đầu tệp nguồn và sau đó chỉ cần viết Directory.CreateDirectory("my folder");mỗi khi bạn muốn tạo thư mục.


28

Directory.CreateDirectory Giải thích cách thử và tạo FilePath nếu nó không tồn tại

Directory.ExistsGiải thích cách kiểm tra nếu FilePath tồn tại. Tuy nhiên, bạn không cần điều này vì CreatDirectory sẽ kiểm tra cho bạn.


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

không có liên kết tài liệu msDN nào dường như đang hoạt động vào lúc này, ngay cả thông qua tìm kiếm
msd

các liên kết hiện đang ổn
Anand

Điều này cho phép điều kiện cuộc đua, xem câu trả lời được chấp nhận .
ComFalet

27

Bạn có thể tạo đường dẫn nếu nó chưa tồn tại với một phương thức như sau:

using System.IO;

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

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

8
@bazzilic có, nhưng nó tiết lộ ý đị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.
Dennis Traub

4
Trong các môi trường đa luồng (chẳng hạn như trạng thái của hệ thống tệp), bạn chỉ có thể chọn khóa hoặc thử và bắt. Đoạn trích trên có một điều kiện cuộc đua. Hàm này có thể ném FileExistsNgoại lệ (hoặc bất cứ thứ gì nó được gọi trong C #)
Jo So

9
"Nó tiết lộ ý định" - Đây không phải là một lời biện minh tốt. Bạn chỉ có thể viết một bình luận trong mã.
Jim Balter

15

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

Directory.CreateDirectory(path);

15

Bạn có thể sử dụng mệnh đề try / Catch và kiểm tra xem nó có tồn tại 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à một câu trả lời tốt, 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 đều được tạo, trừ khi chúng đã tồn tại hoặc trừ khi một 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, 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

2
Điều đó đúng nhưng đó cũng là một giả định vì vậy tốt nhất là luôn kiểm tra thay vì giả định bất kể MSDN nói gì ..
Phương thức

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

1
ShellShock không có nơi nào tôi nói bỏ qua .. đây là một tuyên bố đầy thuyết phục Tôi đang nói rằng tốt hơn là không giả định hơn là giả định .. đọc những gì tôi đã tuyên bố một lần nữa .. cảm ơn
Phương thức

3
@DJKRAZE không ai giả định điều gì. Nó được viết bằng tiếng Anh đơn giản trong hướng dẫn sử dụng mà kiểm tra là không cần thiết.
bazzilic

14
using System.IO

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

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

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

6

Mã sau đây là dòng mã tốt nhất tôi sử dụng sẽ tạo thư mục nếu không có.

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

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


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

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

5

Tạo thư mục mới, đưa ra đường dẫn của thư mục mẹ:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • đường dẫn đến thư mục mới đã cho
  • biến thông tin thư mục để bạn có thể tiếp tục thao tác nó theo ý muốn.

0

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");

   }
}

0

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


0

Sử dụng Mã này nếu thư mục không được trình bày trong thư mục hình ảnh hoặc các thư mục khác

 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

Một cách ưa thích là mở rộng FileUploadvới phương pháp bạn muốn.

Thêm điều này:

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);
    }
}

Sau đó sử dụng nó:

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);

}

CreatDirectory cũng được sử dụng để tạo một thư mục con. 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 đây tạo thư mục con Mahesh trong C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}

-5

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

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

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

6
Điểm đóng gói một phương thức vào bản chất chính xác là gì, chỉ có một tên hơi khác nhau? Bạn thực sự không đạt được gì từ điều này.
Krythic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.