본 자료는
1. SmartUpdate 처리 방식
[CASE-1] 프로그램이 실행되면서 업데이트를 처리
[CASE-2] 항상 외부저장장치(SD Card, USB Memory)의 인식 결과에 따른 업데이트 처리
2. Flow Chart
3. 예제 프로그램 소스 코드
순서로 진행합니다.
- 프로그램 시작 시 최초로 한 번만 외부저장장치를 감지하고 마운트 되었을 때 사용자가 지정한 경로의 폴더가 있는지 확인하고 업데이트를 시작합니다.
- 프로그램을 시작하고 외부저장장치를 인식(마운트)하기까지의 지연 시간이 생기는 문제점이 있습니다. 그렇기 때문에 타이머를 이용하여 외부저장장치의 감지를 해제해야 합니다. 적용하는 프로그램의 용량과 Fat File System의 단편화로
인해 지연 시간이 달라지기 때문에 사용자가 적절하게 Timer의 interval값을 설정해야 합니다.
private void Form1_Load(object sender, EventArgs e)
{
smartMemory1.ExtStorageDetectionStart();
// 본 예제에서는 15초(15000ms)로 설정하였고 사용하실 때에는 프로그램에 맞춰 최적값으로 설정하여 사용
smartTimer1.Interval = 15000;
smartTimer1.Start();
private void smartTimer1_Tick(object sender, EventArgs e)
{
smartMemory1.ExtStorageDetectionStop();
smartTimer1.Stop();
private void UpdateCheckApply(string strDeviceName)
{
bRet = Directory.Exists(strDeviceName + "\\UpdateFiles");
if (bRet == true)
{
smartUpdate1.FromFilePath = strDeviceName + "\\UpdateFiles";
// 응용 프로그램이 종료된 후 업데이트 모듈이 업데이트를 시작하기까지의 지연 시간을 설정함
// 응용 프로그램의 용량 등(프로그램 복잡도)에 따라서 종료되는 지연 시간을 감안하여
// Interval을 충분한 값으로 설정하시기 바랍니다. (단위 : ms)
smartUpdate1.SetStartInterval = 3000;
// Update File을 확인하며 업데이트할 파일이 있을 경우 업데이트 시작
// 리턴값 : 업데이트할 파일이 있는 경우 True, 업데이트할 파일이 없는 경우 flase
if (smartUpdate1.Start() == true)
{
Application.Exit();
private void smartMemory1_EvtExternalStorageAttached(bool bAttached, string strDeviceName)
{
{
if (smartTimer1.IsStart == true)
{
UpdateCheckApply(strDeviceName);
[CASE-2] 항상 외부저장장치(SD Card, USB Memory)의 인식 결과에 따른 업데이트 처리
- 프로그램 시작 시 항상 외부저장장치를 감지하고 마운트 되었을 때 사용자가 지정한 경로의 폴더가 있는지 확인하고 업데이트를 시작합니다.
- 프로그램을 재실행하지 않아도 업데이트가 가능합니다.
private void Form1_Load(object sender, EventArgs e)
{
smartMemory1.ExtStorageDetectionStart();
private void UpdateCheckApply(string strDeviceName)
{
bRet = Directory.Exists(strDeviceName + "\\UpdateFiles");
if (bRet == true)
{
smartUpdate1.FromFilePath = strDeviceName + "\\UpdateFiles";
// 응용 프로그램이 종료된 후 업데이트 모듈이 업데이트를 시작하기까지의 지연 시간을 설정함
// 응용 프로그램의 용량 등(프로그램 복잡도)에 따라서 종료되는 지연 시간을 감안하여
// Interval을 충분한 값으로 설정하시기 바랍니다. (단위 : ms)
smartUpdate1.SetStartInterval = 3000;
// Update File을 확인하며 업데이트할 파일이 있을 경우 업데이트 시작
// 리턴값 : 업데이트할 파일이 있는 경우 True, 업데이트할 파일이 없는 경우 flase
if (smartUpdate1.Start() == true)
{
Application.Exit();
private void smartMemory1_EvtExternalStorageAttached(bool bAttached, string strDeviceName)
{
{
2. FLow Chart
1. 아래의 Flow Chart를 보면 [CASE-1]은 [CASE-2]의 내용을 포함하고 있고 [CASE-1]에서만 추가되는 부분은 타이머 관련 기능입니다.
2. Flow Chart에서 [CASE-1]과 [CASE-2]를 구분하고 나누는 부분은 다루지 않았지만 설정을 저장하는 파일을 읽고 쓰는 부분에 대해서는 예제 프로그램 코드에서 다루고 있으니 참고하시기를 바랍니다.
프로그램을 구성하실 때 아래 Flow Chart를 확인하시고 구성하시기 바랍니다.

3. 예제 프로그램 소스 코드
- 프로그램 시작 시 가장 먼저 ReadUpdateOption() 함수 호출을 통해 Option.ini 파일을 설정값을 읽어 업데이트 방식을 정합니다.
- Option 값이 설정되어 있지 않다면 설정 버튼을 눌러 OptionSetting Form을 열어 WriteUpdateOption() 함수 호출을 통해 업데이트 방식을 설정합니다.

① : 설정 버튼을 클릭하여 modal창 열기
② : 원하는 방식을 선택하여 설정하기
private string m_strOptionValue;
private void Form1_Load(object sender, EventArgs e)
{
smartForm1.Show(0);
// SmartUpdate의 초기값을 설정
UpdateInit();
// 업데이트 방식 설정 불러오는 함수
ReadUpdateOption();
private void UpdateInit()
{
smartUpdate1.TitleTextColor = Color.White;
smartUpdate1.CompanyText = "HNS";
smartUpdate1.CompanyTextColor = Color.White;
smartUpdate1.MessageText = "응용 프로그램을 업데이트 중...";
smartUpdate1.MessageTextColor = Color.Black;
private void ReadUpdateOption()
{
SmartX.SmartFile.GetPrivateProfileString("UpdateOption", "Option", "Failed", out m_strOptionValue, "Flash Disk\\UpdateOption\\Option.ini");
smartLabel1.Text = m_strOptionValue;
// 읽어온 설정값에 따라 업데이트 방법을 변경
// "FormLoad" : 프로그램이 실행될 때 업데이트 처리
// "Always" : 항상 외부저장장치의 인식에 따른 업데이트 처리
if (m_strOptionValue == "FormLoad")
{
smartMemory1.ExtStorageDetectionStart();
// Interval값을 조절하여 FormLoad 이후 언제까지 이벤트를 활성화할지 정함. (단위 : ms)
smartTimer1.Interval = 15000;
smartTimer1.Start();
else if (m_strOptionValue == "Always")
{
smartMemory1.ExtStorageDetectionStart();
private void smartTimer1_Tick(object sender, EventArgs e)
{
smartMemory1.ExtStorageDetectionStop();
// 타이머 종료
smartTimer1.Stop();
private void smartButton1_Click(object sender, EventArgs e)
{
smartForm1.ShowDialog(typeof(Form2));
private bool m_bUpdateStatus;
private void UpdateCheckApply(string strDeviceName)
{
bRet = Directory.Exists(strDeviceName + "\\UpdateFiles");
if (bRet == true)
{
smartUpdate1.FromFilePath = strDeviceName + "\\UpdateFiles";
// 응용 프로그램이 종료된 후 업데이트 모듈이 업데이트를 시작하기까지의 지연 시간을 설정함
// 응용 프로그램의 용량 등(프로그램 복잡도)에 따라서 종료되는 지연 시간을 감안하여
// Interval을 충분한 값으로 설정하시기 바랍니다. (단위 : ms)
smartUpdate1.SetStartInterval = 3000;
// Update File 을 확인하며 업데이트할 파일이 있을 경우 업데이트 시작
// 리턴값 : 업데이트할 파일이 있는 경우 True, 업데이트할 파일이 없는 경우 flase
if (smartUpdate1.Start() == true)
{
Application.Exit();
private void smartMemory1_EvtExternalStorageAttached(bool bAttached, string strDeviceName)
{
{
{
if (smartTimer1.IsStart == true)
{
UpdateCheckApply(strDeviceName);
private void Form1_Closing(object sender, CancelEventArgs e)
{
smartMemory1.ExtStorageDetectionStop();
smartMemory1.Release();
OptionSetting Form
private string m_strOptionValue;
private void Form2_Load(object sender, EventArgs e)
{
smartRadioButton2.GroupID = 1;
// 업데이트 방식 설정 불러오는 함수
ReadUpdateOption();
private void smartButton1_Click(object sender, EventArgs e)
{
WriteUpdateOption();
Close();
private void smartButton2_Click(object sender, EventArgs e)
{
private void ReadUpdateOption()
{
SmartX.SmartFile.GetPrivateProfileString("UpdateOption", "Option", "Failed", out m_strOptionValue, "FlashDisk\\UpdateOption\\Option.ini");
// 읽어온 설정값으로 라디오 버튼의 활성화
if (m_strOptionValue == "FormLoad")
{
else if (m_strOptionValue == "Always")
{
else
{
smartRadioButton2.Checked = false;
private void WriteUpdateOption()
{
if (smartRadioButton1.Checked == true)
{
else if (smartRadioButton2.Checked == true)
{