첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestProject.zip
0.05MB

▶ NotifyType.cs

namespace TestProject
{
    /// <summary>
    /// 통지 타입
    /// </summary>
    public enum NotifyType
    {
        /// <summary>
        /// 상태 메시지
        /// </summary>
        StatusMessage,

        /// <summary>
        /// 에러 메시지
        /// </summary>
        ErrorMessage
    };
}

 

728x90

 

▶ Scenario.cs

using System;

namespace TestProject
{
    /// <summary>
    /// 시나리오
    /// </summary>
    public class Scenario
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 제목 - Title

        /// <summary>
        /// 제목
        /// </summary>
        public string Title { get; set; }

        #endregion
        #region 클래스 타입 - ClassType

        /// <summary>
        /// 클래스 타입
        /// </summary>
        public Type ClassType { get; set; }

        #endregion
    }
}

 

300x250

 

▶ SamplePage01.xaml

<Page x:Class="TestProject.SamplePage01"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
이 샘플의 시나리오를 연습하려면 새 파일 'sample.dat'를 만드십시오.
사진 라이브러리에 파일이 생성됩니다.
            </TextBlock>
            <Button
                Margin="0 10 0 0"
                Content="파일 생성"
                Click="createFileButton_Click" />
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage01.xaml.cs

using System;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 1
    /// </summary>
    public sealed partial class SamplePage01 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage01()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage01()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 파일 생성 버튼 클릭시 처리하기 - createFileButton_Click(sender, e)

        /// <summary>
        /// 파일 생성 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void createFileButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null /* 현재 사용자 */, KnownFolderId.PicturesLibrary);

            try
            {
                this.mainPage.SampleStorageFile = await storageFolder.CreateFileAsync(MainPage.FileName, CreationCollisionOption.ReplaceExisting);

                this.mainPage.ShowStatusMessage
                (
                    $"'{mainPage.SampleStorageFile.Name}' 파일을 생성했습니다.",
                    NotifyType.StatusMessage
                );
            }
            catch(Exception exception)
            {
                this.mainPage.ShowStatusMessage
                (
                    $"'{MainPage.FileName}' 파일 생성시 에러가 발생했습니다 : {exception.Message}",
                    NotifyType.ErrorMessage
                );
            }
        }

        #endregion
    }
}

 

▶ SamplePage02.xaml

<Page x:Class="TestProject.SamplePage02"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
'sample.dat'는 사진 라이브러리에 생성되었습니다.
앱에는 사진 라이브러리 기능이 있으므로 파일이 생성된 폴더에 액세스할 수 있습니다.
폴더를 검색하려면 '부모 조회' 버튼을 클릭합니다.
            </TextBlock>
            <Button
                Margin="0 10 0 0"
                Content="부모 조회"
                Click="getParentButton_Click" />
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage02.xaml.cs

using System;
using System.IO;
using System.Text;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 2
    /// </summary>
    public sealed partial class SamplePage02 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage02()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage02()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 부모 조회 버튼 클릭시 처리하기 - getParentButton_Click(sender, e)

        /// <summary>
        /// 부모 조회 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void getParentButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    StorageFolder storageFolder = await storageFile.GetParentAsync();

                    if(storageFolder != null)
                    {
                        StringBuilder stringBuilder = new StringBuilder();

                        stringBuilder.AppendLine($"항목 : {storageFile.Name} ({storageFile.Path})");
                        stringBuilder.AppendLine($"부모 : {storageFolder.Name} ({storageFolder.Path})");

                        this.mainPage.ShowStatusMessage(stringBuilder.ToString(), NotifyType.StatusMessage);
                    }
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
    }
}

 

▶ SamplePage03.xaml

<Page x:Class="TestProject.SamplePage03"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
'sample.data' 파일에 일부 텍스트를 쓰려면 아래 텍스트 상자에 내용을 입력하고 '텍스트 쓰기' 버튼을 클릭합니다.
'sample.dat' 파일의 내용을 읽으려면 '텍스트 읽기' 버튼을 클릭하십시오.
            </TextBlock>
            <TextBox Name="sourceTextBox"
                Margin="0 10 0 0"
                Height="100"
                AcceptsReturn="True"
                TextWrapping="Wrap"
                Text="ABC123" />
            <StackPanel
                Margin="0 10 0 0"
                Orientation="Horizontal">
                <Button
                    Margin="0 0 10 0"
                    Content="텍스트 쓰기"
                    Click="writeTextButton_Click" />
                <Button
                    Content="텍스트 읽기"
                    Click="readTextButton_Click" />
            </StackPanel>
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage03.xaml.cs

using System;
using System.IO;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// Writing and reading text in a file.
    /// </summary>
    public sealed partial class SamplePage03 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage03()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage03()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 텍스트 쓰기 버튼 클릭시 처리하기 - writeTextButton_Click(sender, e)

        /// <summary>
        /// 텍스트 쓰기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void writeTextButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    string fileContent = this.sourceTextBox.Text;

                    await FileIO.WriteTextAsync(storageFile, fileContent);

                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에 다음과 같이 텍스트를 썼습니다 :\n{fileContent}",
                        NotifyType.StatusMessage
                    );
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에 텍스트를 쓰는 중 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
        #region 텍스트 읽기 버튼 클릭시 처리하기 - readTextButton_Click(sender, e)

        /// <summary>
        /// 텍스트 읽기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void readTextButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    string fileContent = await FileIO.ReadTextAsync(storageFile);

                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에서 다음과 같이 텍스트를 읽었습니다 :\n{fileContent}",
                        NotifyType.StatusMessage
                    );
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception) when (exception.HResult == MainPage.E_NO_UNICODE_TRANSLATION)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        "파일을 유니코드로 디코딩할 수 없습니다.",
                        NotifyType.ErrorMessage
                    );
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에서 읽는 중 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
    }
}

 

▶ SamplePage04.xaml

<Page x:Class="TestProject.SamplePage04"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="성명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
일부 바이트 세트를 'sample.dat'에 쓰려면 아래 텍스트 상자에 내용을 입력하고 '바이트 쓰기' 버튼을 클릭합니다.
'sample.dat' 내용으로 바이트 세트를 읽으려면 '바이트 읽기' 버튼을 클릭하십시오.
            </TextBlock>
            <TextBox Name="sourceTextBox"
                Margin="0 10 0 0"
                Height="100"
                AcceptsReturn="True"
                TextWrapping="Wrap"
                Text="ABC123" />
            <StackPanel
                Margin="0 10 0 0"
                Orientation="Horizontal">
                <Button
                    Margin="0 0 10 0"
                    Content="바이트 쓰기"
                    Click="writeByteButton_Click" />
                <Button
                    Content="바이트 읽기"
                    Click="readByteButton_Click" />
            </StackPanel>
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage04.xaml.cs

using System;
using System.IO;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 4
    /// </summary>
    public sealed partial class SamplePage04 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage04()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage04()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 바이트 쓰기 버튼 클릭시 처리하기 - writeByteButton_Click(sender, e)

        /// <summary>
        /// 바이트 쓰기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void writeByteButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    string fileContent = this.sourceTextBox.Text;

                    IBuffer buffer = MainPage.GetBuffer(fileContent);

                    await FileIO.WriteBufferAsync(storageFile, buffer);

                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에 다음과 같이 {buffer.Length} 바이트의 텍스트를 썼습니다 :{Environment.NewLine}{fileContent}",
                        NotifyType.StatusMessage
                    );
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에 쓰는 중 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
        #region 바이트 읽기 버튼 클릭시 처리하기 - readByteButton_Click(sender, e)

        /// <summary>
        /// 바이트 읽기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void readByteButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    IBuffer buffer = await FileIO.ReadBufferAsync(storageFile);

                    string fileContent = MainPage.GetString(buffer);

                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에서 다음과 같이 {buffer.Length} 바이트의 텍스트를 읽었습니다 :\n{fileContent}",
                        NotifyType.StatusMessage
                    );
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception) when (exception.HResult == MainPage.E_NO_UNICODE_TRANSLATION)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        "파일이 UTF-8로 인코딩되어 있지 않습니다.",
                        NotifyType.ErrorMessage
                    );
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에서 읽는 중 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
    }
}

 

▶ SamplePage05.xaml

<Page x:Class="TestProject.SamplePage05"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
스트림을 사용하여 'sample.data' 파일에 일부 텍스트를 쓰려면 아래 텍스트 상자에 내용을 입력하고 '스트림 쓰기' 버튼을 클릭합니다.
스트림을 사용하여 'sample.dat' 파일의 내용을 읽으려면 '스트림 읽기' 버튼을 클릭하십시오.
            </TextBlock>
            <TextBox Name="sourceTextBox"
                Margin="0 0 0 10"
                Height="100"
                AcceptsReturn="True"
                TextWrapping="Wrap"
                Text="ABC123" />
            <StackPanel
                Margin="0 10 0 0"
                Orientation="Horizontal">
                <Button
                    Margin="0 0 10 0"
                    Content="스트림 쓰기"
                    Click="writeStreamButton_Click" />
                <Button
                    Content="스트림 읽기"
                    Click="readStreamButton_Click" />
            </StackPanel>
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage05.xaml.cs

using System;
using System.IO;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 5
    /// </summary>
    public sealed partial class SamplePage05 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage05()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage05()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 스트림 쓰기 버튼 클릭시 처리하기 - writeStreamButton_Click(sender, e)

        /// <summary>
        /// 스트림 쓰기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void writeStreamButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    string fileContent = this.sourceTextBox.Text;

                    using(StorageStreamTransaction transaction = await storageFile.OpenTransactedWriteAsync())
                    {
                        IBuffer buffer = MainPage.GetBuffer(fileContent);

                        await transaction.Stream.WriteAsync(buffer);

                        transaction.Stream.Size = buffer.Length;

                        await transaction.CommitAsync();

                        this.mainPage.ShowStatusMessage
                        (
                            $"'{storageFile.Name}' 파일에 스트림을 사용해 다음과 같이 텍스트를 썼습니다 :\n{fileContent}",
                            NotifyType.StatusMessage
                        );
                    }
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에 쓰는 중 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
        #region 스트림 읽기 버튼 클릭시 처리하기 - readStreamButton_Click(sender, e)

        /// <summary>
        /// 스트림 읽기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void readStreamButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    using(IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read))
                    {
                        ulong size64 = stream.Size;

                        if(size64 <= uint.MaxValue)
                        {
                            uint size32 = (uint)size64;

                            IBuffer buffer = new Windows.Storage.Streams.Buffer(size32);

                            buffer = await stream.ReadAsync(buffer, size32, InputStreamOptions.None);

                            string fileContent = MainPage.GetString(buffer);

                            this.mainPage.ShowStatusMessage
                            (
                                $"'{storageFile.Name}' 파일에서 스트림을 사용해 다음과 같이 텍스트를 읽었습니다 :\n{fileContent}",
                                NotifyType.StatusMessage
                            );
                        }
                        else
                        {
                            this.mainPage.ShowStatusMessage
                            (
                                $"{storageFile.Name} 파일이 너무 커서 ReadAsync가 단일 청크에서 읽을 수 없습니다. " +
                                 "4GB보다 큰 파일은 ReadAsync에서 읽을 수 있도록 여러 청크로 나누어야 합니다.",
                                NotifyType.ErrorMessage
                            );
                        }
                    }
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception) when (exception.HResult == MainPage.E_NO_UNICODE_TRANSLATION)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        "파일이 UTF-8로 인코딩되어 있지 않습니다.",
                        NotifyType.ErrorMessage
                    );
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일에서 읽는 중 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
    }
}

 

▶ SamplePage06.xaml

<Page x:Class="TestProject.SamplePage06"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 :" />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
'sample.dat'에 대한 파일 속성을 검색하고 표시하려면 '속성 표시' 버튼을 클릭하십시오.
            </TextBlock>
            <Button
                Margin="0 10 0 0"
                Content="속성 표시"
                Click="showPropertyButton_Click" />
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage06.xaml.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Windows.Storage;
using Windows.Storage.FileProperties;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 6
    /// </summary>
    public sealed partial class SamplePage06 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage06()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage06()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 속성 표시 버튼 클릭시 처리하기 - showPropertyButton_Click(sender, e)

        /// <summary>
        /// 속성 표시 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void showPropertyButton_Click(object sender, RoutedEventArgs e)
        {
            const string dateAccessedProperty = "System.DateAccessed";
            const string fileOwnerProperty    = "System.FileOwner";

            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    StringBuilder stringBuilder = new StringBuilder();

                    stringBuilder.AppendLine($"파일명 : {storageFile.Name}");
                    stringBuilder.AppendLine($"파일 타입 : {storageFile.FileType}");

                    BasicProperties basicProperties = await storageFile.GetBasicPropertiesAsync();

                    stringBuilder.AppendLine($"파일 크기 : {basicProperties.Size} 바이트");
                    stringBuilder.AppendLine($"데이터 수정 : {basicProperties.DateModified}");

                    IDictionary<string, object> dictionary = await storageFile.Properties.RetrievePropertiesAsync
                    (
                        new[]
                        {
                            dateAccessedProperty,
                            fileOwnerProperty
                        }
                    );

                    object propertyValue = dictionary[dateAccessedProperty];

                    if(propertyValue != null)
                    {
                        stringBuilder.AppendLine($"데이터 액세스 : {propertyValue}");
                    }

                    propertyValue = dictionary[fileOwnerProperty];

                    if(propertyValue != null)
                    {
                        stringBuilder.Append($"파일 소유자 : {propertyValue}");
                    }

                    this.mainPage.ShowStatusMessage(stringBuilder.ToString(), NotifyType.StatusMessage);
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일의 속성 조회시 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
    }
}

 

▶ SamplePage07.xaml

<Page x:Class="TestProject.SamplePage07"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
                나중에 사용할 수 있도록 스토리지 항목에 대한 액세스를 유지합니다.
            </TextBlock>
            <TextBlock
                Style="{StaticResource BaseMessageStyle}"
                Margin="0 10 0 0"
                TextWrapping="Wrap">
가장 최근에 사용한(MRU) 목록을 사용하여 사용자가 자주 액세스하는 저장소 항목(예 : 파일, 폴더 등)을 추적합니다.
MRU는 최대 25개의 항목을 보유하며 Windows에서 유지 관리합니다.
<LineBreak/>
<LineBreak/>
앱의 MRU에 항목을 추가할 때 시스템 MRU에 추가하여 시스템 전체의 최근 항목 목록(사용 가능한 경우)에 표시되도록 할 수도 있습니다.
<LineBreak/>
<LineBreak/>
FAL(향후 액세스 목록)을 사용하여 파일 선택기를 통해 액세스하는 항목과 같이 앱의 기능으로 지정되지 않은 위치에 있는 저장소 항목(예: 파일, 폴더 등)에 대한 액세스를 유지합니다.
FAL은 최대 1000개의 항목을 보유하며 앱에서 유지 관리해야 합니다.
<LineBreak/>
<LineBreak/>
목록에 추가하려면 목록을 선택한 다음 '목록에 추가' 버튼을 클릭하세요.
목록의 현재 내용을 보려면 목록을 선택한 다음 '목록 표시' 버튼을 클릭합니다.
목록에서 'sample.dat' 파일을 열려면 목록을 선택한 다음 '목록에서 열기' 버튼을 클릭합니다.
            </TextBlock>
            <RadioButton Name="mruRadioButton"
                Margin="0 10 0 0"
                GroupName="PersistenceList"
                IsChecked="True"
                Content="MRU" />
            <CheckBox Name="systemMRUCheckBox"
                Margin="30 0 0 0"
                IsChecked="True"
                Content="시스템 MRU에 추가" />
            <RadioButton
                Margin="0 10 0 0"
                GroupName="PersistenceList"
                Content="FAL" />
            <Button
                Margin="0 10 0 0"
                Content="목록에 추가"
                Click="addToListButton_Click" />
            <Button
                Margin="0 10 0 0"
                Content="목록 표시"
                Click="showListButton_Click" />
            <Button
                Margin="0 10 0 0"
                Content="목록에서 열기"
                Click="openFromListButton_Click" />
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage07.xaml.cs

using System;
using System.Text;
using Windows.Storage;
using Windows.Storage.AccessCache;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 7
    /// </summary>
    public sealed partial class SamplePage07 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        /// <summary>
        /// FA_E_MAX_PERSISTED_ITEMS_REACHED
        /// </summary>
        private const int FA_E_MAX_PERSISTED_ITEMS_REACHED = unchecked((int)0x80270220);

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage07()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage07()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 목록에 추가 버튼 클릭시 처리하기 - addToListButton_Click(sender, e)

        /// <summary>
        /// 목록에 추가 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void addToListButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                if(this.mruRadioButton.IsChecked.Value)
                {
                    RecentStorageItemVisibility visibility = this.systemMRUCheckBox.IsChecked.Value ? RecentStorageItemVisibility.AppAndSystem :
                                                                                                      RecentStorageItemVisibility.AppOnly;

                    this.mainPage.mruToken = StorageApplicationPermissions.MostRecentlyUsedList.Add(storageFile, storageFile.Name, visibility);

                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일이 MRU 목록에 추가되었고 토큰이 저장되었습니다.",
                        NotifyType.StatusMessage
                    );
                }
                else
                {
                    try
                    {
                        this.mainPage.falToken = StorageApplicationPermissions.FutureAccessList.Add(storageFile, storageFile.Name);

                        this.mainPage.ShowStatusMessage
                        (
                            $"'{storageFile.Name}' 파일이 FAL 목록에 추가되었고 토큰이 저장되었습니다.",
                            NotifyType.StatusMessage
                        );
                    }
                    catch(Exception exception) when (exception.HResult == FA_E_MAX_PERSISTED_ITEMS_REACHED)
                    {
                        this.mainPage.ShowStatusMessage
                        (
                            $"FAL 목록이 가득차서 '{storageFile.Name}' 파일이 FAL 목록에 추가되지 않았습니다.",
                            NotifyType.ErrorMessage
                        );
                    }
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
        #region 목록 표시 버튼 클릭시 처리하기 - showListButton_Click(sender, e)

        /// <summary>
        /// 목록 표시 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void showListButton_Click(object sender, RoutedEventArgs e)
        {
            AccessListEntryView entryView;

            string listName;

            if(this.mruRadioButton.IsChecked.Value)
            {
                listName = "MRU";

                entryView = StorageApplicationPermissions.MostRecentlyUsedList.Entries;
            }
            else
            {
                listName = "FAL";

                entryView = StorageApplicationPermissions.FutureAccessList.Entries;
            }

            if(entryView.Count > 0)
            {
                StringBuilder stringBuilder = new StringBuilder($"{listName} 목록은 다음 항목을 포함합니다 : ");

                foreach(AccessListEntry entry in entryView)
                {
                    stringBuilder.AppendLine();

                    stringBuilder.Append(entry.Metadata);
                }

                this.mainPage.ShowStatusMessage(stringBuilder.ToString(), NotifyType.StatusMessage);
            }
            else
            {
                this.mainPage.ShowStatusMessage
                (
                    $"{listName} 목록이 비어 있습니다.",
                    NotifyType.ErrorMessage
                );
            }
        }

        #endregion
        #region 목록에서 열기 버튼 클릭시 처리하기 - openFromListButton_Click(sender, e)

        /// <summary>
        /// 목록에서 열기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void openFromListButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = null;

            if(this.mruRadioButton.IsChecked.Value)
            {
                if(this.mainPage.mruToken != null)
                {
                    if(StorageApplicationPermissions.MostRecentlyUsedList.ContainsItem(this.mainPage.mruToken))
                    {
                        storageFile = await StorageApplicationPermissions.MostRecentlyUsedList.GetFileAsync(this.mainPage.mruToken);
                    }
                    else
                    {
                        this.mainPage.ShowStatusMessage
                        (
                            "토큰이 더 이상 유효하지 않습니다.",
                            NotifyType.ErrorMessage
                        );
                    }
                }
                else
                {
                    this.mainPage.ShowStatusMessage
                    (
                        "이 작업은 토큰을 요구합니다. 먼저 MRU 목록에 파일을 추가합니다.",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                if(this.mainPage.falToken != null)
                {
                    storageFile = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(this.mainPage.falToken);
                }
                else
                {
                    this.mainPage.ShowStatusMessage
                    (
                        "이 작업은 토큰을 요구합니다. 먼저 FAL 목록에 파일을 추가합니다.",
                        NotifyType.ErrorMessage
                    );
                }
            }

            if(storageFile != null)
            {
                try
                {
                    string fileContent = await FileIO.ReadTextAsync(storageFile);
 
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일이 저장된 토큰에 의해 열렸습니다. 다음 텍스트를 포함합니다 :\n{fileContent}",
                        NotifyType.StatusMessage
                    );

                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"목록에서 열려진 파일을 읽는 중 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
        }

        #endregion
    }
}

 

▶ SamplePage08.xaml

<Page x:Class="TestProject.SamplePage08"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
                'sample.dat' 파일을 사진 라이브러리에 복사하려면 '파일 복사' 버튼을 클릭하십시오.
            </TextBlock>
            <Button
                Margin="0 10 0 0"
                Content="파일 복사"
                Click="copyFileButton_Click" />
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage08.xaml.cs

using System;
using System.IO;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 8
    /// </summary>
    public sealed partial class SamplePage08 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage08()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage08()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 발생자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 파일 복사 버튼 클릭시 처리하기 - copyFileButton_Click(sender, e)

        /// <summary>
        /// 파일 복사 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void copyFileButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile sourceStorageFile = this.mainPage.SampleStorageFile;

            if(sourceStorageFile != null)
            {
                try
                {
                    StorageFolder stroageFolder = await KnownFolders.GetFolderForUserAsync(null /* 현재 사용자 */, KnownFolderId.PicturesLibrary);

                    StorageFile targetStorageFile = await sourceStorageFile.CopyAsync
                    (
                        stroageFolder,
                        "sample-copy.dat",
                        NameCollisionOption.ReplaceExisting
                    );

                    this.mainPage.ShowStatusMessage
                    (
                        $"'{sourceStorageFile.Name}' 파일이 복사되었고 새 파일명은 '{targetStorageFile.Name}' 입니다.",
                        NotifyType.StatusMessage
                    );
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{sourceStorageFile.Name}' 파일 복사중 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
    }
}

 

▶ SamplePage09.xaml

<Page x:Class="TestProject.SamplePage09"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
파일을 선택하고 'sample.dat'와 비교하려면 '파일 비교'를 클릭하십시오.
예를 들어, 저장 시나리오에서 사용자가 동일한 파일을 덮어쓰는지 또는 새 파일을 생성하는지 결정할 수 있습니다.
            </TextBlock>
            <Button
                Margin="0 10 0 0"
                Content="파일 비교"
                Click="compareFileButton_Click" />
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage09.xaml.cs

using System;
using System.IO;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 9
    /// </summary>
    public sealed partial class SamplePage09 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage09()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage09()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 파일 비교 버튼 클릭시 처리하기 - compareFileButton_Click(sender, e)

        /// <summary>
        /// 파일 비교 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void compareFileButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile sourceStorageFile = this.mainPage.SampleStorageFile;

            if(sourceStorageFile != null)
            {
                FileOpenPicker fileOpenPicker = new FileOpenPicker();

                fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;

                fileOpenPicker.FileTypeFilter.Add("*");

                StorageFile targetStorageFile = await fileOpenPicker.PickSingleFileAsync();

                if(targetStorageFile != null)
                {
                    try
                    {
                        if(sourceStorageFile.IsEqual(targetStorageFile))
                        {
                            this.mainPage.ShowStatusMessage("파일들이 같습니다.", NotifyType.StatusMessage);
                        }
                        else
                        {
                            this.mainPage.ShowStatusMessage("파일들이 같지 않습니다.", NotifyType.StatusMessage);
                        }
                    }
                    catch(FileNotFoundException)
                    {
                        this.mainPage.ShowFileNotFoundStatusMessage();
                    }
                }
                else
                {
                    this.mainPage.ShowStatusMessage("작업이 취소되었습니다.", NotifyType.StatusMessage);
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
    }
}

 

▶ SamplePage10.xaml

<Page x:Class="TestProject.SamplePage10"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
                'sample.dat' 파일을 삭제하려면 '파일 삭제' 버튼을 클릭하세요.
            </TextBlock>
            <Button
                Margin="0 10 0 0"
                Content="파일 삭제"
                Click="deleteFileButton_Click" />
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage10.xaml.cs

using System;
using System.IO;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 10
    /// </summary>
    public sealed partial class SamplePage10 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage10()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage10()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.mainPage.ValidateFile();
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 파일 삭제 버튼 클릭시 처리하기 - deleteFileButton_Click(sender, e)

        /// <summary>
        /// 파일 삭제 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void deleteFileButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFile storageFile = this.mainPage.SampleStorageFile;

            if(storageFile != null)
            {
                try
                {
                    string filename = storageFile.Name;

                    await storageFile.DeleteAsync();

                    this.mainPage.SampleStorageFile = null;

                    this.mainPage.ShowStatusMessage($"'{filename}' 파일을 삭제했습니다.", NotifyType.StatusMessage);
                }
                catch(FileNotFoundException)
                {
                    this.mainPage.ShowFileNotFoundStatusMessage();
                }
                catch(Exception exception)
                {
                    this.mainPage.ShowStatusMessage
                    (
                        $"'{storageFile.Name}' 파일 삭제시 에러가 발생했습니다 : {exception.Message}",
                        NotifyType.ErrorMessage
                    );
                }
            }
            else
            {
                this.mainPage.ShowFileNotFoundStatusMessage();
            }
        }

        #endregion
    }
}

 

▶ SamplePage11.xaml

<Page x:Class="TestProject.SamplePage11"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollViewer
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
        Padding="10">
        <StackPanel>
            <TextBlock
                Style="{StaticResource SampleHeaderTextStyle}"
                Text="설명 : " />
            <TextBlock
                Style="{StaticResource ScenarioDescriptionTextStyle}"
                TextWrapping="Wrap">
'sample.dat' 파일을 검색하려면 '파일 가져오기'를 클릭하십시오.
TryGetItemAsync 메서드는 파일을 가져올 수 없는 경우 예외를 throw하지 않습니다.
            </TextBlock>
            <Button
                Margin="0 10 0 0"
                Content="파일 가져오기"
                Click="getFileButton_Click" />
        </StackPanel>
    </ScrollViewer>
</Page>

 

▶ SamplePage11.xaml.cs

using System;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace TestProject
{
    /// <summary>
    /// 샘플 페이지 11
    /// </summary>
    public sealed partial class SamplePage11 : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 메인 페이지
        /// </summary>
        private MainPage mainPage = MainPage.CurrentPage;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - SamplePage11()

        /// <summary>
        /// 생성자
        /// </summary>
        public SamplePage11()
        {
            InitializeComponent();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 파일 가져오기 버튼 클릭시 처리하기 - getFileButton_Click(sender, e)

        /// <summary>
        /// 파일 가져오기 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private async void getFileButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null /* 현재 사용자 */, KnownFolderId.PicturesLibrary);

            StorageFile storageFile = await storageFolder.TryGetItemAsync("sample.dat") as StorageFile;

            if(storageFile != null)
            {
                this.mainPage.ShowStatusMessage($"작업 결과 : {storageFile.Name}", NotifyType.StatusMessage);
            }
            else
            {
                this.mainPage.ShowStatusMessage("작업 결과 : null", NotifyType.StatusMessage);
            }
        }

        #endregion
    }
}

 

▶ MainPage.xaml

<Page x:Class="TestProject.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestProject"
    FontFamily="나눔고딕코딩"
    FontSize="16">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*"    />
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0"
            Orientation="Horizontal">
            <Border Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}">
                <ToggleButton
                    Style="{StaticResource SymbolButton}"
                    VerticalAlignment="Center"
                    Foreground="{ThemeResource ApplicationForegroundThemeBrush}"
                    Click="paneToggleButton_Click">
                    <ToggleButton.Content>
                        <FontIcon
                            FontFamily="Segoe MDL2 Assets"
                            Glyph="&#xE700;" />
                    </ToggleButton.Content>
                </ToggleButton>
            </Border>
            <Image
                VerticalAlignment="Center"
                Margin="5 5 0 0"
                AutomationProperties.AccessibilityView="Raw"
                Stretch="None"
                Source="IMAGE/windows-sdk.png" />
            <TextBlock
                Style="{StaticResource TagLineTextStyle}"
                VerticalAlignment="Center"
                Margin="5 0 0 0"
                Text="유니버셜 윈도우즈 플랫폼 예제" />
        </StackPanel>
        <SplitView Name="splitView" Grid.Row="1"
            DisplayMode="Inline"
            IsPaneOpen="True">
            <SplitView.Pane>
                <RelativePanel Margin="10 0 0 0">
                    <TextBlock Name="sampleTitle"
                        Style="{StaticResource SampleHeaderTextStyle}"
                        Margin="0 10 0 0"
                        TextWrapping="Wrap"
                        Text="파일 액세스 예제" />
                    <ListBox Name="listBox"
                        RelativePanel.Below="sampleTitle"
                        RelativePanel.AlignBottomWithPanel="True"
                        HorizontalAlignment="Left"
                        VerticalAlignment="Top"
                        Margin="0 10 0 0"
                        BorderThickness="0"
                        Background="Transparent"
                        SelectionMode="Single"
                        SelectionChanged="listBox_SelectionChanged">
                        <ListBox.ItemTemplate>
                            <DataTemplate x:DataType="local:Scenario">
                                <TextBlock Text="{x:Bind Title}" />
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </RelativePanel>
            </SplitView.Pane>
            <RelativePanel>
                <Frame Name="frame"
                    RelativePanel.AlignLeftWithPanel="True"
                    RelativePanel.AlignRightWithPanel="True"
                    RelativePanel.AlignTopWithPanel="True"
                    RelativePanel.Above="statusStackPanel"
                    Margin="5" />
                <StackPanel Name="statusStackPanel"
                    Orientation="Vertical"
                    RelativePanel.AlignLeftWithPanel="True"
                    RelativePanel.AlignRightWithPanel="True"
                    RelativePanel.AlignBottomWithPanel="True">
                    <TextBlock
                        Margin="10 0 0 10"
                        TextWrapping="Wrap"
                        Text="상태 : " />
                    <Border Name="statusBorder"
                        Margin="0 0 0 0">
                        <ScrollViewer
                            VerticalScrollMode="Auto"
                            VerticalScrollBarVisibility="Auto"
                            MaxHeight="200">
                            <TextBlock Name="statusTextBlock"
                                AutomationProperties.LiveSetting="Assertive"
                                Margin="10 10 10 20"
                                MaxWidth="{Binding ElementName=Splitter, Path=ActualWidth}"
                                TextWrapping="Wrap"
                                FontWeight="Bold" />
                        </ScrollViewer>
                    </Border>
                </StackPanel>
            </RelativePanel>
        </SplitView>
    </Grid>
</Page>

 

▶ MainPage.xaml.cs

using System;
using System.Collections.Generic;
using Windows.Foundation;
using Windows.Graphics.Display;
using Windows.Security.Cryptography;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI;
using Windows.UI.Core;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Automation.Peers;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace TestProject
{
    /// <summary>
    /// 메인 페이지
    /// </summary>
    public sealed partial class MainPage : Page
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// 현재 페이지
        /// </summary>
        public static MainPage CurrentPage;

        /// <summary>
        /// 파일명
        /// </summary>
        public static readonly string FileName = "sample.dat";

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Instance
        //////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 시나리오 리스트
        /// </summary>
        private List<Scenario> scenarioList = new List<Scenario>
        {
            new Scenario() { Title = "파일 생성"                                   , ClassType = typeof(SamplePage01) },
            new Scenario() { Title = "파일의 부모 폴더 조회"                       , ClassType = typeof(SamplePage02) },
            new Scenario() { Title = "파일에 텍스트 쓰기/읽기"                     , ClassType = typeof(SamplePage03) },
            new Scenario() { Title = "파일에 바이트 쓰기/읽기"                     , ClassType = typeof(SamplePage04) },
            new Scenario() { Title = "스트림을 사용해 쓰기/읽기"                   , ClassType = typeof(SamplePage05) },
            new Scenario() { Title = "파일 속성 표시"                              , ClassType = typeof(SamplePage06) },
            new Scenario() { Title = "향후 사용을 위해 저장소 항목에 지속적 액세스", ClassType = typeof(SamplePage07) },
            new Scenario() { Title = "파일 복사"                                   , ClassType = typeof(SamplePage08) },
            new Scenario() { Title = "동일 파일 확인을 위해 두 파일 비교"          , ClassType = typeof(SamplePage09) },
            new Scenario() { Title = "파일 삭제"                                   , ClassType = typeof(SamplePage10) },
            new Scenario() { Title = "실패시 오류없이 파일 조회 시도"              , ClassType = typeof(SamplePage11) }
        };

        /// <summary>
        /// 샘플 저장소 파일
        /// </summary>
        public StorageFile SampleStorageFile = null;

        /// <summary>
        /// MRU 토큰
        /// </summary>
        public string mruToken = null;

        /// <summary>
        /// FAL 토큰
        /// </summary>
        public string falToken = null;

        /// <summary>
        /// E_NO_UNICODE_TRANSLATION
        /// </summary>
        public const int E_NO_UNICODE_TRANSLATION = unchecked((int)0x80070459);

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainPage()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainPage()
        {
            InitializeComponent();

            #region 윈도우 크기를 설정한다.

            double width  = 800d;
            double height = 600d;

            double dpi = (double)DisplayInformation.GetForCurrentView().LogicalDpi;

            ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize;

            Size windowSize = new Size(width * 96d / dpi, height * 96d / dpi);

            ApplicationView.PreferredLaunchViewSize = windowSize;

            Window.Current.Activate();

            ApplicationView.GetForCurrentView().TryResizeView(windowSize);

            #endregion
            #region 윈도우 제목을 설정한다.

            ApplicationView.GetForCurrentView().Title = "StorageFile 클래스 사용하기";

            #endregion

            CurrentPage = this;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Internal

        #region 버퍼 구하기 - GetBuffer(source)

        /// <summary>
        /// 버퍼 구하기
        /// </summary>
        /// <param name="source">소스 문자열</param>
        /// <returns>버퍼</returns>
        internal static IBuffer GetBuffer(string source)
        {
            if(string.IsNullOrEmpty(source))
            {
                return new Windows.Storage.Streams.Buffer(0);
            }
            else
            {
                return CryptographicBuffer.ConvertStringToBinary(source, BinaryStringEncoding.Utf8);
            }
        }

        #endregion
        #region 문자열 구하기 - GetString(buffer)

        /// <summary>
        /// 문자열 구하기
        /// </summary>
        /// <param name="buffer">버퍼</param>
        /// <returns>문자열</returns>
        internal static string GetString(IBuffer buffer)
        {
            // 버퍼가 적절히 인코딩되지 않는 경우 E_NO_UNICODE_TRANSLATION 예외가 발생한다.
            return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, buffer);
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Instance
        //////////////////////////////////////////////////////////////////////////////// Internal

        #region 파일 부재 상태 메시지 표시하기 - ShowFileNotFoundStatusMessage()

        /// <summary>
        /// 파일 부재 상태 메시지 표시하기
        /// </summary>
        internal void ShowFileNotFoundStatusMessage()
        {
            ShowStatusMessage
            (
                $"'{FileName}' 파일이 없습니다. 1번 시나리오를 사용해 이 파일을 생성하십시오.",
                NotifyType.ErrorMessage
            );
        }

        #endregion
        #region 파일 검증하기 - ValidateFile()

        /// <summary>
        /// 파일 검증하기
        /// </summary>
        internal async void ValidateFile()
        {
            StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null /* 현재 사용자 */, KnownFolderId.PicturesLibrary);

            SampleStorageFile = (await storageFolder.TryGetItemAsync(FileName)) as StorageFile;

            if(SampleStorageFile == null)
            {
                ShowFileNotFoundStatusMessage();
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Protected

        #region 탐색되는 경우 처리하기 - OnNavigatedTo(e)

        /// <summary>
        /// 탐색되는 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            List<Scenario> sourceList = new List<Scenario>();

            int i = 1;

            foreach(Scenario scenario in scenarioList)
            {
                sourceList.Add
                (
                    new Scenario
                    {
                        Title     = $"{i++}) {scenario.Title}",
                        ClassType = scenario.ClassType
                    }
                );
            }

            this.listBox.ItemsSource = sourceList;

            if(Window.Current.Bounds.Width < 640)
            {
                this.listBox.SelectedIndex = -1;
            }
            else
            {
                this.listBox.SelectedIndex = 0;
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Private

        #region 창 토글 버튼 클릭시 처리하기 - paneToggleButton_Click(sender, e)

        /// <summary>
        /// 창 토글 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void paneToggleButton_Click(object sender, RoutedEventArgs e)
        {
            this.splitView.IsPaneOpen = !splitView.IsPaneOpen;
        }

        #endregion
        #region 리스트 박스 선택 변경시 처리하기 - listBox_SelectionChanged(sender, e)

        /// <summary>
        /// 리스트 박스 선택 변경시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ShowStatusMessage(string.Empty, NotifyType.StatusMessage);

            ListBox listBox = sender as ListBox;

            Scenario scenario = listBox.SelectedItem as Scenario;

            if(scenario != null)
            {
                this.frame.Navigate(scenario.ClassType);

                if(Window.Current.Bounds.Width < 640)
                {
                    this.splitView.IsPaneOpen = false;
                }
            }
        }

        #endregion
        #region 상태 메시지 업데이트하기 - UpdateStatusMessage(message, notifyType)

        /// <summary>
        /// 상태 메시지 업데이트하기
        /// </summary>
        /// <param name="message">메시지</param>
        /// <param name="notifyType">통지 타입</param>
        private void UpdateStatusMessage(string message, NotifyType notifyType)
        {
            switch(notifyType)
            {
                case NotifyType.StatusMessage :

                    this.statusBorder.Background = new SolidColorBrush(Colors.Green);

                    break;

                case NotifyType.ErrorMessage :

                    this.statusBorder.Background = new SolidColorBrush(Colors.Red);

                    break;
            }

            this.statusTextBlock.Text = message;

            this.statusBorder.Visibility = (this.statusTextBlock.Text != string.Empty) ? Visibility.Visible : Visibility.Collapsed;

            if(this.statusTextBlock.Text != string.Empty)
            {
                this.statusBorder.Visibility     = Visibility.Visible;
                this.statusStackPanel.Visibility = Visibility.Visible;
            }
            else
            {
                this.statusBorder.Visibility     = Visibility.Collapsed;
                this.statusStackPanel.Visibility = Visibility.Collapsed;
            }

            AutomationPeer peer = FrameworkElementAutomationPeer.FromElement(this.statusTextBlock);

            if(peer != null)
            {
                peer.RaiseAutomationEvent(AutomationEvents.LiveRegionChanged);
            }
        }

        #endregion
        #region 상태 메시지 표시하기 - ShowStatusMessage(message, notifyType)

        /// <summary>
        /// 상태 메시지 표시하기
        /// </summary>
        /// <param name="message">메시지</param>
        /// <param name="notifyType">통지 타입</param>
        public async void ShowStatusMessage(string message, NotifyType notifyType)
        {
            if(Dispatcher.HasThreadAccess)
            {
                UpdateStatusMessage(message, notifyType);
            }
            else
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => UpdateStatusMessage(message, notifyType));
            }
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요