1. 程式人生 > >AIR檔案操作:使用檔案物件操作檔案和目錄 .

AIR檔案操作:使用檔案物件操作檔案和目錄 .

在AIR中可以方便的對本地檔案操作,不過上次做了個專案,發現還是有不少不方便的地方,比如AIR對檔案和目錄的打包和解壓 (最終我使用了呼叫BAT執行解壓和打包操作,使用方法在我的其它文章中有提到)

一下是我引用官方的一些說明文件:

檔案物件是啥?
檔案物件(File物件)是在檔案系統中指向檔案或目錄的指標。由於安全原因,只在AIR中可用。

  1. 獲取特定目錄,包括使用者目錄、使用者文件目錄、該應用程式啟動的目錄和程式目錄
  2. 拷貝檔案和目錄
  3. 移動檔案和目錄
  4. 刪除檔案和目錄(或移至回收站)
  5. 列出某目錄中的檔案和目錄
  6. 建立臨時檔案和資料夾
  7. 建立目錄
  8. 讀取檔案資訊
  9. 獲取檔案系統資訊

在AIR中,我們用FileStream讀寫檔案的前提就是用File物件來指向檔案。

那麼檔案物件具體怎麼玩呢?

功能1、指向目錄和檔案
File 物件有兩個屬性都能定義檔案路徑,它們是nativePath和url。nativePath是在特定平臺使用的檔案路徑(主要就是Windows和 MacOs上的路徑表示不同),url則是統一的”file:///c:/Sample%20directory/test.txt”這樣的表示方法。

我們來看幾個指向目錄的例項,其中1-7演示瞭如何獲取特殊目錄

    1. varfile:File = File.userDirectory; //指向使用者資料夾
    1. varfile:File = File.documentsDirectory; //指向使用者文件資料夾
    1. varfile:File
      = File.desktopDirectory; //指向桌面
    1. varfile:File = File.applicationStorageDirectory; //指向應用程式儲存目錄

    (參見AIR的URL方案

    1. vardir:File = File.applicationDirectory; //應用程式安裝目錄
    1. vardir:File = File.getRootDirectories(); //檔案系統根目錄
    1. varfile:File = newFile();
    2. file.nativePath = "C://Mousebomb//";

    //(windows平臺)指向一個具體的目錄,這裡使用了nativePath屬性,”C://Mousebomb//”只適用windows中。

  1. var file:File = File.userDirectory;
    file = file.resolvePath(”Mousebomb”);
    //跳轉到使用者目錄下的Mousebomb目錄
    1. varurlStr:String = "file:///C:/Mousebomb/";
    2. varfile:File = newFile()
    3. file.url = urlStr;
    4. //指向c盤下的Mousebomb目錄,這裡使用了url屬性
    1. /*讓使用者選擇目錄*/
    2. varfile:File = newFile();
    3. file.addEventListener(Event.SELECT, dirSelected);
    4. file.browseForDirectory("Select a directory");
    5. functiondirSelected(e:Event):void{
    6. trace(file.nativePath);
    7. }

下面看看指向檔案的例項:

  1. 指向明確的檔案地址:
    1. varfile:File = File.applicationStorageDirectory;
    2. file = file.resolvePath("Flashj.txt");
  2. 使用url屬性的例子:
    1. varurlStr:String = "file:///C:/Mousebomb/Flashj.txt";
    2. varfile:File = newFile()
    3. file.url = urlStr;
  3. 當然你也可以直接這樣寫
    1. varurlStr:String = "file:///C: /Mousebomb/Flashj.txt";
    2. varfile:File = newFile(urlStr);
    3. //url中的空格會被%20替換
  4. 使用nativePath屬性:
    1. varfile:File = newFile();
    2. file.nativePath = "C:/ Mousebomb/Flashj.txt";
  5. 或者
    1. varfile:File = newFile("C:/ Mousebomb/Flashj.txt");
    2. //(Windows下)
  6. 通過對話方塊讓使用者選擇檔案
    實現這個功能需要認識三個方法:
    browseForOpen()
    browseForSave()
    browseForOpenMultiple()
    三 個方法都是非同步的,browseForOpen() 和 browseForSave()方法在使用者選擇檔案時會觸發select事件,在選擇了某檔案時,File指向選擇的檔案。而browseForOpenMultiple()方法會觸發selectMultiple事件,該事件屬於FileListEvent型,它的屬性中具有指向所選檔案的File物件陣列。
    例子:
    1. varfileToOpen:File = File.documentsDirectory;
    2. selectTextFile(fileToOpen);
    3. functionselectTextFile(root:File):void
    4. {
    5. vartxtFilter:FileFilter = newFileFilter("Text", "*.as;*.css;*.html;*.txt;*.xml");
    6. root.browseForOpen("Open", [txtFilter]);
    7. root.addEventListener(Event.SELECT, fileSelected);
    8. }
    9. functionfileSelected(event:Event):void
    10. {
    11. trace(fileToOpen.nativePath);
    12. }

功能2、拷貝檔案和目錄
拷貝檔案使用到的方法有copyTo()和copyToAsync(),詳見
AIR檔案基礎,前者為同步方法,後者為非同步方法。
要拷貝檔案,需要建立2個File物件,一個指向原檔案,一個指向目標檔案。像下面兩例:
1.同步拷貝例:

  1. varoriginal:File = File.documentsDirectory.resolvePath("Mousebomb/FlashJ.txt");
  2. varnewFile:File = File.resolvePath("Mousebomb/FlashJcn.txt");
  3. original.copyTo(newFile, true);

第二個引數true表示覆蓋存在的檔案,預設值是false,若設定為false,而拷貝的目標檔案已經存在,則AIR會發出IOErrorEvent事件。
2.非同步拷貝例:

  1. varoriginal = File.documentsDirectory;
  2. original = original.resolvePath("Mousebomb/FlashJ.txt");
  3. vardestination:File = File.documentsDirectory;
  4. destination = destination.resolvePath("FlashJ/FlashJcn.txt");
  5. original.addEventListener(Event.COMPLETE, fileCopyCompleteHandler);
  6. original.addEventListener(IOErrorEvent.IO_ERROR, fileCopyIOErrorEventHandler);
  7. original.CopyToAsync(destination);
  8. functionfileCopyCompleteHandler(event:Event):void{
  9. trace(event.target); // [object File]
  10. }
  11. functionfileCopyIOErrorEventHandler(event:IOErrorEvent):void{
  12. trace("I/O Error.");
  13. }

功能3、移動檔案和目錄
移動檔案使用的方法有moveTo()和MoveToAsync(),不僅長相類似,連使用方法都與拷貝檔案一樣,可以直接參考上文。

功能4、刪除檔案和目錄(或移至回收站)
deleteFile()和deleteFileAsync()負責刪除功能,而moveToTrash()和moveToTrashAsync()功能是移至回收站。先建立一個File物件指向某個檔案或目錄,然後執行四個方法之一,處理非同步方法要加事件監聽。

  1. varfile:File = File.documentsDirectory.resolvePath("DeleteMe.txt");
  2. file.moveToTrash();

功能5、列出某目錄中的檔案和目錄
可以使用getDirectoryListing()方法和getDirectoryListingAsync()方法獲取某個目錄下檔案與子目錄的File指標陣列。
例如:

  1. vardirectory:File = File.documentsDirectory;
  2. varcontents:Array = directory.getDirectoryListing();
  3. for(vari:uint = 0; i < contents.length; i++)
  4. {
  5. trace(contents[i].name, contents[i].size);
  6. }

本例輸出了使用者文件目錄中的檔名和大小。
若使用非同步方法,例如:

  1. vardirectory:File = File.documentsDirectory;
  2. directory.getDirectoryListingAsync();
  3. directory.addEventListener(FileListEvent.DIRECTORY_LISTING, dirListHandler);
  4. functiondirListHandler(event:FileListEvent):void
  5. {
  6. varcontents:Array = event.files;
  7. for(vari:uint = 0; i < contents.length; i++)
  8. {
  9. trace(contents[i].name, contents[i].size);
  10. }
  11. }

其中directoryListing事件物件中有個files屬性,為目錄下內容的File指標陣列。

功能6、建立臨時檔案和資料夾
使用createTempFile()和createTempDirectory()方法可以建立臨時檔案和資料夾。
var temp:File = File.createTempFile(); //在系統臨時資料夾下建立臨時檔案
createTempFile()方法會自動建立一個唯一的臨時檔案。
createTempDirectory ()方法會自動建立一個唯一的臨時資料夾。
你可以用臨時檔案來臨時儲存應用程式回話中的資訊。
由於臨時檔案不會自動刪除,所以你可能得讓應用程式在關閉前刪除它。

功能7、建立目錄
使用createDirectory()方法可以建立目錄,例如:

  1. vardir:File = File.userDirectory.resolvePath("Mousebomb");
  2. 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

當前執行的作業系統