如果文件不存在则创建文件
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))
...
【讨论】:
以上是关于如果文件不存在则创建文件的主要内容,如果未能解决你的问题,请参考以下文章