AIR文件操作(二):使用文件對象操作文件和目錄
轉載於:http://www.flashj.cn/wp/air-file-operation2.html
文件對象是啥?
文件對象(File對象)是在文件系統中指向文件或目錄的指針。由於安全原因,只在AIR中可用。
文件對象能做啥?
- 獲取特定目錄,包括用戶目錄、用戶文檔目錄、該應用程序啟動的目錄和程序目錄
- 拷貝文件和目錄
- 移動文件和目錄
- 刪除文件和目錄(或移至回收站)
- 列出某目錄中的文件和目錄
- 創建臨時文件和文件夾
- 創建目錄
- 讀取文件信息
- 獲取文件系統信息
在AIR中,我們用FileStream讀寫文件的前提就是用File對象來指向文件。
那麽文件對象具體怎麽玩呢?
功能1、指向目錄和文件
File對象有兩個屬性都能定義文件路徑,它們是nativePath和url。nativePath是在特定平臺使用的文件路徑(主要就是Windows和MacOs上的路徑表示不同),url則是統一的”file:///c:/Sample%20directory/test.txt”這樣的表示方法。
我們來看幾個指向目錄的實例,其中1-7演示了如何獲取特殊目錄:
-
- var file:File = File.userDirectory; //指向用戶文件夾
-
- var file:File = File.documentsDirectory; //指向用戶文檔文件夾
-
- var file:File = File.desktopDirectory; //指向桌面
-
- var file:File = File.applicationStorageDirectory; //指向應用程序存儲目錄
(參見AIR的URL方案)
-
- var dir:File = File.applicationDirectory; //應用程序安裝目錄
-
- var dir:File = File.getRootDirectories(); //文件系統根目錄
- 還有一招,指向請求啟動該應用程序的目錄,先空著,以後補上。參考資料見《Capturing command
line arguments》 -
- var file:File = new File();
- file.nativePath = "C:Mousebomb";
//(windows平臺)指向一個具體的目錄,這裏使用了nativePath屬性,”C:Mousebomb”只適用windows中。
- var file:File = File.userDirectory;
file = file.resolvePath(“Mousebomb”);
//跳轉到用戶目錄下的Mousebomb目錄 -
- var urlStr:String = "file:///C:/Mousebomb/";
- var file:File = new File()
- file.url = urlStr;
- //指向c盤下的Mousebomb目錄,這裏使用了url屬性
-
- /*讓用戶選擇目錄*/
- var file:File = new File();
- file.addEventListener(Event.SELECT, dirSelected);
- file.browseForDirectory("Select a directory");
- function dirSelected(e:Event):void {
- trace(file.nativePath);
- }
下面看看指向文件的實例:
- 指向明確的文件地址:
- var file:File = File.applicationStorageDirectory;
- file = file.resolvePath("Flashj.txt");
- 使用url屬性的例子:
- var urlStr:String = "file:///C:/Mousebomb/Flashj.txt";
- var file:File = new File()
- file.url = urlStr;
- 當然你也可以直接這樣寫
- var urlStr:String = "file:///C: /Mousebomb/Flashj.txt";
- var file:File = new File(urlStr);
- //url中的空格會被%20替換
- 使用nativePath屬性:
- var file:File = new File();
- file.nativePath = "C:/ Mousebomb/Flashj.txt";
- 或者
- var file:File = new File("C:/ Mousebomb/Flashj.txt");
- //(Windows下)
- 通過對話框讓用戶選擇文件
實現這個功能需要認識三個方法:
browseForOpen()
browseForSave()
browseForOpenMultiple()
三個方法都是異步的,browseForOpen() 和 browseForSave()方法在用戶選擇文件時會觸發select事件,在選擇了某文件時,File指向選擇的文件。 而browseForOpenMultiple()方法會觸發selectMultiple事件,該事件屬於FileListEvent型,它的屬性中具有指向所選文件的File對象數組。
例子:- var fileToOpen:File = File.documentsDirectory;
- selectTextFile(fileToOpen);
- function selectTextFile(root:File):void
- {
- var txtFilter:FileFilter = new FileFilter("Text", "*.as;*.css;*.html;*.txt;*.xml");
- root.browseForOpen("Open", [txtFilter]);
- root.addEventListener(Event.SELECT, fileSelected);
- }
- function fileSelected(event:Event):void
- {
- trace(fileToOpen.nativePath);
- }
功能2、拷貝文件和目錄
拷貝文件使用到的方法有copyTo()和copyToAsync(),詳見AIR文件基礎,前者為同步方法,後者為異步方法。
要拷貝文件,需要創建2個File對象,一個指向原文件,一個指向目標文件。像下面兩例:
1.同步拷貝例:
- var original:File = File.documentsDirectory.resolvePath("Mousebomb/FlashJ.txt");
- var newFile:File = File.resolvePath("Mousebomb/FlashJcn.txt");
- original.copyTo(newFile, true);
第二個參數true表示覆蓋存在的文件,默認值是false,若設置為false,而拷貝的目標文件已經存在,則AIR會發出IOErrorEvent事件。
2.異步拷貝例:
- var original = File.documentsDirectory;
- original = original.resolvePath("Mousebomb/FlashJ.txt");
- var destination:File = File.documentsDirectory;
- destination = destination.resolvePath("FlashJ/FlashJcn.txt");
- original.addEventListener(Event.COMPLETE, fileCopyCompleteHandler);
- original.addEventListener(IOErrorEvent.IO_ERROR, fileCopyIOErrorEventHandler);
- original.CopyToAsync(destination);
- function fileCopyCompleteHandler(event:Event):void {
- trace(event.target); // [object File]
- }
- function fileCopyIOErrorEventHandler(event:IOErrorEvent):void {
- trace("I/O Error.");
- }
功能3、移動文件和目錄
移動文件使用的方法有moveTo()和MoveToAsync(),不僅長相類似,連使用方法都與拷貝文件一樣,可以直接參考上文。
功能4、刪除文件和目錄(或移至回收站)
deleteFile()和deleteFileAsync()負責刪除功能,而moveToTrash()和moveToTrashAsync()功能是移至回收站。先創建一個File對象指向某個文件或目錄,然後執行四個方法之一,處理異步方法要加事件監聽。
- var file:File = File.documentsDirectory.resolvePath("DeleteMe.txt");
- file.moveToTrash();
功能5、列出某目錄中的文件和目錄
可以使用getDirectoryListing()方法和getDirectoryListingAsync()方法獲取某個目錄下文件與子目錄的File指針數組。
例如:
- var directory:File = File.documentsDirectory;
- var contents:Array = directory.getDirectoryListing();
- for (var i:uint = 0; i < contents.length; i++)
- {
- trace(contents[i].name, contents[i].size);
- }
本例輸出了用戶文檔目錄中的文件名和大小。
若使用異步方法,例如:
- var directory:File = File.documentsDirectory;
- directory.getDirectoryListingAsync();
- directory.addEventListener(FileListEvent.DIRECTORY_LISTING, dirListHandler);
- function dirListHandler(event:FileListEvent):void
- {
- var contents:Array = event.files;
- for (var i:uint = 0; i < contents.length; i++)
- {
- trace(contents[i].name, contents[i].size);
- }
- }
其中directoryListing事件對象中有個files屬性,為目錄下內容的File指針數組。
功能6、創建臨時文件和文件夾
使用createTempFile()和createTempDirectory()方法可以創建臨時文件和文件夾。
var temp:File = File.createTempFile(); //在系統臨時文件夾下創建臨時文件
createTempFile()方法會自動創建一個唯一的臨時文件。
createTempDirectory ()方法會自動創建一個唯一的臨時文件夾。
你可以用臨時文件來臨時存儲應用程序回話中的信息。
由於臨時文件不會自動刪除,所以你可能得讓應用程序在關閉前刪除它。
功能7、創建目錄
使用createDirectory()方法可以創建目錄,例如:
- var dir:File = File.userDirectory.resolvePath("Mousebomb");
- dir.createDirectory();
這個例子在用戶文件夾下創建了Mousebomb目錄,如果Mousebomb目錄存在,則不會作出操作。
功能8、讀取文件信息
File類中包含以下屬性,提供File對象所指向文件或目錄的信息。
屬性 |
描述 |
creationDate |
創建日期 |
exists |
是否存在 |
extension |
擴展名,若無則為null |
icon |
該文件的圖標對象 |
isDirectory |
是否目錄 |
modificationDate |
修改日期 |
name |
文件名(包括擴展名) |
nativePath |
特定平臺使用的文件路徑 |
parent |
父級目錄,若該File對象就是頂級則此屬性為null |
size |
字節大小 |
url |
統一資源定位符 |
詳細參見AIR ActionScript 3.0 Language Reference for Adobe AIR.
功能9、獲取文件系統信息
File類包含一下靜態屬性,提供有用的文件系統信息(主要是跨平臺使用):
屬性 |
描述 |
File.lineEnding |
系統的行結束符 |
File.separator |
系統的分隔符(Windows下為 Mac Os為/) |
File.systemCharset |
系統的默認文件編碼,屬於系統所使用的字符集 |
順便插進Capabilities類包含的靜態屬性:
屬性 |
描述 |
Capabilities.hasIME |
當前運行的系統是否安裝了輸入法編輯器 |
Capabilities.language |
當前運行的系統的語言編碼 |
Capabilities.os |
當前運行的操作系統 |
參考文獻:http://livedocs.adobe.com/air/1/devappsflash/help.html?content=dg_part_6_1.html(文件與數據)
(本文若有不當之處,敬請指出。)
AIR文件操作(二):使用文件對象操作文件和目錄