Làm cách nào để tạo thư mục nếu nó không tồn tại để tạo tệp?


202

Tôi có một đoạn mã ở đây bị phá vỡ nếu thư mục không tồn tại:

System.IO.File.WriteAllText(filePath, content);

Trong một dòng (hoặc một vài dòng), có thể kiểm tra xem thư mục dẫn đến tệp mới không tồn tại hay không và để tạo nó trước khi tạo tệp mới?

Tôi đang sử dụng .NET 3.5.



@TimSchmelter, "Có thể trùng lặp" là một cách để dọn dẹp - để đóng các câu hỏi tương tự và giữ một câu trả lời tốt nhất. Ngày không cần thiết. Xem meta.stackexchange.com/questions/147643/... Nếu bạn đồng ý rằng nó đòi hỏi làm rõ phiếu xin vui lòng vào meta.stackexchange.com/questions/281980/...
Michael Freidgeim

Câu trả lời:


394

Để tạo

(new FileInfo(filePath)).Directory.Create() Trước khi ghi vào tập tin.

.... Hoặc, nếu nó tồn tại, sau đó tạo (không làm gì khác)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);

5
Giải pháp tao nhã vì nó xử lý các tình huống yêu cầu tạo các thư mục lồng nhau.
Denny Jacob

Cảm ơn bạn! Tôi đã thấy stackoverflow.com/questions/9065598 , nhưng tôi muốn bắt đầu với đường dẫn tuyệt đối đến một tệp và không muốn xử lý việc tách đường dẫn. Bây giờ tôi biết rằng bạn có thể truy cập Thư mục từ phiên bản FileInfo.
Johann

Có một cách không đồng bộ để làm điều này?
Joe Phillips

1
Tôi cho rằng bạn có thể làm điều đó với Task.Run(() => );.
Don


34

Như @hitec đã nói, bạn phải chắc chắn rằng bạn có quyền, nếu bạn làm như vậy, bạn có thể sử dụng dòng này để đảm bảo sự tồn tại của thư mục:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

Một cách thanh lịch để di chuyển tệp của bạn sang thư mục không tồn tại là tạo phần mở rộng sau đây cho lớp FileInfo gốc:

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.MoveTo(destination);
    }
}

Sau đó sử dụng tiện ích mở rộng MoveTo hoàn toàn mới:

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

Kiểm tra tài liệu mở rộng Phương pháp .


-1

Bạn có thể sử dụng File.Exists để kiểm tra xem tệp có tồn tại không và tạo tệp bằng File.Create nếu được yêu cầu. Hãy chắc chắn rằng bạn kiểm tra nếu bạn có quyền truy cập để tạo tệp tại vị trí đó.

Một khi bạn chắc chắn rằng tập tin tồn tại, bạn có thể ghi vào nó một cách an toàn. Mặc dù để phòng ngừa, bạn nên đặt mã của mình vào một khối thử ... bắt và bắt cho các ngoại lệ mà chức năng có thể tăng lên nếu mọi thứ không đi đúng như kế hoạch.

Thông tin bổ sung cho các khái niệm I / O tập tin cơ bản .


Ban đầu tôi đọc sai câu hỏi của bạn rằng bạn muốn viết vào một tệp có thể không tồn tại. Các khái niệm về cơ bản là giống nhau cho IO tệp và thư mục mặc dù.
hitec

-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); Nếu thư mục đã tồn tại, phương thức này không làm gì cả.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

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.