2010-07-08 54 views
84

tưởng tượng tôi muốn tạo (hoặc ghi đè) tệp sau: - C:\Temp\Bar\Foo\Test.txtLà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?

Sử dụng phương pháp File.Create(..), điều này có thể thực hiện.

NHƯNG, nếu tôi không có hoặc là một trong các thư mục sau (từ đó dụ con đường, ở trên)

  • Temp
  • Bar
  • Foo

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

Vì vậy, .. được cung cấp đường dẫn, cách chúng tôi có thể tạo một cách đệ 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 thì không ... thì nó cũng được tạo ra.

Để đơn giản, cho phép giả định không có mối quan tâm an ninh - tất cả các quyền đều ổn vv

+1

thể trùng lặp của [lưu một file và tự động tạo thư mục] (http://stackoverflow.com/questions/660685/saving-a-file-and-automatically-create-directories) – mateuscb

+0

trùng lặp có thể xảy ra của [ Nếu một thư mục không tồn tại, hãy tạo nó] (http://stackoverflow.com/questions/9065598/if-a-folder-does-not-exist-create-it) –

Trả lời

80
// Determine whether the directory exists. 
if (Directory.Exists(path)) 
{ 
    Console.WriteLine("That path exists already."); 
    return; 
} 

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

Xem this MSDN page.

Hy vọng điều đó sẽ giúp ích!

+68

Bạn có thể gọi một cách mù quáng 'Directory.CreateDirectory' mà không cần kiểm tra 'Directory.Exists' trước - nó sẽ không ném nếu thư mục đã ở đó. –

+1

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

+15

Và đừng quên ['Path.GetDirectoryName (chuỗi đường dẫn)'] (http://msdn.microsoft.com/en-us/library/system.io.path.getdirectoryname.aspx) để lấy thư mục từ đường dẫn đầy đủ của bạn – Oliver

2

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

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

+0

Đố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 tất cả các thư mục cần thiết (chỉ có điều để đảm bảo là thư mục đích không tồn tại). – Gertjan

+0

@Gertjan - cảm ơn bạn đã nhập liệu. Đã làm rõ câu trả lời. – Oded

+0

Tôi đề nghị loại bỏ dòng đầu tiên của bạn trả lời trong trường hợp đó vì anh ta không cần phải 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

2

. cho một đường dẫn, làm thế nào chúng ta có thể đệ quy tạo 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ả thư mục và thư mục con theo quy định của đường dẫn.

Directory.CreateDirectory(path); 

thì bạn có thể tạo tệp.

+2

đường dẫn không có tên tệp :) –

+0

"tất cả thư mục và thư mục con" Không chính xác: nó sẽ tạo tối đa một thư mục và tất cả các thư mục con bắt buộc. –

0

Bạn muốn Directory.CreateDirectory()

Dưới đây là một lớp học tôi sử dụng (chuyển đổi sang C#) rằng nếu bạn vượt qua nó một thư mục nguồn và một đích đến nó sẽ sao chép tất cả các tập tin và thư mục con đó thư mục đến đí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 điều này vì dòng này: 'using Microsoft.VisualBasic;' Evil !! –

+0

Haha, xin lỗi tôi đã không kiểm tra đầy đủ nó chỉ bị mắc kẹt nó trong một công cụ chuyển đổi .. xấu của tôi .. – Markive

+1

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

0

Giả sử rằng lắp ráp của bạn/exe có FileIO phép là chính nó, cũng là không đúng.Ứng dụng của bạn có thể không chạy với quyền quản trị. Nó quan trọng để xem xét Code Access Securityrequestingpermissions Mẫu mã:

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

Understanding .NET Code Access Security

Is “Code Access Security” of any real world use?

+1

@ Pure.Krome: Mặc dù câu trả lời của tôi bị tắt mục tiêu, vẫn xem xét việc kiểm soát truy cập và bảo mật 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

87

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

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

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

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

0

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

// 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")); 
     } 
    } 
} 
Các vấn đề liên quan