Tạo tệp nếu tệp không tồn tại


76

Tôi cần lấy mã của mình để đọc nếu tệp không tồn tại, hãy tạo thêm phần khác. Ngay bây giờ nó đang đọc nếu nó tồn tại, hãy tạo và nối thêm. Đây là mã:

if (File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {

Tôi sẽ làm điều này?

if (! File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {

Biên tập:

string path = txtFilePath.Text;

if (!File.Exists(path))
{
    using (StreamWriter sw = File.CreateText(path))
    {
        foreach (var line in employeeList.Items)
        {
            sw.WriteLine(((Employee)line).FirstName);
            sw.WriteLine(((Employee)line).LastName);
            sw.WriteLine(((Employee)line).JobTitle);
        }
    }
}
else
{
    StreamWriter sw = File.AppendText(path);

    foreach (var line in employeeList.Items)
    {
        sw.WriteLine(((Employee)line).FirstName);
        sw.WriteLine(((Employee)line).LastName);
        sw.WriteLine(((Employee)line).JobTitle);
    }
    sw.Close();
}

}


1
File.AppendAllText - điều này được thực hiện chính xác những gì bạn cần trong một dòng mã ..
Bóng Wizard là tiêm

@ShadowWizard Vì đây là bài tập về nhà được gắn thẻ nên OP thực sự có thể được hướng dẫn để hiển thị logic có điều kiện.
Yuck

5
@Yuck - bài tập về nhà để phát minh lại bánh xe? Kinh quá! ;)
Shadow Wizard đang tiêm chủng vào

Câu trả lời:


113

Bạn chỉ có thể gọi

using (StreamWriter w = File.AppendText("log.txt"))

Nó sẽ tạo tệp nếu nó không tồn tại và mở tệp để bổ sung.

Biên tập:

Điều này là đủ:

string path = txtFilePath.Text;               
using(StreamWriter sw = File.AppendText(path))
{
  foreach (var line in employeeList.Items)                 
  {                    
    Employee e = (Employee)line; // unbox once
    sw.WriteLine(e.FirstName);                     
    sw.WriteLine(e.LastName);                     
    sw.WriteLine(e.JobTitle); 
  }                
}     

Nhưng nếu bạn khăng khăng kiểm tra trước, bạn có thể làm điều gì đó như thế này, nhưng tôi không thấy điểm mấu chốt.

string path = txtFilePath.Text;               


using (StreamWriter sw = (File.Exists(path)) ? File.AppendText(path) : File.CreateText(path))                 
{                      
    foreach (var line in employeeList.Items)                     
    {                         
      sw.WriteLine(((Employee)line).FirstName);                         
      sw.WriteLine(((Employee)line).LastName);                         
      sw.WriteLine(((Employee)line).JobTitle);                     
    }                  
} 

Ngoài ra, một điều cần chỉ ra với mã của bạn là bạn đang thực hiện rất nhiều thao tác mở hộp không cần thiết. Nếu bạn phải sử dụng một bộ sưu tập thuần túy (không chung chung) như ArrayList, hãy mở hộp đối tượng một lần và sử dụng tham chiếu.

Tuy nhiên, tôi muốn sử dụng List<>cho bộ sưu tập của mình:

public class EmployeeList : List<Employee>

18

hoặc là:

using FileStream fileStream = File.Open(path, FileMode.Append);
using StreamWriter file = new StreamWriter(fileStream);
// ...

1
Đối với trường hợp này, bạn sẽ nhận được IOException vì fileStream vẫn khóa tệp khi người viết luồng muốn ghi vào nó. Thay vào đó, hãy chuyển fileStream dưới dạng đối số đến phương thức khởi tạo StreamWriter.
muối


6

Có, bạn cần phủ định File.Exists(path)nếu muốn kiểm tra xem tệp tồn tại hay không .


-1 Kiểm tra sự tồn tại của tệp trước khi mở tệp là một mẫu sai. Điều này giới thiệu các điều kiện chủng tộc. Xem các câu trả lời khác và bình luận của tôi về câu hỏi khác .
ComFreek

0

Ví dụ

    string rootPath = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
        rootPath += "MTN";
        if (!(File.Exists(rootPath)))
        {
            File.CreateText(rootPath);
        }

-1 Kiểm tra sự tồn tại của tệp trước khi mở tệp là một mẫu sai. Điều này giới thiệu các điều kiện chủng tộc. Xem các câu trả lời khác và bình luận của tôi về câu hỏi khác .
ComFreek

Mô hình của tôi giống như chứa trong linq. Tôi có nghĩa là nó là bình thường. Đôi khi tệp ủy quyền cần thiết, mở tệp nên là giải pháp thứ hai thay cho câu trả lời của chúng tôi.
Metin Atalay

@MetinAtalay Tôi xin lỗi, tôi không hiểu hết nhận xét của bạn. Mối quan tâm của tôi là nếu tệp được tạo - bên ngoài - sau if (!(File.Exists(...))), nhưng trước File.CreateText(...)đó, thì nó bị ghi đè.
ComFreek

0
private List<Url> AddURLToFile(Urls urls, Url url)
{
    string filePath = @"D:\test\file.json";
    urls.UrlList.Add(url);

    //if (!System.IO.File.Exists(filePath))
    //    using (System.IO.File.Delete(filePath));

    System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(urls.UrlList));

    //using (StreamWriter sw = (System.IO.File.Exists(filePath)) ? System.IO.File.AppendText(filePath) : System.IO.File.CreateText(filePath))
    //{
    //    sw.WriteLine(JsonConvert.SerializeObject(urls.UrlList));
    //}
    return urls.UrlList;
}

private List<Url> ReadURLToFile()
{
    //  string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"App_Data\file.json");
    string filePath = @"D:\test\file.json";

    List<Url> result = new List<Url>(); ;
    if (!System.IO.File.Exists(filePath))
        using (System.IO.File.CreateText(filePath)) ;



    using (StreamReader file = new StreamReader(filePath))
    {
        result = JsonConvert.DeserializeObject<List<Url>>(file.ReadToEnd());
        file.Close();
    }
    if (result == null)
        result = new List<Url>();

    return result;

}

Chào mừng đến với SO. Vui lòng cung cấp thêm thông tin tại sao mã này có thể trả lời câu hỏi. Hơn nữa, cung cấp một ví dụ có thể tái tạo tối thiểu .
Mathias

0

Điều này cũng hiệu quả với tôi

string path = TextFile + ".txt";

if (!File.Exists(HttpContext.Current.Server.MapPath(path)))
{
    File.Create(HttpContext.Current.Server.MapPath(path)).Close();
}
using (StreamWriter w = File.AppendText(HttpContext.Current.Server.MapPath(path)))
{
    w.WriteLine("{0}", "Hello World");
    w.Flush();
    w.Close();
}

0

Điều này sẽ cho phép thêm vào tệp bằng StreamWriter

 using (StreamWriter stream = new StreamWriter("YourFilePath", true)) {...}

Đây là chế độ mặc định, không phải thêm vào tệp và tạo tệp mới.

using (StreamWriter stream = new StreamWriter("YourFilePath", false)){...}
                           or
using (StreamWriter stream = new StreamWriter("YourFilePath")){...}

Nhưng dù sao nếu bạn muốn kiểm tra xem tệp có tồn tại hay không và sau đó làm những việc khác, bạn có thể sử dụng

using (StreamWriter sw = (File.Exists(path)) ? File.AppendText(path) : File.CreateText(path))
            {...}
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.