본문 바로가기

IT 살이/04. 기술 - 프로그래밍

[연재 02] 로컬 데이터 파일 읽기

앞의 포스트에서는 ClickOnce 배포로 로컬 PC에 데이터 파일을 저장하는 방법에 대해서 알아봤다. 이번에 그 저장된 파일을 읽는 방법에 대해서 알아본다.

2. 로컬 데이터 파일 읽기

ClickOnce 애플리케이션과 함께 배포되는 데이터 파일은 데이터 디렉토리(Data Directory)에 저장되는데, 그 디렉토리 경로는 애플리케이션 인스톨시 동적으로 결정된다고 했다. 따라서 직접적으로 그 물리적 경로를 기반으로 해서는 그 파일을 읽어들일 수 없다. 그래서 .NET 프레임워크에서는 데이터 파일이 저장되는 데이터 디렉토리에 접근(Read/Write)할 수 있는 API를 제공하고 있다.

데이터 디렉토리에서 읽고 쓰기

우선 데이터 디렉토리에서 파일을 읽고 쓰기 위해서는 ClickOnce 애플리케이션에는 디렉토리에 Read, Write할 수 있는 권한이 있어야 한다. 만약 애플리케이션이 Full Trust 권한을 갖는 것으로 설정되면 자동으로 이런 권한을 갖게 될 것이다. 애플리케이션이 이런 권한을 갖게 된다면 이제 System.IO 네임스페이스에 있는 클래스들을 이용해서 데이터 디렉토리에 접근할 수 있게 된다.  다음 코드는 데이터 디렉토리에 있는 CSV.txt 텍스트 파일에 접근하는 방법을 보여주고 있다.

if (ApplicationDeployment.IsNetworkDeployed)

{

  try

  {

       using (StreamReader sr = new StreamReader(

           ApplicationDeployment.CurrentDeployment.DataDirectory + @"\CSV.txt"))

       {

           MessageBox.Show(sr.ReadToEnd());

       }

  }

  catch (Exception ex)

  {

       MessageBox.Show("Could not read file. Error message: " + ex.Message);

  }

}

이 코드에서처럼 ClickOnce 애플리케이션에서는 ApplicationDeploymentCurrentDeployment 속성에 정의된 DataDirectory 속성을 이용하면 데이터 디렉토리에 접근할 수 있다.

3. 데이터 디렉토리와 애플리케이션 버전

애플리케이션의 각 버전은 서로 독립된 자신의 데이터 디렉토리를 갖는다고 했다. ClickOnce 엔진은 애플리케이션 배포 목록에 데이터 파일이 없더라도 항상 데이터 디렉토리를 만든다. 그렇게 해서 애플리케이션 런타임시에 새롭게 생성된 데이터 파일을 원한다면 이곳에 저장될 수 있도록 한다.

새로운 버전의 애플리케이션이 설치되면, ClickOnce 엔진은 이전 버전의 데이터 디렉토리에 있는 기존의 모든 데이터 파일을 새로운 버전의 데이터 디렉토리로 복사한다- 새로운 버전의 애플리케이션에 기존의 데이터 파일이 포함되지 않아도 복사한다.

그런 다음 새롭게 배포된 애플리케이션에 포함된 데이터 파일들이 이전 버전의 애플리케이션에도 포함되었는지를 확인한다. 만약 그렇다면 그 새로운 버전의 데이터 파일의 해시값과 이전 파일의 해시값을 비교해서 값이 틀리다면 이전 버전의 데이터 파일을 대체한다. 또한 이전 버전의 애플리케이션의 런타임시에 생성된 파일이 우연찮게 새로운 버전의 애플리케이션에서 새로 추가한 데이터 파일과 이름이 동일한 경우도 이전 버전의 파일을 대체한다. 이 두 경우 모두 이전 버전의 파일은 새로운 버전의 데이터 디렉토리에 .pre 라는  이름의 서브 디렉토리를 만들어 그쪽으로 캐싱한다.

만약 데이터 파일의 이동에 대한 좀 더 상세한 전략이 필요하다면 ClickOnce 배포 API를 이용할 수 있다. IsFurstRun(http://msdn2.microsoft.com/en-us/library/system.deployment.application.applicationdeployment.isfirstrun.aspx  ), Update(http://msdn2.microsoft.com/en-us/library/system.deployment.application.applicationdeployment.update.aspx ), UpdateAsync(http://msdn2.microsoft.com/en-us/library/system.deployment.application.applicationdeployment.updateasync.aspx )등을 참고하라.

클라이언트 PC에 안전하게 데이터 파일을 저장할 수 있는 방법은 데이터 디렉토리외에도 다음과 같은 방법을  이용할 수도 있다.

- Isolated Storage 이용

- 그 외의 로컬 파일로 저장

외의 데이터 파일 저장소

Isolated Storage

Isolated Storage는 부분 신뢰의 애플리케이션에서도 추가적인 권한이 없어도 안전하게 접근해서 파일을 생성하고 접근할 수 있도록 설계된 저장소이다. Isolated Storage도 파일 시스템상의 디렉토리이지만 그 실제의 물리적인 경로는 개발자와 사용자들에게는 숨겨져 있다. 대신에 .NET에서 제공하는 API를 통해서 접근하게 된다.

만약 애플리케이션이 부분 신뢰의 환경에서 구동되어야 하고 그러나 애플리케이션별 데이터 파일을 저장해야 한다면 Isolated Storage를 이용해야 한다. 자세한 내용은 MSDN에서 소개하는 Introduction to Isolated Storage(http://msdn2.microsoft.com/en-us/library/bdts8hk0.aspx )

다른 로컬 파일 이용

만약 엔드 유저가 리포트, 이미지, 음악 파일 같은 파일을 저장하고 읽어오는 애플리케이션을 만들어야 한다면, 그 애플리케이션은 로컬 파일 시스템을 읽고 쓸 수 있는 FileIOPermission(http://msdn2.microsoft.com/en-us/library/system.security.permissions.fileiopermission.aspx ) 필요할 것이다. 이런 경우라면 데이터 파일을 저장하기 위해서 자유롭게 파일 시스템을 이용할 수 있을 것이다.

다음에는 원격의 데이터 읽는 방법에 대해서 정리해 본다.