1. 개요

     BONDI FileSystem 모듈은 단말기의 FileSystem에 접근하여 저장된 파일들의 List를 얻어오고, 
     File의 Read, Write, Append, Copy, Move, Delete, Create등의 기능을 지원하는 API를 제공한다.
     FileSystem의 어떤 Directory를 RootDirectory로 할 것인지는 Platform Dependent하다.
2. Interface
     1) FileSystemManager
          – unsigned long maxPathLength : 단말기에서 지원하는 최대한의 FilePath의 길이
          getDefaultLocation (specifier, minFreeSpace);
             미리 정의한 specifier로 함수를 호출하면 specifier에 대응하는 location의 path를
          반환하는 함수. BONDI에서 권장하는 specifier의 list는 아래와 같고, 만약 specifier에
             대응하는 저장공간이 정의되어 있지 않은 경우나 minFreeSpace보다 많은 여유공간이 
             없을경우, null을 반환한다.
             “wgt:package” : Widget Package가 위치하는 공간
             “wgt:private” : Widget의 private한 file들이 위치하는 공간
             “wgt:public” : Widget의 public한 file들이 위치하는 공간
             “wgt:temp” : Widget의 임시 저장 공간
             “documents” : Windows의 “My Documents” 폴더와 같이 문서파일을 저장하는 공간
             “images” : Windows의 “My Pictures” 폴더와 같이 사진파일을 저장하는 공간
             “videos” : Windows의 “My Videos” 폴더와 같이 동영상파일을 저장하는 공간
             “temp” :  임시저장공간
             “sdcard” : SD카드의 저장공간
             specifier : 특정 위치를 선택하기 위해 사용하는 변수로써, 위의 List중의 하나를
                              사용할 것을 권장한다.
             minFreeSpace : 최소한으로 필요한 여유공간, Default값은 0이다.
             ex) var wgtLocation = bondi.filesystem.getDefaultLocation(“wgt:package”);
          – getRootLocations ();
             미리 정의된 RootLocation들을 Array of String의 형태로 반환하는 함수로써 
             BONDI에서 권장하는 RootLocation들의 List는 아래와 같다.
             “documents” : Windows의 “My Documents” 폴더와 같이 문서파일을 저장하는 공간
             “images” : Windows의 “My Pictures” 폴더와 같이 사진파일을 저장하는 공간
             “videos” : Windows의 “My Videos” 폴더와 같이 동영상파일을 저장하는 공간
             “temp” : 임시저장공간
             “sdcard” : SD카드의 저장공간
              ex) var locations = bondi.filesystem.getRootLocations();
                    for (var i=0;  i<locations.length; i++){
                       alert(locations[i]);
                    }
          – resolve (location);
             Path에 해당하는 File Handle을 반환하는 함수. 만약 location에 해당하는 File이 없을 경우
             INVALID_ARGUMENT_ERROR를 발생시켜야 한다.
             ex) var location = bondi.filesystem.getDefaultLocation(“temp”);
                   var temp = bondi.filesystem.resolve(location);
var documents = bondi.filesystem.getDefaultLocation(“documents”);
var mydoc = bondi.filesystem.resolve(documents + “/data/2009/mydoc.txt”);

          – registerEventListener (listener);
             FileSystemListener를 등록하는 함수로써 mountEvent와 unmountEvent를 갖는 Listener를 등록할 수 있다.
             ex) var listener = { mountEvent : function (location) {
                                                            }
                                         unmountEvent : function (location) {
                                                                }
                                       }
                   bondi.filesystem.registerEventListener(listener);
          – unregisterEventListener (listener);
             registerEventListener함수를 통해 등록한 listener를 해제하는 함수. 만약 listener인자가 invalid한 경우 
             INVALID_ARGUMENT_ERROR를 발생시킨다.
             ex) bondi.filesystem.unregisterEventListener(listener);
     2) FileSystemListener
          – mountEvent (location);
             SD카드 같은 새로운 Storage가 추가될 때 호출되는Callback 함수
          – unmountEvent (location);
             새로 추가된 Storage가 제거될 때 호출되는 Callback 함수
          ex) var FileSystemListener = {
                     mountEvent : function (location) {
                     }
                     unmountEvent : function (location) {
                     }
     3) File
          * Read-Only Attributes
             – parent : Parent Directory의 Handle을 갖는 Property로써, 만약 Root Directory일
                           경우에는 null을 갖는다.
              readOnly : false일 경우에는 read/write, true일 경우에는 read만 가능하다.
              isFile : true일 경우에는 file을 의미하고, false일 경우에는 directory를 의미한다.
             isDirectory : true일 경우에는 directory를, false일 때는 file을 의미한다.
             created : File이 생성된 시점을 Date Object로 갖는다.
             modified : File이 최종적으로 수정된 시점을 Date Object로 갖는다.
             path : File의 이름을 제외한 경로만을 갖는다.
             name : File의 경로를 제외한 이름값만을 갖는다.
             absolutePath : 경로와 이름을 모두 포함하는 절대경로의 값을 갖는다.
             fileSize : 파일의 Size를 Byte단위로 갖는다.
             metadata : 파일의 Metadata를 갖는 Object.
          * Methods
             FileArray listFiles ();
                Directory에 포함된 File과 Directory들의 List를 Array of File Object로 반환하는 함수.
                “.”와 “..” Directory는 포함하지 않는다.
                ex) var files = dir.listFiles();

             – open(mode, encoding);
                mode와 encoding type을 갖고 File을 Open하는 함수.
                List of Mode
                – “r” : Reading
                – “a” : Appending
                – “w” : Over Writing
                List of Encoding (Read/Write 작업시에 해당 encoding으로 작업이 이루어진다.)
                – “UTF-8” : Default Encoding
                – “ISO8859-1” : Latin Encoding
                ex) var in = file.open(“r”, “UTF-8”);
 
             – copyTo (successCallback, errorCallback, filePath, overwrite);
                인자로 받은 filePath의 위치로 File을 복사하는 함수. 원본은 유지된다.
                filePath : 복사하려는 File의 위치로 [a-Z, 0-9, -, _, /, +]의 조합으로 구성된다.
                overwrite : True로 설정되어있으면 동일한 위치에 파일이 있더라도 덮어 씌운다.
                ex) var op = file.copyTo(successCallbcak, errorCallback, “/temp/file.copy”, false);

             – moveTo (successCallback, errorCallback, filePath, overwrite);
                인자로 받은 filePath의 위치로 File을 복사하는 함수로써, 복사후에 원본이 제거된다.

                filePath : 복사하려는 File의 위치로 [a-Z, 0-9, -, _, /, +]의 조합으로 구성된다.
                overwrite : True로 설정되어있으면 동일한 위치에 파일이 있더라도 덮어 씌운다.
                ex) var op = file.moveTo(successCallbcak, errorCallback, “/temp/file.copy”, false);

             – createDirectory (dirPath);
                현재 Directory위에 인자로 받은 Directory경로를 생성하는 함수로써, 만약 Sub-Directory가
                추가로 필요하다면 Sub-Directory들도 생성된다.
                ex) var newDir = dir.createDirectory(“newDir”);

             – createFile (filePath);
                인자로 받은 filePath에 empty file을 생성하는 함수로써, 만약 동일한 이름의 File이 이미 
                존재한다면 IO_ERROR를 발생시킨다.
                ex) var newFile = dir.createFile(“newFile.txt”);

             – resolve (filePath);
                현재 Directory에서 인자로 받은 filePath로 접근하여 File의 Handle을 반환하는 함수. 만약 
                filePath에 File이 존재하지 않는다면 null을 반환한다.
                ex) var hello = dir.resolve(“foo/hello.txt”);

             – deleteDirectory (recursive);
                Directory Type일 경우 Directory를 삭제하는 함수, recursive가 true일 경우 Sub-File와 
                Sub-Directory까지 전부 삭제해야 되는데, 이때 다른 Process가 Sub-file들을 사용하고 
                있다면 삭제를 할 수 없기 때문에 IO_ERROR를 발생시켜야 한다.
                정상적으로 작업을 종료했을경우 true를 반환하고, 그렇지 않을 경우 false를 반환한다.
                ex) if (dir.deleteDirectory(true)) {
                         alert(“Deleted!”);
                      }

             – deleteFile ();
                File Type일 경우 File을 삭제하는 함수로써, 정상적으로 삭제가 완료됐을 경우 true를 
                반환하고, 삭제하려는 File을 다른 Process가 점유하고 있어 삭제할 수 없을때는 IO_ERROR를
                발생시킨뒤, false를 반환한다.
                ex) if (dir.deleteFile()) {
                         alert(“Deleted!”);
                      }
     4) FileStream
          * Read-Only Attributes
             – eof : 현재의 file pointer가 end of file인지 아닌지를 나타내는 boolean값.
             – bytesAvailable : File에서 추가로 Read할 수 있는 Byte. 만약 end of file일 경우 -1을 반환한다.
          * Read/Write Attributes
             – position : File pointer값으로써 read/write 작업은 이 위치에서 이루어진다. 
          * Methods
             – close ();
                FileStream을 Close하는 함수로써 만약 Pending된 Write작업이 있을 경우, 이 작업은 cancel된다.
             – read (charCount);
                File의 Current Pointer에서 charCount만큼의 Char를 Read한 뒤 반환하는 함수.
                CurrentPointer에서 charCount만큼 Read할 수 없을 경우 eof까지 Read한 뒤 반환한다.
                만약 charCount가 0일 경우 가능한한 많이 Read해서 반환한다.
                ex) var readed_text = stream.read(0);
             – readBytes (byteCount);
                File의 Current Pointer에서 인자로 받은 만큼의 Byte를 Read한 뒤 ByteArray의 형태로 반환하는 함수.
                만약 byteCount가 0일 경우 가능한한 많은 Byte를 Read한 뒤 반환한다.
                ex) var raw = stream.readBytes(256);
             – readBase64 (byteCount);
                File의 Current Pointer에서 인자로 받은 만큼의 Byte를 Read한 뒤 base64 encoding String으로 
                반환하는 함수.
                ex) var base64 = stream.readBase64(256);
             – write (stringData);
                File의 Current Pointer에 인자로 받은 stringData를 Write하는 함수.
                ex) stream.write(“Hello BONDI”);
             – writeBytes (byteData);
                File의 Current Pointer에 인자로 받은 byteData를 Write하는 함수.
                ex) var bytes = in.readBytes(256);
                      out.writeBytes(bytes);
             – writeBase64 (base64Data);
                인자로 받은 base64 DOMString을 byteArray로 변환한 뒤 File의 Current Pointer에 Write하는 함수.
                ex) var base64 = in.readBase64(256);
                      out.writeBase64(base64);