AIR/HTML in AIR2009. 4. 17. 23:28


1 AIR에서 자바스크립트 성분으로 접근 제어
HTMLLoader를 사용하여 HTML을 불러온 경우 HTML Document object model(DOM)로 접근하기위해서는 window속성을 사용한다. 이 속성은 자바스크립트의 window속성과 매핑되며 이를 통해 성분에 접근이 가능하다.
다만 사용시 페이지 로딩이 완료 된 후에 접근하여야 한다.

 var pageTitle = "TEST-AIR";
 var description = "이것은 HTML에서 설정한 문자입니다."

 function showAlert(){
  alert(description)
}


위와 같은 자바스크립트가 있을때 AIR에서는 아래와 같이 HTMLLoader를 통해 접근이 가능하다.
아래 코드는 Event.COMPLETE이 완료된 후에 실행한다.
HTMLLoader인스턴스.window.description = "난 AS이다 내가 값을 바꾸었지롱~";
위처럼 AIR에서 window속성으로 접근하여 값을 바꾼 후 showAlert()을 실행하면
얼럿창에는 "난 AS이다 내가 값을 바꾸었지롱~"라는 메세지가 출력된다.

또한 AIR 어플리케이션의 타이틀을 설정하고자 pageTitle의 값을 아래처럼 읽어와 설정할 수 있다.
ui.stage.nativeWindow.title = _htmlLoader.window.pageTitle;


[ HTML FULL CODE ]
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--
var pageTitle = "TEST-AIR";
var description = "이것은 HTML에서 설정한 문자입니다."

 function showAlert(){
  alert(description)
 }
//-->
</SCRIPT>
</HEAD>

 <BODY>
 <p id="p1">
  HTML IN AIR
 </p>
 <button onClick="showAlert()">Click</button>
 </BODY>
</HTML>


[ AIR FULL CODE ]
import mx.core.UIComponent;
private var _htmlLoader:HTMLLoader;
private var ui:UIComponent = new UIComponent();
private function init():void
{
    addChild( ui );
    ui.addEventListener(Event.ADDED_TO_STAGE , onStage );
}
   
private function onStage( e:Event ):void
{
    _htmlLoader = new HTMLLoader();
    _htmlLoader.width = ui.stage.stageWidth;
    _htmlLoader.height = ui.stage.stageHeight;
    _htmlLoader.addEventListener( Event.COMPLETE , completeHandler );
    _htmlLoader.load( new URLRequest("./docs/example.html") );
    ui.addChild( _htmlLoader );

   
private function completeHandler( e:Event ):void
{
     ui.stage.nativeWindow.title = _htmlLoader.window.pageTitle;    
     _htmlLoader.window.description = "난 AS이다 내가 값을 바꾸었지롱~";
}




2 자바스크립트에서 Actionscript의 함수처리하기
위와 같은 HTML 예제인데 이번에는 버튼을 누르면 실행되는 자바스크립의 showAlert()을 액션스크립트에서 콜벡으로 가로채 액션스크립트 내부의 함수로 실행시킬 수 있다. 이 때 자바스크립트의 showAlert()는 실행되지 않는다.
private function completeHandler( e:Event ):void
{
    _htmlLoader.window.showAlert = function():void
    {
      Alert.show("자바스크립트 showAlert에 의한 AS실행")
     }

}




3 액션스크립트에서 HTML 엘리먼트 변경
위와 같은 HTML에서 p1이라는 p태그가 있다. 태그안에 내용은 HTML IN AIR으로서 기본적으로 화면에 출력되는데 AIR에서 로드 완료시 이 엘리먼트 값을 바꾸어 화면에 출력되는 내용을 변경할 수 있다.
다만 로드완료하여 변경시 살짝 깜빡거린다.
private function completeHandler( e:Event ):void
{
    _htmlLoader.window.document.getElementById("p1").innerText = "Hello form ActionScript";
}



그림을 보면 빨간 부분이 위의 다른 2개와 다르다는 것을 확인 할 수 있다.

4 액션스크립트에서 HTML객체에 이벤트 등록
역시 같은 HTML을 불러와 사용하는 것으로 Body태그에 등록된 텍스트(p1태그의 HTML IN AIR)를 클릭하면 mx.controls.Alert이 뜨도록 AIR내부에서 이벤트처리하는 방법이다.
private function completeHandler( e:Event ):void
{
    _htmlLoader.window.document.getElementById("p1").onclick = clickHandler;
}
   
private function clickHandler( e:Object ):void
{
    Alert.show("액션스크립트 함수실행");
}





참고) Flex 빌더에서 테스트할때는 항상 Project에서 Clean을 하여야 HTML내용이 갱신됩니다.

ps) 제가 정리한 대부분의 AIR 포스팅은 위키북스의 AIR인 액션(AIR in Action)의 커리큘럼 토대로 테스트 정리하였습니다. AIR in Action원서가 출시(2006년 5월)된지 3년이나 지난 내용이라 일부 레퍼런스가 변경되고 삭제된 부분을 테스트하며 포스팅하다보니 스포일러처럼 되어버린거 같습니다. AIR in Action에는 훨씬 많은 내용과 유익한 내용이 많이 있습니다. 보시다 안되는 부분은 제 포스팅을 참고만 하여 주신다면 감사하겠습니다.
관련 커뮤니티 : http://cafe.naver.com/airinaction

Posted by 버터백통
AIR/HTML in AIR2009. 4. 17. 17:50

일반적으로 브라우저를 보면 이전과 다음으로 가는 커맨드 기능이 있다. 일반적인 Actionscript라면
javascript와 연동하여 기능을 구현할 수 있지만 AIR에서는 HTMLLoader에서 제공하고 있다.

* 히스토리 관련 메소드
HTMLLoader.historyBack() :
상대적으로 다음 URL로 이동
HTMLLoader.historyForward() : 상대적으로 이전 URL로 이동
HTMLLoader.historyGo( int ) : 지정된 단계 값만큼 이동
HTMLHistoryItem.getHistoryAt( uint ) : 지정된 위치의 값을 반환

참고)
http://www.asual.com/swfaddress/
나온지 좀 오래 되었지만 커맨드 기능을 구현한 SWFAddress라는 라이브러리를 사용하면 일반 웹SWF에서도 구현이 가능하다.

Posted by 버터백통
AIR/HTML in AIR2009. 4. 17. 17:01

콘텐츠 캐싱 사용 여부 설정
HTMLLoader.load()를 호출하기 전에 HTMLLoader.cacheResponse = true/false (true : 캐싱사용 , false : 캐싱사용 안함)
    
사용자 인증제어 : 서버에서 인증을 요구하여 특정 콘텐츠로의 접근 허용 여부
HTMLLoader.load()를 호출하기 전에 htmlLoader.authenticate = true/false (false를 설정하면 서버에서 인증 요구시 대화창을 띄우지 않는다.)
    
서버에서 웹콘텐트를 요청하는 애플리케이션을 user agent라 한다. user agent가 서버에 웹콘텐트를 요청할 때 자신의 정보를 같이 보낸다. HTMLLoader를 사용하여 이정보를 위장할 수 있다
(예로는 과거 IE가 네스케이프용 컨텐트로 접근하기 위해 "Mozilla/<version>"이라는 정보를 보낸 사례가 있다.)
htmlLoader.userAgent = 값 
    
쿠키설정하기
htmlLoader.manageCookies = true/false (true : 쿠키사용 , false : 쿠키 사용 안함)
    
각각의 모든 설정에 기본값으로 설정하기
htmlLoader.useCache = true/false ( true : 기본값으로 사용 , false : 기본값으로 사용하지 않기)
Posted by 버터백통
AIR/HTML in AIR2009. 4. 5. 14:25
AIR의 HTMLLoader를 사용하면 어도비의 PDF문서를 랜더링 할 수 있다.
사용법은 HTML문서를 불러들이는 것과 같이 간단하다.

var htmlLoader:HTMLLoader = new HTMLLoader();
htmlLoader.width = parent.stage.stageWidth;
htmlLoader.height = parent.stage.stageHeight;
htmlLoader.load( new URLRequest("./docs/FX_Web.pdf") )
addChild( htmlLoader );
Posted by 버터백통
AIR/HTML in AIR2009. 4. 5. 14:18

AIR에는 HTMLLoader()라는 클래스를 지원한다. 이를 인스턴스로 사용하여 렌더링할 페이지를 지정해주면 AIR를 이용하여 간단한 브라우저 정도는 만들수 있을 것이다.

HTMLLoader는 HTML과 PDF등을 렌더링 할 수 있게 하며 URL히스토리 기능을 지원하기 때문에 브라우저와 같은 커맨드기능을 구혈 할 수 있으며 자바스크립트 또한 연동이 가능하다...하지만 완전한 브라우저를 개발하기 위해서는 뭔가 2%아쉬움이 남는다.

[ URL 랜더링 ]
var htmlLoader:HTMLLoader = new HTMLLoader();
htmlLoader.width = parent.stage.stageWidth;
htmlLoader.height = parent.stage.stageHeight;
htmlLoader.load( new URLRequest("
http://www.naver.com") )
addChild( htmlLoader );


위와 같은 경우는 URL을 통해 웹페이지를 불러와 렌더링을 한 것이다.
두번째 경우는 아래 코드처럼 HTML 문자열을 사용하여 렌더링할 수 있다.

[ 문자열 랜더링 ]
 var htmlLoader:HTMLLoader = new HTMLLoader();

htmlLoader.width = parent.stage.stageWidth;
htmlLoader.height = parent.stage.stageHeight;
htmlLoader.loadString(
"<HTML><BODY>  <h1><a href=#>HTML In AIR</a></h1> </BODY></HTML>"
)
addChild( htmlLoader );


사용법은 간단하다 위처럼 속성을 설정하고 load를 호출하기만 하면 된다.
단 불러들인 HTML에 한글이 있는 경우 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
를 추가하여 캐릭터 셋을 맞추어준다.

Posted by 버터백통

데스크탑 어플리케이션을 만들다보면 네트워크 연결 유/무 상태를 체크하여야 한다. 가령 가계부라던가 메모보드라던가를 만들때는 웹에서 제공하는 DB를 읽어 들여야 하는데 이를 공지하거나 로컬DB에 저장하였다가 네트워크 연결시 DB를 업데이트 한다던가 하기위해 사용한다.

AIR에서는 URLMonitor()와 SocketMonitor()를 제공한다.
URLMonitor인 경우 등록된 도메인의 연결여부를 확일 할 수 있다.
//모니터링할 사이트 등록
_monitor  = new URLMonitor( new URLRequest("http://www.naver.com/") )
_monitor.addEventListener(StatusEvent.STATUS , statusHandler )
//1초에 한번씩 폴링
_monitor.pollInterval = 1000
//모니터링 시작
_monitor.start();

function statusHandler( e:StatusEvent ):void
{
    txt.text += "naver,com available? "+_monitor.available+"\n"
}
위의 코드는 네트워크의 연결상태를 1초마다 한번씩 체크하도록 폴링해보았다. 기본적으론 처음 한번과 이상시 이벤트가 발생한다. 그러나 웹 서버문제인 경우를 대비하여 폴링을 설정하는 경우가 필요하다.

import air.net.SocketMonitor;

private var _monitor:SocketMonitor;
private var _socket:Socket;
private var _timer:Timer;   
private const SERVER:String = "time-A.timefreq.bldrdoc.gov"
private const PORT:int = 13; 
   
private function init():void
{
    _monitor = new SocketMonitor(SERVER , PORT);
    _monitor.addEventListener( StatusEvent.STATUS , statusHandler );
    _monitor.start();
    
    _socket = new Socket();
    _socket.addEventListener( ProgressEvent.SOCKET_DATA , socketDataHandler );
    
    _timer = new Timer(1000);
    _timer.addEventListener(TimerEvent.TIMER , timerHandler );
}
   
private function statusHandler( e:StatusEvent ):void
{
    if(!_monitor.available){
     timeText.text = "Server unavailable."
     _timer.stop();
    }else{
     timerHandler();
     _timer.start();
    }
}
   
private function socketDataHandler( e:ProgressEvent ):void
{
    
//시간 읽어 오기
    var fullTime:String = _socket.readUTFBytes( _socket.bytesAvailable );
    var time:String = fullTime.split( " " )[2]
    timeText.text = "the current time(UTC) is : " + time;
    _socket.close();
}
   
private function timerHandler( e:TimerEvent = null ):void
{
    
//네트워크 상태 읽기
    if( _monitor.available && !_socket.connected ){
     _socket.connect(SERVER , PORT)
    }    
}

위의 코드는 포트 13번의 미국 표준 기술 연구소서버에서 시간을 읽어오는 소켓모니터링이다.
Posted by 버터백통
AIR/local SQL활용2009. 2. 15. 12:32

데이터베이스와 테이블 및 데이터 레코드가 정상적으로 있다면  SQLMode.READ를 통하여 DB에 접근하고 "SELECT 변수명 FROM 테이블명"을 통하여 데이터를 가져올 수 있다.

내문서에 B1TestDB로 접근하여 bookstore에 있는 모든 내용을 가져오는 코드
var file:File = File.documentsDirectory.resolvePath("B1TestDB.db");
var connection:SQLConnection = new SQLConnection();
var statement:SQLStatement = new SQLStatement();

connection.openAsync( file , SQLMode.READ );
connection.addEventListener( SQLEvent.OPEN  , onOpen );
statement.addEventListener(SQLEvent.RESULT , onPrint );

function onOpen( e:SQLEvent ):void
{
statement.text = "SELECT * FROM bookstore";
statement.execute();
}

function onPrint( e:SQLEvent ):void
{
//prt라는 텍스트필드에 출력
prt.text = "";
var result:SQLResult = statement.getResult();
for( var i:int=0; i<result.data.length; i++ ){
for( var str:String in result.data[i] ){
prt.text += str +" : "+ result.data[i][str] + "   ";
}
prt.text += "\n";
}
connection.close();
}

이 외에도 테이블 삭제나 기존 DB의 업데이트 등 몇 가지 기능들이 더 있으므로 아래링크를 참고하여 SQL문을 테스트하면 된다. 방법은 항상 접근-열기-편집-닫기와 같다.

커넥션은 한번에 한개씩만 사용가능하므로 여러개의 DB와 연동하기 위해서는 attach()를 사용하는 것이 바람직하다. 이는 SQLConnection은 많은 연산이 필요하므로 보통 한 개를 만들어 사용하기 때문이다.또한 DB작업시에는 begin()rollback(), commit()등의 트랜젝션을 사용하는 것이 바람직하다.

참고) SQL명령문
Posted by 버터백통
AIR/local SQL활용2009. 2. 15. 12:17


앞서 DB와 DBTable을 만들었으면 AIR에서 입력받은 데이터를 저장해야 한다. 방법은 앞서정리한 DB객체 프로세스와 동일하다. 다만 SQL문만 달라질 뿐이다.

이번에는 내문서에 B1TestDB를 만들고 책관련 DB인 bookstore가 있다는 가정하에 아래와 같이 정리한다.
var file:File = File.documentsDirectory.resolvePath("B1TestDB.db");
var connection:SQLConnection = new SQLConnection();
var statement:SQLStatement = new SQLStatement();

//UPDATE는 기존 DBTable을 편집하기위해서 사용한다.
connection.openAsync( file , SQLMode.UPDATE );
statement.sqlConnection = connection;
connection.addEventListener( SQLEvent.OPEN , open );

function open( e:SQLEvent ):void
{
아래처럼 E4X문법( @ , : )을 사용하여 공간을 할당하고 이후 [] 연산자를 사용하여 값을 동적으로 대입하는 것이 효과적이다.  이유는 명령문이 실행시 마다 문법이 다르면 AIR는 재컴파일하는데  아래처럼 최초 한번만 정의하면 값이 달라져 문장이 틀려도 재컴파일 하는 경우가 없어 효율적이다.
statement.text = "INSERT INTO bookstore( title, publisher, introduction ) VALUES( @title, @publisher, @introduction )";

//AIR에서 입력받은 변수값을 대입한다.
statement.parameters["@title"] = titleField.text
statement.parameters["@publisher"] = pubField.text
statement.parameters["@introduction"] = introField.text
statement.execute( -1 , new Responder( insertSuccess , insertFault )  );
    
//사용한 파라미터 제거
statement.clearParameters()
}

//사용한 DB커넥션 종료
function insertSuccess():void
{
connection.close();
}

참고) SQL명령문

Posted by 버터백통
AIR/local SQL활용2009. 2. 15. 11:49

AIR에서는 SQLLite엔진을 제공하고 있다. 따라서 로컬상에 DB를 기록하거나 가져오거나 편집이 가능하며 프로세스도 다른 서버사이드 언어와 마찬가지로 접근-열기-편집-닫기와 같다.

[ DB를 활용하기위한 객체 프로세스 ]
1 : File을 설정하여 사용할 DB로 경로설정
2 : SQLConnection을 사용하여 경로상의 DB오픈 - open()/openAsysc()
3 : SQLStatement를 사용하여 쿼리전송(DB작업) - excute() / next()
4 : SQLConnection.close() 를 통해 작업후 DB를 닫아준다.
   
[관련이벤트]
SQLEvent : SQLConnection 또는 SQLStatement 인스턴스에서 수행된 작업 이벤트

[ 내문서에 DBTest데이터를 만들고 testDB테이블을 만든다 ]
SQL쿼리문중에 CREATE TABLE을 이용하여 로컬에 데이터를 만들어 본다.
var file:File = File.documentsDirectory.resolvePath("DBTest.db");    //경로 설정
var connection:SQLConnection = new SQLConnection();         //DB연결
var statement:SQLStatement = new SQLStatement();           //DB관리

//DB연결자에 경로와 모드설정
connection.openAsync( file , SQLMode.CREATE );    
[ SQLMode ]
SQLMode에는 3개가 있다.
- CREATE : 업데이트를 위해 연결이 열리고 지정한 파일이 없는 경우 데이터베이스 파일을 만든다는 것을
                    나타냅니다.
- READ: 연결이 읽기 전용 모드로 열린다는 것을 나타냅니다.
- UPDATE : 업데이트를 위해 연결이 열리지만 지정한 파일이 없는 경우 새 데이터베이스 파일을 만들지
                   않는다는 것을 나타냅니다.


//DB연결 이벤트
connection.addEventListener( SQLEvent.OPEN , onOpen );  
    
//SQL관리자에 연결자등록
statement.sqlConnection = connection;        
statement.addEventListener( SQLEvent.RESULT , onResult );
     
//SQL 오픈
function onOpen( e:SQLEvent ):void
{
//만약 testDB이 없으면 새로운 테이블을 생성하라..
statement.text = "CREATE TABLE IF NOT EXISTS testDB(" +
       "no INTEGER PRIMARY KEY AUTOINCREMENT," +
       "name VARCHAR," +
       "date DATE," +
       "content TEXT" +
       ")";
       
//-1은 모든 데이터의 결과를 반환 받는다.
statement.execute();
}
    
//SQL실행 후 연결자 종료
function onResult( e:SQLEvent ):void
{
connection.close()
}

참고) SQL명령문
Posted by 버터백통

드래그 매니저를 활용하면 드래그와 드랍 또는 드랍허용 등을 관리 할 수 있다. 보통 AIR 어플리케이션 내부에서 클릭 드래그 할 때에 해당 객체나 작업 데이터를 클립보드에 저장하여 드랍시 활용하도록 하기 위해서는 NativeDragManager.doDrag( InteractiveObject, Clipboard , 비트맵데이터... )을 사용한다.
또한 시스템이나 AIR내부의 객체를 AIR내부의 드랍 가능영역을 지정하여 드랍 허용을 하기 위해서는 NativeDragManager.acceptDragDrop( 드랍대상:InteractiveObject )을 사용한다.

보통 드래그 작업을 시작하려면 아래의 순서와 같다.
[ 드래그 작업 순서 ]
1 새 Clipboard 객체를 만듭니다.
2 하나 이상의 형식으로 전송될 데이터를 클립보드에 추가합니다.
3 드래그 동안 프록시 이미지로 사용될 BitmapData 객체를 doDrag에 만들어 선언할 수도 있습니다.
4 이 작업에서 허용되는 액션을 제한하는 NativeDragOptions 객체를 만들 수도 있습니다. allowedActions 매개 변수를 null로 남겨 두면 모든 액션이 허용됩니다.
5 NativeDragManager.doDrag()를 호출합니다.


[ 드래그 시작 객체 프로세스 ]
1 doDrag() 메서드를 호출한 후에 nativeDragStart 이벤트발생
2 드래그가 진행 중인 동안에는 nativeDragStart 이벤트발생
3 사용자가 마우스를 놓아서 드랍 할 때에는 nativeDragComplete 이벤트를 전달

[ 드랍 시 프로세스 ]
nativeDragComplete 이벤트의 핸들러는 이벤트의 dropAction 속성을 확인하여 드래그 앤 드롭 작업이 완료되었는지를 결정할 수 있으며, dropActionNativeDragActions.NONE인 경우에는 드래그한 항목이 드롭 가능한 대상에 드롭되지 않은 것입니다.

doDrag() 은 mouseDown 또는 mouseMove 이벤트 핸들러 내에서만 호출할 수 있습니다.
mouseMove 이벤트에 대한 응답으로 호출된 경우에는 마우스 버튼도 눌러진 상태여야 합니다.

Posted by 버터백통


드래그 드랍은 기본적으로 복사해서 붙여넣기와 많은 부분이 동일하다. 드래그 앤 드랍은 다음의 작업들로 이루어 진다.
1 클릭(사용자의 작업이 시작)
2 전송할 데이터를 클립보드에 저장
3 드래그(붙여 넣을 위치 지정)
4 드랍(적절한 위치가 결정되면 클립보드에서 데이터를 읽어 온다)

[ 드래그 앤 드랍 프로세스 ]
initiator -> drop target -> 드랍 가능여부 판단 -> drop -> 가능여부에 따라 액션스크립트 코드 처리

드래그 드랍을 이용하려면 드래그 매니저를 활용하여 이미 잘 정의된 메서드를 이용하는 것이 능률적이다.
또한 드래그 드랍은 단순히 startDrag와는 달리 대상의 데이터를 읽어와 어떠한 처리를 하여야 한다. 물론 AS3 기반내의 클래스 처리도 가능하지만 AIR 클립보드를 사용하여 데이터를 저장하고 읽어오며, 여러개의 어플리케이션이나 네이티브 윈도우에서 상호 드래그앤드랍이 가능해진다.  

AIR 에서 드래그 드랍을 지원하는 클래스는  다음과 같다.
NativeDragManager : 드래그 시작와 허용 등 드래그 앤 드롭 작업을 조정

[ Public 속성 ]
dragInitiator : InteractiveObject

[정적] [읽기 전용] 드래그 작업을 시작한 NativeDragManager.doDrag() 호출에 전달된 대화형 객체입니다.
dropAction : String
[정적] 드롭 대상에 의해 지정된 드래그 액션입니다.
isDragging : Boolean
[정적] [읽기 전용] 드래그 작업이 현재 진행 중인지 여부를 보고합니다.


NativeDragEvent : 드래그 관련 이벤트

[ Public 속성 ]

allowedActions : NativeDragOptions

이 드래그 작업을 시작한 표시 객체에 의해 허용되는 액션을 지정하는 NativeDragOptions 객체입니다. 
clipboard : Clipboard
이 드래그 작업 내의 데이터가 포함되어 있는 Clipboard 객체입니다.
dropAction : String
현재 액션입니다.

[ Public 메서드 ]
NativeDragEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = true, localX:Number = NaN, localY:Number = NaN, relatedObject:InteractiveObject = null, clipboard:Clipboard = null, allowedActions:NativeDragOptions = null, dropAction:String = null, controlKey:Boolean = false, altKey:Boolean = false, shiftKey:Boolean = false, commandKey:Boolean = false)
기본 드래그 앤 드롭 이벤트와 관련된 특정 정보를 갖는 Event 객체를 만듭니다. 
clone():Event
NativeDragEvent 객체의 복사본을 만듭니다.
toString():String
이 NativeDragEvent 객체의 속성을 문자열 형식으로 만듭니다.

[ Public 상수 ]
NATIVE_DRAG_COMPLETE : String = "nativeDragComplete"

[정적] NativeDragEvent.NATIVE_DRAG_COMPLETE는 nativeDragComplete 이벤트 객체의 type 속성 값을 정의합니다. 
NATIVE_DRAG_DROP : String = "nativeDragDrop"
[정적] NativeDragEvent.NATIVE_DRAG_DROP은 nativeDragDrop 이벤트 객체의 type 속성 값을 정의합니다. 
NATIVE_DRAG_ENTER : String = "nativeDragEnter"
[정적] NativeDragEvent.NATIVE_DRAG_ENTER는 nativeDragEnter 이벤트 객체의 type 속성 값을 정의합니다.
NATIVE_DRAG_EXIT : String = "nativeDragExit"
[정적] NativeDragEvent.NATIVE_DRAG_EXIT는 nativeDragExit 이벤트 객체의 type 속성 값을 정의합니다.
NATIVE_DRAG_OVER : String = "nativeDragOver"
[정적] NativeDragEvent.NATIVE_DRAG_OVER는 nativeDragOver 이벤트 객체의 type 속성 값을 정의합니다. 
NATIVE_DRAG_START : String = "nativeDragStart"
[정적] NativeDragEvent.NATIVE_DRAG_START는 nativeDragStart 이벤트 객체의 type 속성 값을 정의합니다. 
NATIVE_DRAG_UPDATE : String = "nativeDragUpdate"
[정적] NativeDragEvent.NATIVE_DRAG_UPDATE는 nativeDragUpdate 이벤트 객체의 type 속성 값을 정의합니다.

NativeDragActions : 드래그 앤 드롭 액션의 이름에 대한 문자열 상수를 정의

[ Public 속성 ]
COPY : String = "copy"
[정적] 복사 액션에 사용할 문자열을 정의합니다. 
LINK : String = "link"
[정적] 링크 액션에 사용할 문자열을 정의합니다. 
MOVE : String = "move"
[정적] 이동 액션에 사용할 문자열을 정의합니다. 
NONE : String = "none"
[정적] 지정된 액션이 없을 경우 사용할 문자열을 정의합니다.

NativeDragOptions : 드래그 작업의 소스에 의해 허용되는 드래그 앤 드롭 액션을 지정

[ Public 속성 ]
allowCopy : Boolean = true
드롭 대상은 드래그된 데이터를 복사할 수 있습니다.
allowLink : Boolean = true
드롭 대상은 드래그된 데이터에 대한 링크를 만들 수 있습니다.
allowMove : Boolean = true
드롭 대상은 드래그된 데이터를 이동할 수 있습니다.

Posted by 버터백통

일반적으로 데이터 요청이 있을 때 바로 데이터를 클립보드에 사용하는데 복사 후 붙이는 과정에서 붙이기 전의 내용이 바뀌면 바뀌기 이전의 데이터를 사용하게 된다. 따라서 클립보드에서 데이터를 가져올 때 데이터의 레퍼런스만 정의하고 실제 붙이기할 때는 복사 이후 내용이 변경되었으면 변경된 데이터를 가져오게 처리를 하여야하는데 이것을 지연 렌더링이라고 한다. AIR에서는 setDataHandler( 클립보드포맷 , 대상데이터 )라는 메서드를 제공하는데 이를 사용하여 업데이트되는 데이터를 가져올 수 있도록 한다.

Posted by 버터백통
클립보드는 기본적으로 3가지 경우에서 사용이 된다.
1 동일 AIR 어플리케이션 안에서 데이터를 전송
2 2개 이상의 AIR 어플리케이션 사이에서 데이터를 전송하는 경우
3 AIR 어플리케이션과 시스템 또는 다른 응용프로그램 사이에서 데이터를 전송하는 경우


위와 같은 경우에서 2번 째와 3번 째의 경우에는 데이터의 복사본이 필요하다. 가령 어떠한 텍스트 내용을 AIR에서 워드나 한글 같은 경우 직접 데이터를 읽을 수 없기 때문에 데이터 복사본과 레퍼런스를 함께 저장하여야 한다.

setData()에서 3번째 파라미터인 직렬화(serializable)에 의해 자동으로 직렬화 저장(true)으로 설정된다. 값이 true이면 복사본과 레퍼런스가 저장되고 false이면 레퍼런스만 저장된다. 이 경우에는 데이터를 직렬화 하지 않고 복사하지도 않는 경우에서만 사용하여야 한다. 즉 단일 AIR 어플리케이션  내부에서만 사용하면 된다.

getData()에서는 원하는 방식으로 데이터를 받을 수 있다. 이 경우에는 두번 째 파라미터인 transferMode를 설정하여야 한다. 지원되는 전송 모드에는 4가지가 있으며 이들은 ClipboardTransferMode에 상수로 설정되어있다.

ClipboardTransferMode.CLONE_ONLY 
사용 가능한 경우 복사본이 반환된다. 복사본을 사용할 수 없을시에는 null이 반환

ClipboardTransferMode.CLONE_PREFERRED  
사용 가능한 경우 복사본이 반환된다. 복사본을 사용할 수 없을시에는 레퍼런스를 반환

ClipboardTransferMode.ORIGINAL_ONLY  
사용 가능한 경우 원본 데이터에 대한 레퍼런스를 반환, 원본 레퍼런스를 사용 할 수 없을시에는 null을 반환

ClipboardTransferMode.ORIGINAL_PREFERRED 
사용 가능한 경우 원본 데이터에 대한 레퍼런스를 반환, 원본 레퍼런스를 사용 할 수 없을시에는 복사본을 반환 (기본 설정 값)

참고) 전송 모드는 클립보드에 들어 있는 객체에 액세스할 때 참조를 반환할 것인지 아니면 복사본을 반환할 것인지에 대한 힌트를 제공한다

참고) 직렬화(serializable)란 객체의 내용을 바이트 단위로 자동 변환하여 저장/복원하거나 네트워크 등 전송 할 수 있도록 지원하는 기능이다. 단 멤버변수의 메모리만으로 구성되므로 메서드나 생성자는 직렬화에서 제외 된다.
이는 자바 1.1에서 도입 되었는데 원격통신이나 강태정보의 저장시 직렬화된 데이터를 사용하면 편하기 때문이고 AS3는 자바의 영향을 많이 받은 언어이므로 자바의 serializable를 그대로 지원한다.

Posted by 버터백통

대부분의 OS에는 임시저장 공간과 같은 Clipboard라는 것이 있다..이 클립보드를 활용하여 복사,잘라붙이기나 화면 캡쳐시 이미지가 임시 저장되는 공간으로 활용된다.
AIR에서는 위와 같은 시스템 클립보드와 AIR내부에서 지원하는 클립보드를 제공하고 있으며 이 둘을 모두 같은 클래스( flash.desktop.Clipboard )에서 취급한다.

[ 클립보드의 주된 기능 ]
1 데이터 추가 : Clipboard.setData(데이터 포맷 , 저장할 데이터)
2 데이터 읽기 : Clipboard.getData(데이터 포맷)
3 데이터 제거 : Clipboard.clearData(데이터 포맷) / Clipboard.clear()->모든 내용을 제거


[ 클립보드 데이터 포맷 ]
BITMAP_FORMAT : String = "air:bitmap"
[정적] 비트맵 이미지 데이터입니다(AIR만 해당).
 
FILE_LIST_FORMAT : String = "air:file list"
[정적] 파일의 배열입니다(AIR만 해당).

HTML_FORMAT : String = "air:html"
[정적] HTML 문자열 데이터입니다.

RICH_TEXT_FORMAT : String = "air:rtf"
[정적] 서식 있는 형식의 데이터입니다. ByteArray 반환

TEXT_FORMAT : String = "air:text"
[정적] 문자열 데이터입니다.

URL_FORMAT : String = "air:url"
[정적] URL 문자열입니다(AIR만 해당).

AIR의 클립도브를 사용할때는 new Clipboard(); 선언하여 사용한다.
시스템 클리보드가 아니므로 ctrl+v등을 사용하여 붙이기 등 시스템 전역적으로 사용하기 힘들다.
또한 Clipboard로 선언된 객체에만 저장이 되며 새로운 클립보드를 선언하여 데이터를 불러오면 null로 인식한다.

시스템 클립도브를 사용할때는 Clipboard.generalClipboard를 선언하여 사용한다.
시스템 클립보드이므로 전역적으로 사용가능하며 ctrl+c , ctrl+v등과 같이 사용이 가능하며  
Clipboard.generalClipboard는 시스템의 유일한 객체로 싱글턴 형태로 접근한다.

Posted by 버터백통
AIR/파일시스템 연동2008. 12. 24. 15:50


AIR에는 EncryptedLocalStore라는 암호화된 로컬 데이터 스토리지(저장소)에서 객체를 설정하고 가져오기 위한 메서드를 제공한다. 즉 사용자별로 분리된 보안 스토리지 영역을 할당 받아 사용 할 수 있는 것이다.
EncryptedLocalStore를 통해 보안 스토리지에 저장되는 모든 데이터는 AES-CBC 128비트 암호화 알고리즘을 사용하며 작업시 암호화/복호화는 모두 EncryptedLocalStore가 알아서 처리한다.

암호화된 보안 스토리지 영역에 저장되는 데이터들은 유니크한 Key에 의해 식별되며 이 키는 데이터를 가져오기 위해 사용하는 문자열에 해당된다.

[ Public 메서드 ]
getItem(name:String):ByteArray
[정적] 암호화된 로컬 저장소에서 지정한 이름의 항목에 대한 데이터를 반환합니다.

setItem(name:String, data:ByteArray, stronglyBound:Boolean = false):void
[정적] 지정된 이름의 항목을 제공된 ByteArray 데이터로 설정하여 저장합니다.

removeItem(name:String):void
[정적] 암호화된 로컬 저장소에서 지정된 이름의 항목을 제거합니다.

reset():void
[정적] 암호화된 로컬 저장소 전체를 지우고 모든 데이터를 삭제합니다.

Posted by 버터백통
AIR/파일시스템 연동2008. 12. 23. 11:01


AS3의 가장 큰 장점중에 하나는 지금껏 AS에서 지원이 불가능했던 low level작업이 가능한 점이다. 이는 AS3와 AIR를 통하여 바이너리 데이터를 직접 만들거나 수정 또는 zip알고리즘과 jpg와 png등 이미지 처리 알고리즘을 제공함과 동시에 기타 doc와 ppt... 등 파일 형태만 알고 있다면 모든 파일을 직접 만들 수 있기 때문이다.
이와 같은 작업을 가능케하는 것이 IDataInput, IDataOutput 인터페이스를 구현한 ByteArray라는 클래스이다. 또는 flash.netURLStream(IDataInput만 구현)과 URLLoader를 사용하여도 바이너리 데이터로 접근(만) 할  수 있다.

   - ByteArray는 읽고 쓰기가 모두 가능한 바이너리 관리 전용 클래스이다.
   - URLLoader인 경우에는 바이트배열에 특화되진 않았다. data를 모두 받은 후에 접근 하여 관리한다. 
   - URLStream는 delegator에서 직접 바이트 배열을 읽을 수 있지만 IDataInput만 구현하여 기록은 불가능 하다.
     data를 받는 중에도 접근 가능하다.


ByteArray는 기본적인 바이너리 데이터를 기록하거나 읽기 위한 기본적인 클래스이며 외부 파일데이터를 가져오는 통신 클래스에서는 URLStream를 사용한다. AIR에서는 앞서 살펴본 FileStream(IDataInput, IDataOutput 인터페이스를 구현)를 사용한다.

FileStream은 ByteArray처럼 읽고 쓰기가 모두 가능한 클래스 이다. 따라서 AIR에서는 FileStream만으로 파일을 읽어 들여와 기록까지 가능해 졌다. 복잡한 바이너리 작업이라면 ByteArray를 활용하면 중간에 벌어진 틈을 부드럽게 처리 할 수 있을 것이다.


IDataInput, IDataOutput를 구현한 ByteArray 속성과 메서드 *

[ Public 속성 ]

bytesAvailable : uint
[읽기 전용] 바이트 배열의 현재 위치에서 배열 끝까지 읽을 수 있는 데이터 바이트 수입니다.

defaultObjectEncoding : uint
[정적] 새 ByteArray 인스턴스에 사용할 ByteArray 클래스의 기본 객체 인코딩을 나타냅니다.

endian : String
데이터의 바이트 순서를 Endian.BIG_ENDIAN 또는 Endian.LITTLE_ENDIAN으로 변경하거나 읽습니다.

length : uint
ByteArray 객체의 바이트 단위 길이입니다.

objectEncoding : uint
ByteArray 인스턴스에서 쓰거나 읽을 때 ActionScript 3.0, ActionScript 2.0 또는 ActionScript 1.0 형식을 사용할지 여부를 확인하는 데 사용합니다.

position : uint
ByteArray 객체에 대한 파일 포인터의 현재 위치를 바이트 단위로 옮기거나 반환합니다.

[ Public 메서드 ]
ByteArray()
이 클래스의 메서드와 속성을 사용하여 데이터 저장소 및 스트림을 최적화할 수 있도록 압축된 바이트 배열을 나타내는 ByteArray 인스턴스를 만듭니다.

clear():void
바이트 배열의 내용을 지우고 길이 및 위치 속성을 0으로 재설정합니다.

compress(algorithm:String):void
바이트 배열을 압축합니다.

deflate():void
DEFLATE 압축 알고리즘을 사용하여 바이트 배열을 압축합니다.

inflate():void
바이트 배열의 압축을 해제합니다.

readBoolean():Boolean
바이트 스트림에서 부울 값을 읽습니다.
포맷타입 : Boolean
포맷 : Boolean
0인 경우 false , 기타인 경우 true

readByte():int
바이트 스트림에서 부호 있는 바이트를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
바이트 스트림에서 length 매개 변수로 지정된 데이터 바이트 수를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readDouble():Number
바이트 스트림에서 IEEE 754 배정밀도 64비트 부동 소수점 숫자를 읽습니다.
포맷타입 :  숫자
포맷 : Double
Double-precision 64비트 부동 소수점 수

readFloat():Number
바이트 스트림에서 IEEE 754 단정밀도 32비트 부동 소수점 숫자를 읽습니다.
포맷타입 :  숫자
포맷 : Float
Single-precision 32비트 부동 소수점 수


readInt():int
바이트 스트림에서 부호 있는 32비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Integer

readMultiByte(length:uint, charSet:String):String
지정된 문자 세트를 사용하여 바이트 스트림에서 지정된 길이의 멀티바이트 문자열을 읽습니다.
포맷타입 :  문자열
포맷 : Multibyte
디폴트 시스템 코드페이지 사용하지 않고 특정 문자 세트 사용

readObject():*
바이트 배열에서 AMF 직렬 형식으로 인코딩된 객체를 읽습니다.
포맷타입 :  객체
포맷 : Object
AMF를 사용한 직렬화/역직렬화된 객체

readShort():int
바이트 스트림에서 부호 있는 16비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

readUnsignedByte():uint
바이트 스트림에서 부호 없는 바이트를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readUnsignedInt():uint
바이트 스트림에서 부호 없는 32비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Integer
32비트정수

readUnsignedShort():uint
바이트 스트림에서 부호 없는 16비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

readUTF():String
바이트 스트림에서 UTF-8 문자열을 읽습니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

readUTFBytes(length:uint):String
바이트 스트림에서 length 매개 변수에 지정된 길이의 UTF-8 바이트 시퀀스를 읽고 문자열을 반환합니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

toString():String
바이트 배열을 문자열로 변환합니다.

uncompress(algorithm:String):void
바이트 배열의 압축을 해제합니다.

writeBoolean(value:Boolean):void
부울 값을 씁니다.
포맷타입 : Boolean
포맷 : Boolean
0인 경우 false , 기타인 경우 true

writeByte(value:int):void
바이트 스트림에 바이트를 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
지정된 바이트 배열 bytes에서 offset(0부터 시작하는 인덱스)부터 시작하여 length만큼의 바이트 시퀀스를 데이터 스트림에 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeDouble(value:Number):void
바이트 스트림에 IEEE 754 배정밀도 64비트 부동 소수점 숫자를 씁니다.
포맷타입 :  숫자
포맷 : Double
Double-precision 64비트 부동 소수점 수

writeFloat(value:Number):void
바이트 스트림에 IEEE 754 단정밀도 32비트 부동 소수점 숫자를 씁니다.
포맷타입 :  숫자
포맷 : Float
Single-precision 32비트 부동 소수점 수

writeInt(value:int):void
바이트 스트림에 부호 있는 32비트 정수를 씁니다.
포맷타입 :  숫자
포맷 : Integer

writeMultiByte(value:String, charSet:String):void
지정된 문자 세트를 사용하여 멀티바이트 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : Multibyte
디폴트 시스템 코드페이지 사용하지 않고 특정 문자 세트 사용

writeObject(object:*):void
객체를 바이트 배열에 AMF 직렬 형식으로 씁니다.
포맷타입 :  객체
포맷 : Object
AMF를 사용한 직렬화/역직렬화된 객체

writeShort(value:int):void
바이트 스트림에 16비트 정수를 씁니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

writeUnsignedInt(value:uint):void
바이트 스트림에 부호 없는 32비트 정수를 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeUTF(value:String):void
UTF-8 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

writeUTFBytes(value:String):void
UTF-8 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

통상적으로 IDataInput와 IDataOutput 인터페이스는 바이트 데이터를 관리하는 속성과 메서드를 선언하였으므로 이를 구현한 ByteArray와 FileStream을 이용하면 간단하게 데이터 읽기와 기록이 가능하다.
읽고 쓰기 작업시에 유효 바이트의 길이를 넘지 않기 위해 bytesAvailable속성을 이용하여 현재 위치에서 데이터 끝까지의 데이터 수를 읽어와 길이를 자르거나 필요한 만큼 읽어오며 작업을 하며, 현재 위치를 이동하거나 읽어오는 position속성과 함께 사용한다. 바로 이 둘( bytesAvailable , position )이 리드버퍼를 이용하는 속성이다.

리드버퍼란 바이트 묶음으로 구성된 컨테이너 정도라고 정의하면 된다. 데이터가 읽을 수 있는 상태가 되면 데이터는 이러한 리드 버퍼 안으로 들어오게 된다. 실제로 위의 readXXX() 메서드들은 리드버퍼의 데이터를 읽어 오는 것이며 open(동기)을 사용하면 리드버퍼에 데이터를 모두 담은 상태에서 데이터에 접근이 가능해지며 동기적 작업에서는 데이터의 모든 바이트를 바로 읽을 수 있기 때문에 사용가능한 유효 바이트를 초과하는 경우가 거의 없지만 openAsync(비동기)를 사용하면 리드버퍼에 데이터는 읽혀짐과 동시에 삭제가 되므로 다른 ByteArray의 delegator에 저장한 다음 작업하여야 한다.


참고) 1 바이트는 256가지 값의 표현이 가능하다. 1bit는 0,1로 2개의 값을 표현하고 이것이 모여 8bit(2^8)가 1바이트가 된다. 8비트는 2의 8승이며 0부터 255까지의 값을 표현 할 수 있다.

참고)
**** 오브젝트 인코딩 데이터 : AMF ****
ObjectEncoding 클래스는 객체를 직렬화하는 클래스(예: NetStream, NetConnection, SharedObject 및 ByteArray)가 이전 버전의 ActionScript와 작동할 수 있도록 합니다. 
객체 인코딩은 객체가 AMF(Action Message Format)에서 표현되는 방식을 제어합니다.
Flash Player는 AMF를 사용하여 Flash 응용 프로그램과 원격 서버 간의 효율적인 통신을 가능하게 합니다.
AMF는 원격 프로시저 호출을 압축된 이진 표현으로 인코딩하여 Flash Media Server에서 사용되는 HTTP/HTTPS 또는 RTMP/RTMPS 프로토콜을 통해 전송될 수 있도록 합니다.
ActionScript 객체 및 데이터 값은 이진 형식으로 직렬화됩니다.
이것은 일반적으로 XML 등과 같은 표현보다 더 압축된 형식입니다.
    
Flash Player 9는 AMF3 및 AMF0의 두 가지 다른 형식으로 직렬화할 수 있습니다.
AMF3은 ActionScript 3.0에서 사용되는 기본 직렬화로 ActionScript 1.0 및 2.0에서 사용되는 AMF0보다 다양한 장점을 제공합니다. AMF3은 AMF0보다 네트워크를 통해 더 효율적으로 데이트를 전송합니다.
또한, int 및 uint 객체를 정수로 전송하는 것을 지원하며, ByteArray, XML 및 IExternalizable 등 ActionScript 3.0에서만 사용 가능한 데이터 유형을 지원합니다. 이것은 ActionScript 3.0 및 Flex 2와 같은 AMF3 인코딩을 사용하는 서버에서만 사용할 수 있습니다.

ByteArray, NetConnection, NetStream, SharedObject, Socket 및 URLStream 클래스에는 ObjectEncoding 클래스로부터 상수가 할당되는 objectEncoding 속성이 포함되어 있습니다. objectEncoding 속성의 비헤이비어는 객체에 따라 달라집니다.

참고) endian자료 보기
Posted by 버터백통
AIR/파일시스템 연동2008. 12. 22. 18:43

AIR의 가장 큰 장점은 AS기반의 언어에서 구사하지 못하였던 로컬 디렉토리나 파일을 읽고 기록할 수 있다는 것이다. 물론 player10에서는 FileReference가 확장되어 이와 같은 작업이 가능하여 웹어플리케이션에서도 확장 가능하지만 AIR처럼 데스크탑 관리에 유연하지는 않다.

파일을 관리하기 위해서는  File클래스 외에 FileStream()클래스가 필요하다.
FileStream()은 파일을 읽기 및 쓰기에 사용되며 open() 메서드를 호출하여 동기적으로 열거나 openAsync() 메서드를 호출하여 비동기적으로 열 수 있다.
File에 의하여 경로를 설정한 delegator를 open( File객체 , FileMode )에서 1번 파라미터로 사용하고 FileMode를 사용하여 읽기,쓰기,추가,갱신 등의 옵션을 사용하여 작업한다.

FileMode 상수 읽기 작성 만들기 열 때 잘라내기 작성된 데이터 추가
READ
WRITE
APPEND
UPDATE

  • 읽기 - FileStream 객체가 파일에서 데이터를 읽어올 수 있습니다.
  • 작성 - FileStream 객체가 파일에 데이터를 작성할 수 있습니다.
  • 만들기 - FileStream 객체가 파일을 열 때 존재하지 않는 파일을 만듭니다.
  • 열 때 잘라내기 - 파일을 열 때 파일에 있는 데이터가 데이터를 쓰기 전에 삭제됩니다.
  • 작성된 데이터 추가 - write 메서드가 호출될 때 데이터가 항상 파일 끝에 기록됩니다.

    표를 쉽게 설명하면 READ는 파일의 바이너리 데이터를 읽어오는 목적으로 사용되며 WRITE는 기록을 위해 불러온다 단 기존의 모든 데이터는 제거되며 기존에 없는 파일일 경우에는 새로 생성된다. APPEND는  기존 바이트 배열의 제일 끝 부분부터 바이트 데이터를 추가 할 수 있으며 UPDATE 는 이전 데이터를 버리지 않으면서 바이트 배열의 어느 position으로든 접근하여 바이트 데이터를 기록 할 수 있다.

    이처럼 FileMode를 선택하여 필요한 작업을 마친 다음에는 언제나 close()를 호출하여 스트림을 닫아주어야 한다. 이는 열려있는 중에 같은 파일을 수정하거나 삭제 등을 하려할 때 시도되지 않는다.

    이처럼 File클래스를 사용하여 경로를 지정하면 FileStream을 사용하여 데이터를 기록하거나 읽어올 수 있다.
    private var file:File;
    private var count:int = 1;
    private function make():void
    {
       //저장할 경로와 이름설정
       file = File.desktopDirectory.resolvePath("test"  + count + ".txt");
       
       //파일저장과 저장형식 설정
       var stream:FileStream = new FileStream();
       stream.open(file , FileMode.WRITE );
       stream.writeMultiByte("저장되는 파일" + count , "UTF-8");
       stream.close();
       count++;
    }

    위의 코드를 실행하면 바탕화면에 test번호.txt를 만들며 텍스트문서의 내용은 "저장되는 파일+count번호"라고 저장된다.

    이처럼 파일포맷을 알면 text문서든 이미지 파일이건 심지어 영상물이나 ppt등을 만들 수 있다. 바이터 배열은 단순히 0과1의 조합으로(실제로는 16진수로 길이를 줄여서 표현) 관련 어플리케이션이 해석만 가능하다면 어떠한 포맷으로든 만들 수 있다.

  • Posted by 버터백통
    AIR/파일시스템 연동2008. 12. 22. 18:42

    앞서 File클래스의 경로에 포함된 디렉토리를 만들거나 삭제하는 방법과 파일을 삭제 하는 방법을 살펴 보았다. 이번에는 파일과 디렉토리를 복사하여 이동하거나 잘라 붙이기를 하는 방법을 살펴본다

    OS시스템에서 파일이나 디렉토리를 우클릭하면 "복사" 메뉴와 "잘라내기" 메뉴가 있다. 이 둘의 차이점은 원본을 남겨 놓는가와 원본을 삭제하는가의 차이이다. AIR에서도 이와 같은 기능을 File에서 제공하는데 copyTo() , copyAsync() , moveTo() , moveToAsync()가 있다.

    1 파일이나 폴더를 복사
    copyTo() , copyToAsync( destination , 덮어쓰기 여부 )를 사용한다.


    2 파일이나 폴더를 이동
    moveTo() , moveToAsync( destination , 덮어쓰기 여부 )를 사용한다.
    각 메서드에서 내용을 덮어쓰는 여부는 부울값으로 true는 기존의 내용을 모두 삭제하고 새로운 내용으로 교체를 한다. false는 기존의 내용을 남겨둔다.

    마찬가지로 대상에 Lock이 걸려있는 경우에는 IO에러를 발생한다.
    Posted by 버터백통
    AIR/파일시스템 연동2008. 12. 9. 19:15

    AIR는 데스탑 어플리케이션이므로 로컬 PC에 폴더를 만들거나 삭제 등이 자유로워야 합니다. 마찬가지로 File()클래스에서 이모든 것을 제공한다. AIR의 주요 기능은 대부분 FIle클래스를 통해 사용한다.

    * 디렉토리 만들기
    File에서 설정된 경로에 "My Test"라는 폴더를 만들고자 한다면 resolvePath("My Test")으로 경로를 설정하고
    delegator에 createDirectory()를 호출하면 된다.

    * 임시 디렉토리 만들기
    runtime시 사용자 컴퓨터에 임시의 디렉토리를 생성하여 작업이 필요할 때가 있다.
    그런 경우 createTempDirectory()를 사용하면  C:\Documents and Settings\Administrator\Local Settings\Temp에 임시 fla번호.tmp 폴더가 생성되어 디렉토리에 기록할 수 있다.

    * 디렉토리 영구 삭제하기
    폴더를 지울때 deleteDirectory() , deleteDirectoryAsync()를 호출한다. 지워진 폴더는 영구 삭제된다.
    괄호안에 매개변수는 안에 파일을 지울것인지 아닌지를 설정하는데 기본값은 false이다.
    기본값에서 만약 폴더내부에 파일이나 폴더가 있거나 대상 폴더가 없는 경우에는 IO에러를 발생한다.
        - deleteDirectory() / deleteDirectoryAsync()의 매개변수
           true : 지정 폴더하부의 모든 내용을 삭제한다.
           false : 지정폴더 내부에 내용을 삭제하지 않는다(내용이 있을 경우 IO에러 발생)

    * 파일 영구 삭제 하기
    파일을 지울 때 역시 대상이 지정된 File의 delegator에 deleteFile() , deleteFileAsync() 를 호출하면 영구 삭제가 된다. 단 파일이 없거나 lock으로 잠긴 경우 IO에러가 발생하므로 try~catch나 이벤트를 사용하여 에러를 방지한다.

    * 디렉토리나 파일 휴지통으로 삭제하기
    폴더를 영구삭제가 아닌 휴지통으로 삭제하려면(실제 삭제라고 보지않고 move의 개념)
    moveToTrash() , moveToTrashAsync()를 사용하여 휴지통으로 보낸다.
    이 경우에는 폴더의 내용이 있더라도 삭제가 가능하다.
    Posted by 버터백통
    AIR/파일시스템 연동2008. 12. 9. 19:10

    AIR작업을 하다가 보면 파일을 불러오거나 저장하는 다이얼로그 창에서 직접 대상의 이름을 입력하여 불러오곤 하는데 간혹 이러한 이름과 경로를 사용하거나 확인하고 싶은데 약어나 대소문자 구분 없이 입력되었다면 보기가 힘들다. 이를 정상적으로 보여주는 canonicalize()를 호출한다.

    canonicalize() 메서드는 File클래스에서 제공한다.
    canonicalize는 실제의 경로를 바르게 표기하며 대소문자 뿐만 아니라 시스템에서 사용하는 약어 경로 또한 풀어서 정상적으로 표기하도록 하는 메서드이다.  가령 파일오픈시 /mY doCuMenTs/dAaA.Ppt와 같이 작성하여 열었다면 그냥 nativePath하여도 /mY doCuMenTs/dAaA.Ppt로 출력할 것 이다.
    중간에 File.canonicalize()를 호출하면 /My Documents/daaa.ppt와 같이 실제 경로를 대소문자로 구분하여 바르게 표시한다.
    Posted by 버터백통