
高级技术文档撰写工程师
Adobe
图 1 中显示的目录搜索范例应用程序演示 Adobe AIR 中在处理文件方面的以下功能:

图 1。通过本范例应用程序可以搜索特定文件。
注意: 本范例应用程序按原样提供, 用于教学目的。
若要充分利用本篇文章, 您需要以下软件和文件:
本范例应用程序包括以下文件:
应具备使用 Flex Builder 或 Flex SDK 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序。
注意: 对于文件的 MXML 代码所使用的全部 Flex 组件, 本文将不一一介绍。有关详细信息, 请参阅《Flex 3 语言参考》*。
init() 方法将 folderPath TextInput 组件的文本值设置为预定义的路径 (用户的文档目录):
folderPath.text=File.documentsDirectory.nativePath;
File.documentsDirectory 是指向用户的文档目录 (例如 Windows 中的“我的文档”目录) 的 File 对象, 而 nativePath 属性是该目录特定于平台的路径的字符串值。例如, 在 Windows 中, 此路径可能为:
C:\Documents and Settings\userName\My Documents
而在 Mac OS X 中, 此路径可能为:
/Users/userName/Documents
用户可以 (在 TextArea 组件中) 编辑此值, 而在用户单击 Search (搜索) 按钮时, search() 方法查看路径是否有效, 如果无效, 则显示错误消息:
var dir:File = new File(folderPath.text);
if (!dir.isDirectory)
{
Alert.show("Invalid directory path.", "Error");
}
请注意 File 中 nativePath 属性与 url 属性之间的区别, 此处列出了同一个 directory File 对象的这两个属性:
trace(directory.nativePath); // C:\Documents and Settings\swartz\My Documents trace(directory.url); // file:///C:/Documents%20and%20Settings/swartz/My%20Documents
主搜索进程以异步方式一次一条地列出目录中的内容。由此, 在 AIR 从文件系统中 (异步) 获得目录列表信息时可以运行其它基于 ActionScript 的进程 (如进度条动画和结果列表)。
search() 方法为 dirListing 事件设置事件侦听器, getDirectoryListingAsync() 进程运行完毕时将调度该事件:
dir.addEventListener(FileListEvent.DIRECTORY_LISTING, dirListed); dir.getDirectoryListingAsync();
dirListed() 方法处理当前目录中文件的列表。此列表由 dirListing 事件的 files 属性表示。该方法将 currentNodes 变量设置为此数组:
currentNodes = event.files;
dirListed() 方法遍历此数组的每个成员, 以查看成员是否为目录。如果成员是目录, 则将该对象添加至 (当前正在检查的目录的) 当前子目录的列表。
node = currentNodes[i];
if (node.isDirectory)
{
currentSubdirectories.push(currentNodes[i]);
}
遍历完毕之后, 将此数组的成员添加至要搜索的目录的主数组 (名为 directoryStack):
for (i = currentSubdirectories.length - 1; i > -1; i--)
{
directoryStack.push(currentSubdirectories[i]);
}
此时, 由于对当前目录的处理已完毕, 因此应用程序可以继续异步列出堆栈中的下一个目录 (如果还有目录):
var dir:File = directoryStack.pop();
if (dir == null) {
progress.visible = false;
// 没有其它目录要搜索。搜索完成。
} else {
dir.addEventListener(FileListEvent.DIRECTORY_LISTING, dirListed);
dir.listDirectoryAsync();
}
dirListed() 方法在遍历当前目录内容所构成的这个数组的各成员时, 将检查该名称是否与搜索模式相匹配, 而如果匹配, 则将创建一个对象, 并将其添加至 resultsGrid DataGrid 组件的数据提供者 ArrayCollection:
if (node.name.search(pattern) > -1)
{
var newData:Object = {name:node.name,
path:node.nativePath,
type:node.extension};
resultData.addItem(newData);
}