我试图找出文件是否存在,如果存在,验证css样式是否已经存在,如果不存在,则将它们写在文件的末尾...
我已经完成了所有这些,但分3步:
文件是否存在?
FileInfo fi= new FileInfo(Path.Combine(rootPath, "DefaultStyles.css");
如果是,我使用TextReader
获取内容
using (TextReader tr = new StreamReader(file))
{
r = tr.ReadToEnd().Contains(".onebyonecard");
tr.Close();
}
如果找不到样式,我会写入
using (TextWriter tw = new StreamWriter(file))
{
tw.Write(cssStyle);
tw.Close();
}
有没有办法在一个简单的打开/关闭中执行此操作,而是需要一遍又一遍地打开文件?
答案 0 :(得分:3)
那么你可以打开一个单独的流来进行读写 - 但是考虑到你正在阅读整个文件,我个人只需打开它两次。请注意,您当前的代码将覆盖该文件,而不是附加到该文件。
我个人会使用File
类中的静态方法:
// Elide this into the "if" condition if you want. I've separated it out here,
// but obviously it makes no difference.
bool present = File.Exists(path) &&
File.ReadAllText(path).Contains(".onebyonecard);
if (!present)
{
File.AppendAllText(path, cssStyle);
}
这比具有读/写流并在其上创建TextReader
和TextWriter
更简单。
几点说明:
答案 1 :(得分:3)
好吧,既然你使用的是ReadToEnd()
,你也可以使用:
if (!File.Exists(file) || !File.ReadAllText(file).Contains(".onebyonecard"))
File.AppendAllText(file, cssStyle);
但这仍然会打开两次。有一些API只允许它打开一次,但那些是二进制API(Stream
等) - 这将工作,但对你的场景可能有点过分。
答案 2 :(得分:0)
try
{
TextReader tr = new StreamReader(file);
r = tr.ReadToEnd().Contains(".onebyonecard");
tr.Close();
tr.Dispose ();
}
catch { //File is not exists or is used by another application
}