Revit二次开发常常会用到读入或者导出数据;这个时候就需要借助.Net强大的功能;下面就简单介绍一下“流”:
在写程序之前,需要添加一个命名空间:using System.IO;
这个命名空间中,提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。
一、写入数据:
在添加了这个命名空间之后;请看下面的代码,我来分析:
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class Document_Selection : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
{
WriteTextFile();//调用下面写好的方法;
return Result.Succeeded;
}
//这是一个简单的写入数据的方法;
public void WriteTextFile()
{
StreamWriter writer = new StreamWriter("C:\\Users\\yuanyizhou\\Desktop\\test.txt");
writer.WriteLine("FirstLine");
writer.WriteLine("SecondLine");
writer.Close();
}
}
上面代码是:在一个Revit的接口类的主函数中,我们只执行了我们定义的一个方法,执行完毕之后就结束,告诉Revit成功执行命令;
主要看自定义方法,这个方法实现了将两行字符串分别输入到我电脑的桌面上的一个名叫text.txt的文件中:(C:\\Users\\yuanyizhou\\Desktop\\test.txt
)
步骤是:先初始化一个StreamWriter的对象,其构造的方法就是如上面程序所写的那样;当然还有多种初始化方式,具体就要查文档了;在这里,我们所采用的初始化方式会在每次运行的时候,都会重新生成一个新的文件(如果文件已经存在,就会被替换成新的);
查阅文档,如果想直接在已有文件尾部添加内容,那么构造函数写成:
StreamWriter writer =
new StreamWriter("C:\\Users\\yuanyizhou\\Desktop\\test.txt",true);
实际上,我们通常不这样构造,我们习惯把文件的路径单独存在一个string对象中,并且习惯把对文件的一些操作指令都放在一个作用域中:
public void WriteTextFile()
{
string filename = "C:\\Users\\yuanyizhou\\Desktop\\test.txt";
if (File.Exists(filename))
{
File.Delete(filename);
}
using (StreamWriter writer = new StreamWriter(filename, false))
{
writer.WriteLine("1 line");
writer.WriteLine("2 line");
writer.Close();
}
}
二、读数据:
同样,读文件操作也类似:
public void ReadTextFile()
{
string filename = "C:\\Users\\yuanyizhou\\Desktop\\test.txt";
using (StreamReader writer = new StreamReader(filename))
{
TaskDialog.Show(filename,reader.ReadLine());
}
}
当然,这只能读取文件中的一行,并将其展示在Revit窗口上;如果想展示所有的文件,那么就要写循环语句:
public void ReadTextFile()
{
string filename = "C:\\Users\\yuanyizhou\\Desktop\\test.txt";
string FileContents = "";
using (StreamReader reader = new StreamReader(filename))
{
string thisLine = "";
while (thisLine != null)
{
thisLine = reader.ReadLine();
FileContents += thisLine + Environment.NewLine;
}
}
TaskDialog.Show(filename, FileContents);
}
循环的关键是:到底是在什么条件下结束循环?如果解决这个问题,程序就很好写了;结束循环的条件是,读取到文件的末尾即停止;即读到某一行的时候,ReadLine( )返回的是 null 就停止;
三、把文件写到默认文件夹下
这里的默认文件夹是指专门用于存放临时数据的一个文件夹,该文件夹的路径是系统默认了的;
public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
{
string tempPath = Path.GetTempPath();
TaskDialog.Show("temp", tempPath);
return Result.Succeeded;
}
运行结果,消息框会弹出用户的文件夹地址,该文件夹专门用于存储临时文件:
现在,做一点小改善,完全可以把文件写在这个文件夹中了;
public void WriteTextFile()
{
string tempPath = Path.GetTempPath();
string file = "test.txt";
//也可以用这句话来搞定:string filename = Path.Combine(tempPath,file);
string filename = tempPath + "\\" + file;
if (File.Exists(filename))
{
File.Delete(filename);
}
using (StreamWriter writer = new StreamWriter(filename, false))
{
writer.WriteLine("1 line");
writer.WriteLine("2 line");
writer.Close();
}
}
调用函数之后,我们看见,是的没错,在这里:
(未完待续。。。)