如果文件不存在则创建文件

Posted

技术标签:

【中文标题】如果文件不存在则创建文件【英文标题】:Create File If File Does Not Exist 【发布时间】:2012-05-10 02:46:18 【问题描述】:

如果文件不存在,我需要让我的代码读取创建 else append。现在它正在读取它是否存在创建和附加。代码如下:

if (File.Exists(path))

    using (StreamWriter sw = File.CreateText(path))
    

我会这样做吗?

if (! File.Exists(path))

    using (StreamWriter sw = File.CreateText(path))
    

编辑:

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

【问题讨论】:

File.AppendAllText - 这正是您在一行代码中所需要的...... @ShadowWizard 由于这是标记的作业 OP 实际上可能被指示显示条件逻辑。 @Yuck - 重新发明***的作业?呸! ;) 【参考方案1】:

你可以简单地调用

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

如果文件不存在,它将创建文件并打开文件进行追加。

编辑:

这就足够了:

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

但如果你坚持先检查,你可以做这样的事情,但我不明白这一点。

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

另外,要在代码中指出的一件事是,您进行了大量不必要的拆箱操作。如果您必须使用像 ArrayList 这样的普通(非泛型)集合,则将对象拆箱一次并使用引用。

但是,我更喜欢将List<> 用于我的收藏:

public class EmployeeList : List<Employee>

【讨论】:

【参考方案2】:

或:

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

【讨论】:

在这种情况下,您会收到 IOException,因为当流写入器想要写入文件时,fileStream 仍然会锁定文件。而是将 fileStream 作为参数传递给 StreamWriter 构造函数。【参考方案3】:

您甚至不需要手动进行检查,File.Open 会为您完成。试试:

using (StreamWriter sw = new StreamWriter(File.Open(path, System.IO.FileMode.Append))) 

参考:http://msdn.microsoft.com/en-us/library/system.io.filemode.aspx

【讨论】:

【参考方案4】:

是的,如果你想检查文件不存在是否存在,你需要否定File.Exists(path)

【讨论】:

-1 在打开文件之前检查文件是否存在是错误的模式。这引入了竞争条件。查看其他答案和my comment on another question。【参考方案5】:

2021

只要使用File.AppendAllText,如果文件不存在就会创建:

File.AppendAllText("myFile.txt", "some text");

【讨论】:

【参考方案6】:

举例

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

【讨论】:

-1 在打开文件之前检查文件是否存在是错误的模式。这引入了竞争条件。查看其他答案和my comment on another question。 我的模式喜欢包含在 linq 中。我的意思是这很正常。有时文件需要授权,打开文件应该是第二种解决方案,而不是我们的答案。 @MetinAtalay对不起,我不完全理解你的评论。我担心的是,如果文件是在if (!(File.Exists(...))) 之后但在File.CreateText(...) 之前在外部创建的,那么它会被覆盖。【参考方案7】:
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;


【讨论】:

欢迎来到 SO。请提供更多信息,为什么此代码可能会回答问题。此外提供minimal reproducible example。【参考方案8】:

这对我也有效

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

【讨论】:

【参考方案9】:

这将启用使用 StreamWriter 附加到文件

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

这是默认模式,不会追加到文件并创建新文件。

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

如果你想检查文件是否存在然后做其他事情,你可以使用

using (StreamWriter sw = (File.Exists(path)) ? File.AppendText(path) : File.CreateText(path))
            ...

【讨论】:

以上是关于如果文件不存在则创建文件的主要内容,如果未能解决你的问题,请参考以下文章

如果文件不存在,则创建一个文件

如果文件不存在则创建文件,然后将日志写入其中

检查文件夹,如果不存在则创建它

MATLAB。写入文本文件或创建它,如果它不存在。将图形保存在目录中,如果不存在则创建它

如果目录不存在,则创建一个目录,然后在该目录中创建文件

如果 PHP 中不存在,则复制文件并创建目录 [重复]