반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

코로나 SDK에서 파일 다루기

2011. 10. 18. 22:51 | Posted by 솔웅


반응형
다른 기능과 마찬가지로 코로나에서는 file control 도 간단한 코딩으로 구현할 수 있습니다.

우선 파일이 저장될 path를 지정해 주셔야 되는데요. path지정은 system.pathForFile 함수를 사용합니다. 다음은 절대경로에 있는(main.lua에 있는) 아이콘 파일을 가리킵니다.
local path = system.pathForFile( "Icon.png", system.ResourceDirectory )
일반적으로 파일을 저장하려면 아래 3가지 종류의 기본 디렉토리 중 하나를 사용하셔야 합니다.
system.DocumentsDirectory : 어플리케이션 세션 사이에서 persist하게 유지될 필요가 있을 때 사용합니다.
system.TemporaryDirectory : 임시 디렉토리 입니다.
system.ResourceDirectory : 어플리케이션의 모든 asset들이 있는 디렉토리. 이곳에 있는 파일을 생성하거나 수정하거나 추가할 수 없습니다.

아래와 같이 코딩 한 다음 실행해 볼께요.
local path = system.pathForFile( "data.txt", system.DocumentsDirectory )
print("path = " .. path)

system.DocumentsDirectory를 print로 찍어봤더니 맥에 있는 코로나 시뮬레이터 디렉토리안이 찍힙니다. 아마 전화기이면 전화기 내의 특정한 장소에 저장이 되겠죠?


system.ResourceDirectory 를 print 로 찍어보면 main.lua 가 있는 그 메인 디렉토리가 나옵니다. 위 소스와 같이 system. 을 찍지 않아도 이렇게 나오네요.


system.TemporaryDirectory 는 system.DocumentsDirectory 와 같은 경로가 찍히는데요. persist하게 유지되느냐 그냥 temporary하게 유지하느냐의 차이가 있습니다.

아래 코드를 보겠습니다.
local path = system.pathForFile( "data.txt", system.DocumentsDirectory )
 
-- io.open opens a file at path. returns nil if no file found
local file = io.open( path, "r" )
if file then
   -- read all contents of file into a string
   local contents = file:read( "*a" )
   print( "Contents of " .. path .. "\n" .. contents )
   io.close( file )
else
   -- create file b/c it doesn't exist yet
   file = io.open( path, "w" )
   local numbers = {1,2,3,4,5,6,7,8,9}
   file:write( "Feed me data!\n", numbers[1], numbers[2], "\n" )
   for _,v in ipairs( numbers ) do file:write( v, " " ) end
   file:write( "\nNo more data\n" )
   io.close( file )
end

1번을 보면 경로를 system.DocumentsDirectory로 하고 파일 이름은 data.txt로 정의했습니다.
4번째줄을 보면 data.txt파일을 io.open 함수를 이용해서 엽니다.
file이 있으면 file:read 로 모두(*a) 읽어옵니다.
이 읽어온 내용을 print로 찍습니다.
그리고 9번째 줄에서 io.close로 파일을 닫습니다.
만약 file이 없으면 10번째 줄 그 다음이 실행 됩니다.
file을 write권한으로 열구요.
file:write 함수를 이용해서 내용을 파일에 넣습니다.
그리고 파일을 닫습니다.

파일을 만들고 내용을 넣고 나중에 그것을 다시 읽고 하는게 무척 간단하죠?

주의할 점은 처음에 언급했듯이 main.lua 파일이 있는 폴더 그러니까 system.ResouceDirectory 로 접근할 때에는 파일을 수정하거나 지우거나 만들어서는 안됩니다.
처음에 앱을 실행할 때 애플리케이션의 정합성을 체크하게 되는데요. 이 때 등록돼 있는 파일과 똑 같은 파일이 그 디렉토리에 있어야 합니다. 만약에 다를 경우 앱이 실행 되지 않습니다.

보안상의 이유로 파일은 그 애플리케이션의 sandbox에 있는 것만 열 수 있습니다. io 라이브러리는 그 path를 필요로 합니다.
그 path는 system.pathForFile을 통해 제공됩니다. (위에 있는 예제에서와 같이요)

io 라이브러리엔 다음과 같은 합수 들이 있습니다.
io.close(file)
io.flush()
io.input(file)
io.lines(filename) : read 모드로 열어서 iterator 로 리턴합니다.
io.open(filename,mode)
  r : read mode (default), w : write mode , a : append mode, r+ : update mode, 이전 데이터들은 남아있는다. w+ : update mode 이전 데이터들은 지워진다. a+ : append update mode, 이전 데이터들은 남아있는다. 파일 마지막부분서부터 추가된다.
io.output
io.popen(prog,mode) : 별도의 프로세스에서 program prog를 시작한다.
io.read = io.input():read
io.tmpfile() : 프로그램이 끝나면 저절로 해당 파일을 없어진다.
io.type(obj)
io.write() = io.output():write

file:close(), file.flush(), file:lines(), file:read(), file:seek(),file:setvbuf(),file:write()

각 함수들에 대한 상세한 내용은 API를 보세요.

Crypto

Corona SDK 는 hash-based 메세지 검증코드를 제공합니다 (HMAC).
이 기능을 제공하는 crypto 라이브러리는 코로나 앱에 pre-install된 external library입니다. 이 라이브러리를 이용하려면 local crypto = require("crypto") 식으로 require한 후 사용이 가능합니다.

crypto.digest( algorithm, string [, raw] )

crypto.hmac( algorithm, string, key [, raw] )

위와같은 함수들이 있습니다.
이 함수들은 제가 설명하기엔 역부족이네요. 뭔지도 잘 모르겠구요. 언제사용하는건지도 모르겠고...

혹시 아시는 분 계시면 조언 부탁드려요.

일단 오늘로 코로나 SDK의 Data and Files 섹션은 모두 끝났습니다.

다음엔 Audio,Video and Photos 에 대해서 공부해 볼까 합니다.

그럼 담 시간에 뵈요.



반응형