Làm cách nào để tạo một tệp VÀ bất kỳ thư mục nào, nếu các thư mục không tồn tại?


136

Hãy tưởng tượng tôi muốn tạo (hoặc ghi đè) tệp sau: - C:\Temp\Bar\Foo\Test.txt

Sử dụng phương thức File.Create (..) , điều này có thể làm điều đó.

NHƯNG, nếu tôi không có một trong các thư mục sau (từ đường dẫn ví dụ đó, ở trên)

  • Nhiệt độ
  • Quán ba
  • Foo

sau đó tôi nhận được một DirectoryNotFoundException ném.

Vì vậy, .. đưa ra một đường dẫn, làm thế nào chúng ta có thể tạo đệ quy tất cả các thư mục cần thiết để tạo tệp .. cho đường dẫn đó? Nếu thư mục Temp hoặc Bar tồn tại, nhưng Foo không ... thì điều đó cũng được tạo ra.

Để đơn giản, giả sử không có lo ngại về Bảo mật - tất cả các quyền đều ổn, v.v.



Câu trả lời:


122
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

Xem trang MSDN này .

Hy vọng rằng sẽ giúp ra!


82
Bạn có thể gọi một cách mù quáng Directory.CreateDirectorymà không cần Directory.Existskiểm tra trước - nó sẽ không ném nếu thư mục đã ở đó.
Tim Robinson

1
@Tim: Không chắc lắm nên tôi đã ném nó vào đó. Cảm ơn thông tin mặc dù.
Christopher B. Adkins

24
Và đừng quên Path.GetDirectoryName(string path)lấy thư mục từ đường dẫn đầy đủ của bạn
Oliver

@Oliver: Có một loạt các chức năng đi cùng với các lớp Directory và DirectoryInfo, nhưng mã tôi đưa ra là đủ để giúp anh ta đi đúng hướng. Tôi nghĩ rằng liên kết cũng mở rộng khá nhiều.
Christopher B. Adkins

8
* LƯU Ý: biến pathkhông được chứa tên tệp. Vì vậy, sử dụng ví dụ của OP pathnên được C:\Temp\Bar\Foo. Sau khi gọi Directory.CreateDirectory(path);bạn vẫn cần gọi File.Create("C:\Temp\Bar\Foo\Test.txt");để tạo tập tin.
sazr

139

Để tóm tắt những gì đã được nhận xét trong các câu trả lời khác:

//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));

Directory.CreateDirectory sẽ tạo các thư mục theo cách đệ quy và nếu thư mục đã tồn tại, nó sẽ trả về mà không có lỗi.

Nếu có xảy ra là một tập tin Footại C:\Temp\Bar\Foomột ngoại lệ sẽ được ném ra.


Nếu bạn đang xử lý đường dẫn dài (256+), hãy xem stackoverflow.com/questions/5188527/
Khăn


3

. đưa ra một đường dẫn, làm thế nào chúng ta có thể tạo đệ quy tất cả các thư mục cần thiết để tạo tệp .. cho đường dẫn đó

Tạo tất cả các thư mục và thư mục con theo chỉ định của đường dẫn.

Directory.CreateDirectory(path);

sau đó bạn có thể tạo một tập tin.


2
đường dẫn không có tên tệp :)
Sameera R.

"tất cả các thư mục và thư mục con" Không chính xác: nó sẽ tạo ra, nhiều nhất là một thư mục và tất cả các thư mục con được yêu cầu.
Camilo Terevinto

3

Bạn sẽ cần kiểm tra cả hai phần của đường dẫn (thư mục và tên tệp) và tạo từng phần nếu nó không tồn tại.

Sử dụng File.ExistsDirectory.Existsđể tìm hiểu xem chúng tồn tại. Directory.CreateDirectorysẽ tạo toàn bộ đường dẫn cho bạn, vì vậy bạn chỉ cần gọi nó một lần nếu thư mục không tồn tại, sau đó chỉ cần tạo tệp.


Đối với Directory.CreateDirectory, bạn không cần phải xem phần nào tồn tại. Nó sẽ tạo ra tất cả các thư mục cần thiết (chỉ có một điều chắc chắn là thư mục được nhắm mục tiêu chưa tồn tại).
Gertjan

Tôi đề nghị xóa dòng đầu tiên của bạn trả lời trong trường hợp đó vì anh ta không cần kiểm tra từng phần từ gốc, chỉ cần kiểm tra đường dẫn đầy đủ và tạo nó nếu nó không tồn tại.
Gertjan

@Gertjan - câu trả lời được cập nhật ... hy vọng nó đáp ứng các tiêu chuẩn của bạn ngay bây giờ;)
Oded

:) nó không :) (đó không phải là quan điểm của tôi để chứng minh bạn sai hoặc xúc phạm bạn, nhưng người mới bắt đầu có thể sử dụng bất kỳ sự làm rõ nào trong các câu trả lời)
Gertjan


0

Bạn muốn Directory.CreateDirectory ()

Đây là một lớp tôi sử dụng (được chuyển đổi thành C #) mà nếu bạn chuyển nó vào một thư mục nguồn và đích đến thì nó sẽ sao chép tất cả các tệp và thư mục con của thư mục đó vào đích của bạn:

using System.IO;

public class copyTemplateFiles
{


public static bool Copy(string Source, string destination)
{

    try {

        string[] Files = null;

        if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
            destination += Path.DirectorySeparatorChar;
        }

        if (!Directory.Exists(destination)) {
            Directory.CreateDirectory(destination);
        }

        Files = Directory.GetFileSystemEntries(Source);
        foreach (string Element in Files) {
            // Sub directories
            if (Directory.Exists(Element)) {
                copyDirectory(Element, destination + Path.GetFileName(Element));
            } else {
                // Files in directory
                File.Copy(Element, destination + Path.GetFileName(Element), true);
            }
        }

    } catch (Exception ex) {
        return false;
    }

    return true;

}



private static void copyDirectory(string Source, string destination)
{
    string[] Files = null;

    if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
        destination += Path.DirectorySeparatorChar;
    }

    if (!Directory.Exists(destination)) {
        Directory.CreateDirectory(destination);
    }

    Files = Directory.GetFileSystemEntries(Source);
    foreach (string Element in Files) {
        // Sub directories
        if (Directory.Exists(Element)) {
            copyDirectory(Element, destination + Path.GetFileName(Element));
        } else {
            // Files in directory
            File.Copy(Element, destination + Path.GetFileName(Element), true);
        }
    }

}

}


2
Tôi nên hạ cấp này vì dòng này: using Microsoft.VisualBasic;Ác !!
Pure.Krom

2
Và tại sao Microsoft.VisualBasic ác ?? Đây là một hội đồng như bất kỳ ai khác trong .Net Framework.
Oliver

2
Tôi cho rằng vì bạn nhập không gian tên của toàn bộ ngôn ngữ khác một cách không cần thiết ..?
Đánh dấu

0

Giả sử rằng hội đồng / exe của bạn có quyền FileIO , điều đó không đúng. Ứng dụng của bạn có thể không chạy với quyền quản trị. Điều quan trọng cần xem xét Bảo mật truy cập mãyêu cầu quyền Mã mẫu:

FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C:\\test_r");
f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");
try
{
    f2.Demand();
}
catch (SecurityException s)
{
    Console.WriteLine(s.Message);
}

Hiểu bảo mật truy cập mã .NET

Là mã bảo mật truy cập mã nguồn của bất kỳ sử dụng trong thế giới thực?


1
@ Pure.Krom: Mặc dù câu trả lời của tôi không đúng mục tiêu, nhưng vẫn xem xét bảo mật và kiểm soát truy cập khi truy cập tài nguyên đặc quyền. Không bao giờ có nghĩa là vượt qua hoặc làm phức tạp câu hỏi của bạn :)
PRR

0

Tôi biết có một số câu trả lời khác ở đây, nhưng không có câu trả lời nào chưa đầy đủ, đoạn mã sau sẽ tạo thư mục (nếu không tồn tại) & sau đó sao chép tệp .

// using System.IO;

// for ex. if you want to copy files from D:\A\ to D:\B\
foreach (var f in Directory.GetFiles(@"D:\A\", "*.*", SearchOption.AllDirectories))
{
    var fi =  new FileInfo(f);
    var di = new DirectoryInfo(fi.DirectoryName);

    // you can filter files here
    if (fi.Name.Contains("FILTER")
    {
        if (!Directory.Exists(di.FullName.Replace("A", "B"))
        {                       
            Directory.CreateDirectory(di.FullName.Replace("A", "B"));           
            File.Copy(fi.FullName, fi.FullName.Replace("A", "B"));
        }
    }
}
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.