2016-03-31 28 views
5

Tôi muốn tạo nhật ký cho các hành động differenct. Tôi tạo một tệp mới mỗi ngày với ngày dưới dạng tên tệp. Bây giờ, nếu thư mục không tồn tại, tôi muốn hệ thống tạo thư mục cho tôi. Tôi đã tìm kiếm chủ đề này và tất cả các câu trả lời đều đến cùng một điều: sử dụng Directory.CreateDirectory(FilePath);. Tuy nhiên điều này dường như không hoạt động. Có thể thiếu một cái gì đó hiển nhiên.Tạo thư mục nếu không tồn tại

Dưới đây là các mã:

public class ElderlyHomeLog : ILog 
    { 
     private const string FilePath = "/Logs/WZCLogs/"; 
     public void MakeLog(string text) 
     { 
      if (!Directory.Exists(FilePath)) 
      { 
       Directory.CreateDirectory(FilePath); 
      } 
      string logFile = DateTime.Now.ToString("ddMMyyyy") + ".txt"; 
      if (!File.Exists(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile)) 
      { 
       FileStream f = File.Create(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile); 
       f.Close(); 
      } 

      using (StreamWriter sw = new StreamWriter(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile, true)) 
      { 
       sw.WriteLine(text); 
       sw.Close(); 
      } 
     } 
    } 

Thông báo lỗi:

Một ngoại lệ của loại 'System.IO.DirectoryNotFoundException' xảy ra trong mscorlib.dll nhưng không được xử lý theo mã người dùng

Thông tin bổ sung: Không thể tìm thấy một phần của đường dẫn 'C: \ Users \ *** \ Source \ Repos \ Project \ ProjectName \ Nhật ký \ WZCLogs \ 31032016.txt'.

+0

Thông báo lỗi hoặc mô tả? –

+2

Bạn đã thử cung cấp cho nó một đường dẫn tuyệt đối cho thư mục được tạo chưa? Ngoài ra, nếu bạn sử dụng 'Path.Combine' để kết hợp các đường dẫn thì bạn sẽ không phải lo lắng về các ký tự phân cách thư mục. –

+0

biến FilePath chưa hoàn thành? –

Trả lời

7

Thư mục có thể được tạo trong C:\ (ổ đĩa mặc định nơi hệ điều hành được cài đặt). đó là vị trí thư mục là C:\Logs\WZCLogs\. bạn có thể xác nhận rằng một thư mục được tạo ở đâu đó trong ổ đĩa bằng cách thực thi lại mã, lần này là if (!Directory.Exists(FilePath)) trả về true. Vì bạn chưa chỉ định bất kỳ vị trí nào, trình biên dịch giả định So. Kiểm tra xem nó được tạo ra hay không;

Bạn có thể mở rộng thử Như thế này:

try 
    { 
    if (!Directory.Exists(FilePath)) 
     { 
      Directory.CreateDirectory(FilePath); 
     } 
    } 
catch (Exception ex) 
{ 
    // handle them here 
} 

Nếu đường dẫn là một trong những sai lầm chắc chắn là một ngoại lệ sẽ ném; tôi đã thử với "X: \ mẫu" mà mang lại cho tôi ngoại lệ:

Không thể tìm thấy một phần của đường dẫn 'X: \ mẫu

đâu như thể tôi đã cố gắng với Logs\WZCLogs mà wont cho bất kỳ ngoại lệ nào cho lần đầu tiên và cũng bỏ qua nếu lần thứ hai; Do đó tôi thấy rằng thư mục được tạo ra ở một nơi khác;

Bạn có thể thực hiện những thay đổi này để làm cho họ làm việc:

string FilePath=Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"Logs\WZCLogs"); 
+0

Điều này đã giải quyết được vấn đề của tôi. Đã thay đổi 'Directory.CreateDirectory();' thành 'Directory.CreateDirectory (HostingEnvironment.ApplicationPhysicalPath + FilePath);' – ckindt

+1

// Tạo tất cả các thư mục và thư mục con trong đường dẫn đã chỉ định trừ khi chúng đã tồn tại. tĩnh công khai DirectoryInfo CreateDirectory (chuỗi đường dẫn); –

3

Bạn cần phải sử dụng đường dẫn tuyệt đối khi tạo thư mục. Hãy thử như sau:

private const string FilePath = "Logs/WZCLogs/"; 

public void MakeLog(string text) 
{ 
    string directory = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, FilePath); 
    Directory.CreateDirectory(directory); // no need to check if it exists 

    string logFile = Path.Combine(directory, DateTime.Now.ToString("ddMMyyyy") + ".txt"); 
    if (!File.Exists(logFile)) 
    { 
     FileStream f = File.Create(logFile); 
     f.Close(); 
    } 

    using (StreamWriter sw = new StreamWriter(logFile, true)) 
    { 
     sw.WriteLine(text); 
     sw.Close(); 
    } 
} 

Bạn không cần phải kiểm tra xem thư mục tồn tại đầu tiên là phương pháp CreateDirectory không có tác dụng phụ nếu thư mục đã hiện diện. Thực tiễn tốt là sử dụng trực tiếp Path.Combine thay vì ghép chuỗi trực tiếp, nhưng đảm bảo thông số thứ hai không bắt đầu bằng dấu gạch chéo.

Bạn cũng có thể đơn giản hóa mã của mình bằng cách sử dụng phương thức File.AppendAllText thay vì tạo FileStream.

private const string FilePath = "Logs/WZCLogs/"; 

public void MakeLog(string text) 
{ 
    string directory = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, FilePath); 
    Directory.CreateDirectory(directory); 

    string logFile = Path.Combine(directory, DateTime.Now.ToString("ddMMyyyy") + ".txt"); 
    File.AppendAllText(logFile, text + Environment.NewLine); 
} 
+0

Hoạt động như một sự quyến rũ, cảm ơn bạn đã đơn giản hóa mã của tôi. – ckindt

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