|
楼主 |
发表于 2008-12-31 22:52:51
|
显示全部楼层
eMIS 准备 - XUL中的通用对话框
一个完善的OA系统,肯定离不开一些文件的操作,那文件操作的前提是要打开、保存文件,那么如何打开文件,保存文件呢,打开文件、保存文件的对话框又如何实现?
先说说如何实现打开文件、保存文件、选择文件夹对话框,这些对话框在应用程序中称为通用对话框
XUL中没有类似功能的标签,只能使用JS调用XPCOM中的组件来完成这种功能
在XPCOM中具有打开文件、保存文件、选择文件夹对话框功能的组件名称为 nsIFilePicker
下面介绍 nsFilePicker 的使用方法
1.创建 nsIFilePicker :
view plaincopy to clipboardprint?
- var fp = Components.classes["@mozilla.org/filepicker;1"]
- .createInstance(Components.interfaces.nsIFilePicker);
var fp = Components.classes["@mozilla.org/filepicker;1"] .createInstance(Components.interfaces.nsIFilePicker);2.nsIFilePicker方法:
1). init()
原型: void init(in nsIDOMWindow parent, in AString title, in short mode);
功能: 初始化 nsIFilePicker 组件
参数: parent: 该对话框的父窗口对象,一般写window即可; title: 提示的信息; mode:打开对话框的模式,有4种打开方式, modeOpen(0, 选择单个文件), modeSave(1, 保存单个文件),modeGetFolder(2, 选择单个文件夹), modeOpenMultiple(3, 选择多个文件)
2). appendFilters()
原型: void appendFilters(in long filterMask);
功能: 设置文件过滤器
参数: filerMask: 文件过滤器的类别,目前有如下几种类别: filterAll(0×01,所有的文件,*.*),filterHTML(0×02, HTML文件, *.html;*.htm), filterText(0×04, 文本文件, *.txt),filterImages(0×08, 图像文件, *.jpg; *.jpeg; *.gif; *.png), filterXML(0×10,XML文件, *.xml), filterXUL(0×20, XUL文件, *.xul), filterApps(0×40,可执行文件,不同的操作系统平台文件后缀不同)
3). appendFilter()
原型: void appendFilter(in AString title, in AString filter);
功能: 设置自定义文件过滤器
参数: title: 过滤器的提示信息, filter: 实际过滤器, 比如过滤压缩文件可以这样写: fp.appendFilter(”压缩文档(*.zip,*.rar)”,”*.rar;*.zip”);
4). show()
原型: short show();
功能: 显示对话框
返回: 对话框返回值, 有 returnOK(0,单击确定), returnCancel(1, 单击取消), returnReplace(2, 选择替换某个文件时)
3. nsIFilePicker属性:
1). defaultString: (AString, R/W), 读写, 默认的文件名
2). filterIndex: (long, R/W), 读写, 以0开始的过滤器的顺序
3). displayDirectory: (nsILocalFile, R/W), 读写, 默认的目录
4). file: (nsILocalFile, R), 只读, 选择后的文件的“句柄”, 当init的mode选择为modeOpen时有效
5). fileURL: (nsIFileURL, R), 只读, 选择后的URL文件的“句柄”
6). files: (nsISimpleEnumerator, R), 只读, 选择后的所有的文件, 当init的mode选择为modeOpenMultiple时有效
4. 示例:
view plaincopy to clipboardprint?
- /**********************************
- * 选择单个文件
- ***********************************/
- const nsIFilePicker = Components.interfaces.nsIFilePicker;
- //创建组件
- var fp = Components.classes["@mozilla.org/filepicker;1"]
- .createInstance(nsIFilePicker);
- //初始化组件, 选择打开单个文件
- fp.init(window, "选择单个文件", nsIFilePicker.modeOpen);
- //添加文件过滤器
- fp.appendFilters(nsIFilePicker.filterAll | nsIFilePicker.filterText);
- //显示对话框
- var rv = fp.show();
- if(rv==nsIFilePicker.returnOK || rv==nsIFilePicker.returnReplace)
- {
- //alert("选择了文件");
- //获得选择的文件对象
- var file = fp.file;
- alert("您选择的文件全路径为:" + file.path);
- }
- else
- {
- alert("没有选择文件");
- }
- /********************************
- * 选择多个文件
- *********************************/
- ......
- fp.init(window, "选择多个文件", nsIFilePicker.modeOpenMultiple);
- ......
- {
- var files = fp.files;
- while (files.hasMoreElements())
- {
- //从files里获取单个文件的句柄
- var file = files.getNext().QueryInterface(Components.interfaces.nsILocalFile);
- alert("文件全路径为:"+file.path);
- }
- }
- ......
/*********************************** 选择单个文件***********************************/const nsIFilePicker = Components.interfaces.nsIFilePicker;//创建组件var fp = Components.classes["@mozilla.org/filepicker;1"] .createInstance(nsIFilePicker);//初始化组件, 选择打开单个文件fp.init(window, "选择单个文件", nsIFilePicker.modeOpen);//添加文件过滤器fp.appendFilters(nsIFilePicker.filterAll | nsIFilePicker.filterText);//显示对话框var rv = fp.show(); if(rv==nsIFilePicker.returnOK || rv==nsIFilePicker.returnReplace){ //alert("选择了文件"); //获得选择的文件对象 var file = fp.file; alert("您选择的文件全路径为:" + file.path);}else{ alert("没有选择文件");}/********************************* 选择多个文件*********************************/......fp.init(window, "选择多个文件", nsIFilePicker.modeOpenMultiple);......{ var files = fp.files; while (files.hasMoreElements()) { //从files里获取单个文件的句柄 var file = files.getNext().QueryInterface(Components.interfaces.nsILocalFile); alert("文件全路径为:"+file.path); }}......上面的这些操作,建议封装成函数,以方便调用
对于上面的 nsILocalFile,nsIFileURL 组件,就涉及到了文件的有关操作了
相关链接:
https://developer.mozilla.org/En/NsIFilePicker |
|