AIR檔案操作:使用檔案物件操作檔案和目錄 .
在AIR中可以方便的對本地檔案操作,不過上次做了個專案,發現還是有不少不方便的地方,比如AIR對檔案和目錄的打包和解壓 (最終我使用了呼叫BAT執行解壓和打包操作,使用方法在我的其它文章中有提到)
一下是我引用官方的一些說明文件:
檔案物件是啥?
檔案物件(File物件)是在檔案系統中指向檔案或目錄的指標。由於安全原因,只在AIR中可用。
- 獲取特定目錄,包括使用者目錄、使用者文件目錄、該應用程式啟動的目錄和程式目錄
- 拷貝檔案和目錄
- 移動檔案和目錄
- 刪除檔案和目錄(或移至回收站)
- 列出某目錄中的檔案和目錄
- 建立臨時檔案和資料夾
- 建立目錄
- 讀取檔案資訊
- 獲取檔案系統資訊
在AIR中,我們用FileStream讀寫檔案的前提就是用File物件來指向檔案。
那麼檔案物件具體怎麼玩呢?
功能1、指向目錄和檔案
File 物件有兩個屬性都能定義檔案路徑,它們是nativePath和url。nativePath是在特定平臺使用的檔案路徑(主要就是Windows和 MacOs上的路徑表示不同),url則是統一的”file:///c:/Sample%20directory/test.txt”這樣的表示方法。
我們來看幾個指向目錄的例項,其中1-7演示瞭如何獲取特殊目錄:
- varfile:File = File.userDirectory; //指向使用者資料夾
- varfile:File = File.documentsDirectory; //指向使用者文件資料夾
- varfile:File
- varfile:File
- varfile:File = File.applicationStorageDirectory; //指向應用程式儲存目錄
(參見AIR的URL方案)
- vardir:File = File.applicationDirectory; //應用程式安裝目錄
- vardir:File = File.getRootDirectories(); //檔案系統根目錄
- varfile:File = newFile();
- file.nativePath = "C://Mousebomb//";
//(windows平臺)指向一個具體的目錄,這裡使用了nativePath屬性,”C://Mousebomb//”只適用windows中。
- var file:File = File.userDirectory;
file = file.resolvePath(”Mousebomb”);
//跳轉到使用者目錄下的Mousebomb目錄 - varurlStr:String = "file:///C:/Mousebomb/";
- varfile:File = newFile()
- file.url = urlStr;
- //指向c盤下的Mousebomb目錄,這裡使用了url屬性
- /*讓使用者選擇目錄*/
- varfile:File = newFile();
- file.addEventListener(Event.SELECT, dirSelected);
- file.browseForDirectory("Select a directory");
- functiondirSelected(e:Event):void{
- trace(file.nativePath);
- }
下面看看指向檔案的例項:
- 指向明確的檔案地址:
- varfile:File = File.applicationStorageDirectory;
- file = file.resolvePath("Flashj.txt");
- 使用url屬性的例子:
- varurlStr:String = "file:///C:/Mousebomb/Flashj.txt";
- varfile:File = newFile()
- file.url = urlStr;
- 當然你也可以直接這樣寫
- varurlStr:String = "file:///C: /Mousebomb/Flashj.txt";
- varfile:File = newFile(urlStr);
- //url中的空格會被%20替換
- 使用nativePath屬性:
- varfile:File = newFile();
- file.nativePath = "C:/ Mousebomb/Flashj.txt";
- 或者
- varfile:File = newFile("C:/ Mousebomb/Flashj.txt");
- //(Windows下)
- 通過對話方塊讓使用者選擇檔案
實現這個功能需要認識三個方法:
browseForOpen()
browseForSave()
browseForOpenMultiple()
三 個方法都是非同步的,browseForOpen() 和 browseForSave()方法在使用者選擇檔案時會觸發select事件,在選擇了某檔案時,File指向選擇的檔案。而browseForOpenMultiple()方法會觸發selectMultiple事件,該事件屬於FileListEvent型,它的屬性中具有指向所選檔案的File物件陣列。
例子:- varfileToOpen:File = File.documentsDirectory;
- selectTextFile(fileToOpen);
- functionselectTextFile(root:File):void
- {
- vartxtFilter:FileFilter = newFileFilter("Text", "*.as;*.css;*.html;*.txt;*.xml");
- root.browseForOpen("Open", [txtFilter]);
- root.addEventListener(Event.SELECT, fileSelected);
- }
- functionfileSelected(event:Event):void
- {
- trace(fileToOpen.nativePath);
- }
功能2、拷貝檔案和目錄
拷貝檔案使用到的方法有copyTo()和copyToAsync(),詳見AIR檔案基礎,前者為同步方法,後者為非同步方法。
要拷貝檔案,需要建立2個File物件,一個指向原檔案,一個指向目標檔案。像下面兩例:
1.同步拷貝例:
- varoriginal:File = File.documentsDirectory.resolvePath("Mousebomb/FlashJ.txt");
- varnewFile:File = File.resolvePath("Mousebomb/FlashJcn.txt");
- original.copyTo(newFile, true);
第二個引數true表示覆蓋存在的檔案,預設值是false,若設定為false,而拷貝的目標檔案已經存在,則AIR會發出IOErrorEvent事件。
2.非同步拷貝例:
- varoriginal = File.documentsDirectory;
- original = original.resolvePath("Mousebomb/FlashJ.txt");
- vardestination:File = File.documentsDirectory;
- destination = destination.resolvePath("FlashJ/FlashJcn.txt");
- original.addEventListener(Event.COMPLETE, fileCopyCompleteHandler);
- original.addEventListener(IOErrorEvent.IO_ERROR, fileCopyIOErrorEventHandler);
- original.CopyToAsync(destination);
- functionfileCopyCompleteHandler(event:Event):void{
- trace(event.target); // [object File]
- }
- functionfileCopyIOErrorEventHandler(event:IOErrorEvent):void{
- trace("I/O Error.");
- }
功能3、移動檔案和目錄
移動檔案使用的方法有moveTo()和MoveToAsync(),不僅長相類似,連使用方法都與拷貝檔案一樣,可以直接參考上文。
功能4、刪除檔案和目錄(或移至回收站)
deleteFile()和deleteFileAsync()負責刪除功能,而moveToTrash()和moveToTrashAsync()功能是移至回收站。先建立一個File物件指向某個檔案或目錄,然後執行四個方法之一,處理非同步方法要加事件監聽。
- varfile:File = File.documentsDirectory.resolvePath("DeleteMe.txt");
- file.moveToTrash();
功能5、列出某目錄中的檔案和目錄
可以使用getDirectoryListing()方法和getDirectoryListingAsync()方法獲取某個目錄下檔案與子目錄的File指標陣列。
例如:
- vardirectory:File = File.documentsDirectory;
- varcontents:Array = directory.getDirectoryListing();
- for(vari:uint = 0; i < contents.length; i++)
- {
- trace(contents[i].name, contents[i].size);
- }
本例輸出了使用者文件目錄中的檔名和大小。
若使用非同步方法,例如:
- vardirectory:File = File.documentsDirectory;
- directory.getDirectoryListingAsync();
- directory.addEventListener(FileListEvent.DIRECTORY_LISTING, dirListHandler);
- functiondirListHandler(event:FileListEvent):void
- {
- varcontents:Array = event.files;
- for(vari: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()方法可以建立目錄,例如:
- vardir: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 | 統一資源定位符 |
功能9、獲取檔案系統資訊
File類包含一下靜態屬性,提供有用的檔案系統資訊(主要是跨平臺使用):
屬性 | 描述 |
File.lineEnding | 系統的行結束符 |
File.separator | 系統的分隔符(Windows下為/ Mac Os為/) |
File.systemCharset | 系統的預設檔案編碼,屬於系統所使用的字符集 |
順便插進Capabilities類包含的靜態屬性:
屬性 | 描述 |
Capabilities.hasIME | 當前執行的系統是否安裝了輸入法編輯器 |
Capabilities.language | 當前執行的系統的語言編碼 |
Capabilities.os | 當前執行的作業系統 |