Silverlight 4 OOB Trusted Applications Local File System 사용하기 Silverlight 4 BETA OOB Trusted Applications 그 두번째 시간 입니다. 이번 강좌는 Silverlight 4에서 추가된 Local File System 사용에 대해 알아 보도록 하겠습니다.
RIA Application 의 특징상 보안에 아주 엄격할 수 밖에 없습니다. 예를 들자면 Silverlight 나 Flash 의 크로스 도메인 정책을 허용 한다면 Dos 공격으로 남아 나는 사이트가 없을 것입니다. 또한 이번에 다룰 Local System 도 별다른 제약 없이 쓸수 있다면 우리의 PC 는 악성코드와 바이러스로 가득차 있을 것입니다. 생각만 해도 아주 끔찍한 결과죠.
하지만 이러한 제약으로 불편한점도 있습니다. 일단 덩치가 큰 Application의 경우 리소스 크기에 대한 제약이 심해집니다. 물론 Silverlight 는 SandBox 의 기능이 있기는 하지만 사용방법도 까다롭고, 기본적으로 제공하는 사이즈도 기본 1 MB/ OOB 25MB 라 충분치 않구요. 물론 용량을 늘리기 위해 사용자의 동의를 받으면 되지만 세상은 저같이 부정적인 사람도~ 많아서 쉽지는 않을 것입니다. ^^;;
제가 Remix 09 행사때 이런 질문을 받은적이 있습니다. "왜 Silverlight 에서는 Local File System을 사용할 수 없는냐!!" 프로젝트 진행에 있어 상당히 제약이 된다는 불만을 토로 했습니다. 저는 ' Silverlight 의 보안의 특성상 Local File System 으로의 접근은 현재도 앞으로도 추가 되지 않을듯 합니다." 라고 답했습니다. 하지만 이번 Silverlight 4 에서는 이러한 생각이 틀렸다는 것을 알았습니다. ( 많은 사람들이 Local System 으로 접근을 허용하는 것음 의외 라고 생각 하셨을 겁니다.. 아니면 말구요 ^^;;)
Silverlight 4 에서는 한정적으로 Local File System 접근이 가능해졌습니다. 여기서 말하는 한정적이라는 말은아래와 같습니다.
1. 신뢰할수 있는 Application 이라는 것에 대해 사용자의 확인이 필요 합니다.
2. 접근이 가능한 폴더가 제한적 입니다. ( 내문서, 내비디오 , 내사진과 같은 맥의 경우 이와 유사한 폴더를 사용합니다.)
위와 같은 조건들을 갖추기만 하면 우리는 Silverlight 만으로도 훌륭한 Desktop Application 을 만들 수 있게 된 것이지요 !!
Silverlight 4 는 기존의 Silverlight API 와는 달리 File System 에 대한 권한을 모두 허용해 주었는데요.(물론 Trusted OOB 에서만 가능) 이는 Silverlight 3 와 4의 System.IO.File 네임 스페이스만 살펴봐도 쉽게 알 수가 있습니다.
Silverlight 4 는 인텔리 센스에 반응 하군요~ (착한것!! 요즘 Visual Studio 가 제 일의 70%는 대신 해주는것 같네요... 쩝 월급줘야 하나)
# 사용 가능한 폴더 얻기
위에서 File System 에 접근할 수 있는 폴더는 제한적이라고 설명을 하였는데요. 바로 접근 가능한 폴더정해져 있기 때문입니다. 접근 가능한 폴더는 Environment.GetFolderPath 메소드와 Environment.SpecialFolder 열거형 객체로 알 수 가 있습니다.
내 PC 의 내문서는 어디에 위치하고 있을까? var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
MessageBox.Show(path);
이렇게 간단하게 내문서의 위치를 알 수 있습니다.
#예제 File Browser 만들기
자! 이제 본격적으로 Local File System 을 사용해보도록 하겠습니다. 다음 예제는 내문서의 디렉토리와 파일들의 목록을 출력 하고 텍스트 파일을 생성해 보는 예제 입니다.
1. 프로젝트 만들기
Silverlight Application 을 만들기 위해 VisualStudio 2010 을 실행 합니다. VisualStudio 가 없다면 http://www.indreams.co.kr/blog/24 을 참고 하시면 됩니다. 실행이 되었다면 File-> New -> Project 를 선택 Silverlight 프로젝트를 생성합니다.
2. OOB 설정 하기 Local File System 을 사용하기 위해선 Trusted Applications 모드로 실행 해야 됩니다. 이를 위해 OOB 를 설정을 하겠습니다.
① OOB 를 사용하기위해 Enable running application OOB 를 체크 합니다.
② Trusted Applications 모드로 실행 하기 위해 OOB Settings 버튼 을 클릭 합니다.
Trusted Applications 모드로 실행 하기위해 Require elevated trust when running outside the browser 를 체크 합니다.
3. XAML
MainPage.xaml 파일을 열어 아래의 코드를 작성 합니다.
<UserControl x:Class="FileBrowser.MainPage"
xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="
http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="
http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="
http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Height="300" Width="400">
<Grid x:Name="LayoutRoot" Background="White">
<!-- 파일 목록 -->
<ListBox Width="200" HorizontalAlignment="Left" x:Name="FileListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Icon}"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!-- 파일 정보 및 텍스트파일 입력폼 -->
<StackPanel Margin="220,10,0,0" x:Name="FileInfoBox">
<StackPanel Orientation="Horizontal">
<TextBlock Text="파일(폴더)명: "/>
<TextBlock Text="{Binding Name}" TextWrapping="Wrap"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="경로: "/>
<TextBlock Text="{Binding Path}" TextWrapping="Wrap" Height="50" Width="140"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="생성: "/>
<TextBlock Text="{Binding CreatTime}" TextWrapping="Wrap"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="수정: "/>
<TextBlock Text="{Binding LastWriteTime}" TextWrapping="Wrap"/>
</StackPanel>
<StackPanel>
<TextBlock Text="파일이름" Margin="15,20,0,0"/>
<TextBox Width="150" Height="25" x:Name="InputFileName"/>
<TextBlock Text="파일내용" Margin="15,20,0,0"/>
<TextBox Width="150" Height="50" TextWrapping="Wrap" x:Name="InputFileContent"/>
<Button Width="150" Height="30" Margin="0,10,0,0" Content="TXT 파일 만들기" x:Name="CreateButton"/>
</StackPanel>
</StackPanel>
<!-- OOB 설치 버튼 -->
<Button Content="Silverlight Application Install" x:Name="InstallButton" Visibility="Collapsed"/>
</Grid>
</UserControl>
4. CS
MainPage.xaml.cs 파일을 열어 아래의 코드를 작성합니다.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Collections.ObjectModel;
namespace FileBrowser
{
public class FileData
{
public string Name { get; set; }
public string Path { get; set; }
public DateTime CreatTime { get; set; }
public DateTime LastWriteTime { get; set; }
public string Icon { get; set; }
}
public partial class MainPage : UserControl
{
ObservableCollection fileList = new ObservableCollection();
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
this.InstallButton.Click += new RoutedEventHandler(InstallButton_Click);
this.FileListBox.SelectionChanged += new SelectionChangedEventHandler(FileListBox_SelectionChanged);
this.CreateButton.Click += new RoutedEventHandler(CreateButton_Click);
}
void CreateButton_Click(object sender, RoutedEventArgs e)
{
if (InputFileName.Text.Length <= 0)
{
MessageBox.Show("파일명을 입력하세요.");
InputFileName.Focus();
}
else if (InputFileContent.Text.Length <= 0)
{
MessageBox.Show("내용을 입력하세요.");
InputFileContent.Focus();
}
else
{
try
{
// 내문서의 위치 가져오기
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
// 텍스트 파일 스트림 얻기
System.IO.StreamWriter writer = System.IO.File.CreateText(string.Format(@"{0}\{1}{2}", path, InputFileName.Text, ".txt"));
// 입력 받은 테스트 스트림에 쓰기
writer.WriteLine(InputFileContent.Text);
writer.Close();
MessageBox.Show("메세지를 입력 하였습니다.");
fileList.Clear();
// 파일 목록 재갱신
LoadMyDocumentFiles();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
void FileListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
FileInfoBox.DataContext = fileList[FileListBox.SelectedIndex];
}
void InstallButton_Click(object sender, RoutedEventArgs e)
{
App.Current.Install();
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
// OOB가 설치 되어 있는지 검사
if (App.Current.InstallState == InstallState.NotInstalled)
{
this.InstallButton.Visibility = Visibility.Visible;
}ㄴ
else
{
// 현재 OOB 로 실행 중인지 검사
if (!App.Current.IsRunningOutOfBrowser)
{
this.LayoutRoot.Children.Clear();
TextBlock txt = new TextBlock();
txt.VerticalAlignment = VerticalAlignment.Center;
txt.HorizontalAlignment = HorizontalAlignment.Center;
txt.Text = "OOB에서만 실행하세요 ^^";
this.LayoutRoot.Children.Add(txt);
}
else
{
FileListBox.ItemsSource = fileList;
LoadMyDocumentFiles();
}
}
}
void LoadMyDocumentFiles()
{
// 내문서 위치 얻기
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
//디렉토리 목록 가져오기
foreach(string data in System.IO.Directory.EnumerateDirectories(path))
{
FileData file = new FileData();
System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(data);
file.Name = dirInfo.Name;
file.Path = data;
file.CreatTime = dirInfo.CreationTime;
file.LastWriteTime = dirInfo.LastWriteTime;
file.Icon = "/Image/dir.png";
this.fileList.Add(file);
}
//파일목록 가져오기
foreach (string data in System.IO.Directory.EnumerateFiles(path))
{
FileData file = new FileData();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(data);
file.Name = fileInfo.Name;
file.Path = data;
file.CreatTime = fileInfo.CreationTime;
file.LastWriteTime = fileInfo.LastWriteTime;
file.Icon = "/Image/file.png";
this.fileList.Add(file);
}
}
}
}
# File Browser 실행 하기 1. OOB 설치 하기 프로젝트를 빌드 하게 되면 OOB 설치 버튼이 나오는데. 이는 현재의 PC 에 Silverlight Application 이 OOB로 설치되어 있지 않기 때문입니다. "안했으면 하면 될것을!!" 가감하게 버튼을 클릭해줍니다.
설치 버튼을 누르게 되면 아래와 같은 화면이 나오게 되는데 현재의 Silverlight Application 이 사용자의 컴퓨터를 접근할수 있다는 경고를 3초간 보여주게 됩니다. 3초가 지난후 에는 Install 버튼이 활성화 되는데 이때 Install 버튼을 쿨하게 눌러줍니다 !!
설치가 끝나면 우리 그토록 갈망하던 내문서의 파일들이 출력 되는것을 확인 할수 있습니다.
파일 목록을 선택하면 파일의 경로와 파일의 생성 날짜, 수정 날짜를 확인 할수 있습니다.
내문서의 TXT 파일을 생성해 봅니다. 생성할 파일명과 파일 내용을 작성하고 파일 만들기 버튼을 클릭 합니다.
만들어진 파일은 오른쪽의 파일 목록에서 확인 할 수 있습니다.
자 그럼 진짜 내문서에 파일이 생성 되었는지 확인해 보도록 하겠습니다.
지금까지 Silverlight 4 를 이용해 Local File System 을 사용해 보았습니다. 참 쉽죠잉??
[샘플 페이지][샘플 소스 다운로드]
[Silverlight 4 Developer Runtime]
2009/11/21 11:29 2009/11/21 11:29
Trackback URL : http://indreams.co.kr/blog/trackback/44
당신의 의견을 작성해 주세요.