Hey, Scripting Guy!
전용 차선 이용
Microsoft Scripting Guys
몇 달 전 Scripting Guys 중 한 명은 여기 시애틀에서 새로운 경험을 했습니다. 미국 전역의 여러 도시에서 테스트 중인 시스템인 전자 통행 요금 징수 시스템을 이용한 것입니다. 이 시스템은 워싱턴 주에서는 Good to Go로 알려져 있습니다!
작동 원리는 다음과 같습니다. 우선 전자 장치를 구입하여 자동차 전면 유리에 장착합니다. 그리고 소액을 예치하는 계좌를 하나 개설합니다. 고속도로의 모니터링 장치 중 하나를 지나면 운전자의 계좌에서 요금이 자동으로 징수됩니다. 톨게이트에 정차할 필요 없이 고속도로 통행료를 지불할 수 있는 것입니다.
현재 통행료가 부과되는 많은 지역에서 카풀을 하는 사람들은 요금을 지불하지 않아도 됩니다. 하지만 Good to Go!에서 흥미로운 것은 이 시스템이 카풀 차선에서만 작동한다는 것입니다. 이게 무슨 의미인지 의아해 할 수 있습니다. 카풀을 하면서 요금을 지불해야 한다면 누가 카풀을 하겠습니까? 물론 그렇지 않습니다. 이 시스템은 단독 승차하여 운전하면서 카풀 차선을 이용하고자 하는 사람들에게만 적용됩니다. 카풀 차선으로 가려고 하는 주요 이유는 이 차선에는 대체로 차량 수가 적기 때문입니다. 다들 정차해 있는데 실제로 움직이는 차선은 카풀 차선밖에 없는 경우도 있습니다.
앞에서 언급한 대로 이 시스템은 이미 수 천여 명이 등록했지만 현재 시험 운영 중입니다. 시애틀 지역에는 가려는 곳이 어디든 간에 전용 차선을 이용하기 위해 기꺼이 돈을 지불하려는 사람들이 많습니다.
이번 달 칼럼에서 Scripting Guys는 자체적인 작은 실험을 해보기로 결정했습니다. 이를 위해 Microsoft® Visual Basic® Express Edition이라는 전용 프로그램을 소개합니다. 이 프로그램의 가장 좋은 점 중 하나는 무료라는 것입니다. 이 정보를 어디에서 사용하든지, 얼마나 많은 사람들이 사용하든지 또는 어느 시간에 사용하든지 전혀 요금을 부과하지 않습니다. 훌륭하지 않습니까? 무엇인가 새로운 것을 배워야 한다는 측면에서 어느 정도 부담이 될 수도 있지만, 그만큼 가치가 있음을 알게 될 것입니다.
본격적으로 시작하기 전에 이 칼럼의 내용이 약간 범위를 벗어날 수 있음을 알려 드립니다. 일반적으로 Visual Basic 및 Visual C#®과 같은 Visual Studio® 제품은 TechNet Magazine이 아닌 MSDN® Magazine의 주제입니다. 그러나 MSDN과 TechNet은 하나의 큰 목표를 향해 가고 있으므로 여기에서 다루어도 별 무리가 없을 것으로 생각됩니다. 또한 개발자 도구로서 다루기도 하지만 기본적으로는 Windows® 시스템 관리자를 대상으로 하고 있습니다. 잠시 후면 어떤 의미인지 알게 될 것입니다.
지금부터 저와 함께 진행하려면 우선 Visual Basic을 설치해야 합니다. 여기서 잠깐! "이 제품이 없는데요!"라거나, "이 제품을 살 돈이 없어요!"라고 말하며 덮어 버리지 마십시오. Microsoft는
microsoft.com/express/download에서 무료로 다운로드할 수 있는 Visual Basic Express Edition을 제공합니다.
여기에서는 Visual Basic Express의 사용 방법에 대해 자세히 설명하지는 않습니다. 도움말에 자습서가 있으며, 도움말 자체가 실제로 매우 잘 구성되어 있습니다. 믿어 보십시오. 이제 Visual Basic Express를 사용하여 Windows Vista®의 특정 문제를 푸는 방법을 설명합니다. 이 예제는 이전 버전의 Windows에서도 작동하기는 합니다. 그런 다음에는 계속해서 각자 사용하면 됩니다. 우리가 풀어 볼 문제는 "Windows Vista에서 파일 열기 대화 상자를 어떻게 열 것인가?"하는 것입니다.
몇 년 전 "How Can I Show Users a Dialog Box for Selecting Files(파일 선택 대화 상자를 사용자에게 표시하려면 어떻게 합니까)?" 칼럼의 스크립트에서 파일 열기 대화 상자를 여는 방법을 설명한 적이 있습니다.
microsoft.com/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx 참조). 이 글은 Windows Vista가 발표되기 오래 전인 2005년 1월에 게재되었습니다. 답은 UserAccounts.CommonDialog ActiveX
® 컨트롤을 사용하여 열려는 파일을 찾아볼 수 있는 파일 열기 대화 상자를 여는 것이었습니다. 하지만 이 컨트롤은 Windows Vista부터 Windows에서 제거되어 새로운 시스템에서는 이 방법을 더 이상 사용할 수 없습니다. 누구도 우리에게 이것이 좋은 생각인지 물어본 적은 없습니다. 다만, 이제는 VBScript를 사용하여 파일 열기 대화 상자를 여는 방법이 없다는 것입니다. 따라서 스크립트를 작성하는 대신 Visual Basic을 사용하여 응용 프로그램 작성하려고 합니다. 이 응용 프로그램이 수행할 작업 중 하나가 파일 열기 대화 상자를 여는 것입니다.
여기에서 보여 드릴 예제는 Visual Basic으로 완전한 응용 프로그램을 만드는 것입니다. 언뜻 들으면 매우 어려운 작업 같지만 Visual Basic Express를 사용하여 응용 프로그램을 만드는 것은 스크립트를 작성하는 것만큼 쉽다는 것을 알게 될 것입니다. 이 응용 프로그램은 파일 열기 대화 상자를 여는 단추를 클릭할 수 있는 창 또는 폼으로 구성됩니다. 그런 다음 이 대화 상자에서 텍스트 파일을 선택하면 응용 프로그램이 이러한 텍스트 파일을 읽고 내용 중 일부를 폼 내부에 표시합니다.
그럼 이제 시작해 보겠습니다. 우선 Visual Basic Express를 엽니다. 가장 먼저 파일 메뉴에서 새 프로젝트를 선택하여 새 프로젝트를 만듭니다. 그러면 새 프로젝트 대화 상자가 나타납니다. Visual Basic Express 2008 이전 버전을 사용하는 경우 여기의 그림과 약간 다를 수 있습니다. Windows Forms 응용 프로그램을 만들 것이므로 Windows Forms 응용 프로그램 템플릿을 선택하고 원하는 프로젝트 이름을 입력합니다. 여기에서는 그림 1에서 보는 바와 같이 ReadFiles라는 이름을 사용했습니다.
그림 1 Visual Basic에서 새 프로젝트 만들기(크게 보려면 이미지 클릭)
프로젝트를 처음 만들면 새 폼이 자동으로 제공됩니다. 우리가 만들려는 응용 프로그램은
그림 2와 같은 폼을 사용자에게 표시합니다. 앞에서 언급한 대로 이 폼에는 클릭하면 파일 열기 대화 상자(C:\Scripts 폴더가 열림)를 여는 단추가 포함됩니다. 사용자는 파일 시스템에 있는 하나 이상의 텍스트 파일을 선택할 수 있습니다. 그러면 응용 프로그램은 선택된 각 텍스트 파일에서 첫 줄을 읽어 그 결과를 폼의 목록 상자에 표시합니다. 이 과정을 어디선가 해본 적이 있다면 2008 Scripting Games의 Beginners Division
microsoft.com/technet/scriptcenter/funzone/games/games08/bevent3.mspx에 참가하셨을 것입니다.
그림 2 사용자에게 표시될 ReadFiles 폼
폼을 만들려면 도구 상자에서 컨트롤을 끌어 프로젝트 폼에 놓아야 합니다. 기본적으로 도구 상자는 Visual Basic 창의 왼쪽에 열려 있습니다. 도구 상자가 열려 있지 않다면 Visual Basic 작업 영역의 왼쪽에 있는 도구 상자 단추를 클릭하고 모든 Windows Forms를 확장합니다.) 도구 상자에서 단추를 클릭한 다음 폼까지 끌어서 원하는 크기로 단추를 만듭니다. 단추에 레이블을 추가하려면 방금 폼에 추가한 단추를 클릭하고 원하는 레이블을 입력합니다. 또는 기본적으로 Visual Basic 작업 영역의 하단 오른쪽에 있는 속성 대화 상자에서 텍스트 속성을 편집할 수도 있습니다. 여기에서는 단추 레이블로 Browse for Files를 입력했습니다. 이제 ListBox를 클릭한 다음 폼을 다시 클릭하고 마우스를 끌어 목록 상자를 만듭니다. 목록 상자를 사용하여 텍스트 파일에서 읽은 내용을 표시할 것입니다.
이로써 폼이 만들어졌습니다. 이제 단추를 클릭할 때 어떤 이벤트가 발생하도록 해야 합니다. 폼에 있는 단추 컨트롤을 두 번 클릭합니다. 그러면 이미 만들어진 새 서브루틴(Button1_Click 서브루틴)을 포함하는 코드 편집기가 열립니다.
Private Sub Button1_Click _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
End Sub
이 서브루틴은 폼에 있는 단추를 클릭할 때마다 실행됩니다. 보는 바와 같이 이 서브루틴은 현재 비어 있습니다. 버튼을 클릭했을 때 응용 프로그램에서 무엇을 해야 하는지 알려 주는 코드를 추가해야 합니다. 그렇다면 어떻게 해야 할까요? 우선 이 칼럼의 시작 부분에서 보여 주기로 약속했던 대로 파일 열기 대화 상자를 열도록 하겠습니다. Visual Basic으로 작업하는 거의 대부분의 경우와 마찬가지로 이를 위해 Microsoft .NET Framework를 사용합니다.
서브루틴 위쪽에 두 줄의 Imports 문을 추가합니다.
Imports System
Imports System.IO
이러한 구문은 .NET Framework 네임스페이스를 지정합니다. 원하는 클래스를 간단히 참조할 수 있도록 여기로 가져오기 위해 이러한 네임스페이스에 있는 클래스를 사용할 것입니다. 이러한 구문은 서브루틴 위쪽에 삽입해야 합니다. Imports 문은 전역입니다. 따라서 서브루틴이나 함수의 내부에 들어올 수 없고 외부에 있어야 합니다.
VBScript에서 Option Explicit 문을 스크립트의 상단에 추가하지 않는다면 변수를 명시적으로 선언하지 않아도 됩니다. Visual Basic에서는 자동으로 추가되므로 모든 변수를 선언해야 합니다. 여기에서는 OpenFileDialog 개체(파일 열기 대화 상자를 나타내는 개체)에 대한 참조를 포함하는 변수가 필요합니다.
Dim dlg As Windows.Forms.OpenFileDialog
이제 OpenFileDialog 유형의 변수를 선언(Dim)했으므로 다음과 같이 이 개체의 새 인스턴스를 만들 수 있습니다.
dlg = New OpenFileDialog()
하지만 아직 대화 상자를 표시하지 않았습니다. 우선 몇 가지 속성을 설정해야 합니다.
dlg.Multiselect = True
dlg.InitialDirectory = "c:\scripts"
dlg.Filter = "txt files (*.txt)|*.txt|" & _
"All files (*.*)|*.*"
Multiselect 속성은 사용자가 파일 열기 대화 상자에서 둘 이상의 파일을 선택할 수 있는지 여부를 지정합니다. 여기에서는 이것을 허용할 것이므로 이 속성을 True로 설정합니다. InitialDirectory 속성은 C:\Scripts로 설정합니다. 이 속성을 설정하지 않으면 대화 상자는 기본 컴퓨터 디렉터리로 열립니다.
마지막으로 Filter 속성을 설정합니다.
dlg.Filter = "txt files (*.txt)|*.txt|" & _
"All files (*.*)|*.*"
이 속성을 사용하여 대화 상자에 표시될 파일을 필터링합니다. 우리는 .txt 파일만 표시되도록 할 것입니다. 이러한 속성을 설정하면 그림 3과 같은 모양의 파일 열기 대화 상자가 됩니다.
그림 3 텍스트 파일만 표시하는 열기 대화 상자(크게 보려면 이미지 클릭)
이제 대화 상자를 표시하기만 하면 됩니다. 이 작업에서는 ShowDialog 메서드를 사용합니다.
ShowDialog 메서드는 사용자가 선택한 파일을 열기 위해 열기를 클릭했는지, 아니면 대화 상자를 닫기 위해 취소를 클릭했는지 나타내는 값을 반환합니다. 취소를 클릭하면 아무것도 발생하지 않아야 합니다. 따라서 If 문에 ShowDialog에 대한 호출을 추가하여 계속하기 전에 사용자가 열기를 클릭했는지 확인합니다.
If dlg.ShowDialog() = _
Windows.Forms.DialogResult.OK Then
지금까지는 Open 속성보다 OK 속성을 선택하는 경우가 많았습니다. 기본적으로 열기(Open) 단추는 확인(OK) 단추와 동일합니다. 여기에서는 사용자에게 "열기"라고 표시하는 것이 더 적절해 보일 뿐입니다.
이제 사용자가 대화 상자에서 어떤 파일을 선택했는지 알아야 합니다. 파일 이름은 OpenFileDialog 개체의 FileNames 속성에 포함되므로 이 속성에 포함된 모든 파일 이름을 읽도록 For Each 루프를 설정합니다.
For Each strName In dlg.FileNames
아차! strName을 선언하는 것을 잊었습니다.
이제 이러한 각 파일을 열고 읽어야 합니다. Visual Basic에서는 이를 위해 Using 블록을 사용합니다.
Using sr As StreamReader = File.OpenText(strName)
Using 블록은 실제로 VBScript에 존재하지 않으므로 VBScript 스크립터가 사용되는 것과 다릅니다. Visual Basic은 시스템 리소스 관리에 있어 많은 측면에서 VBScript보다 우수합니다. Using 문을 사용하는 목적은 블록을 빠져 나올 때 시스템 리소스를 확보하기 위해서 입니다. 이 경우 파일 내용 및 큰 메모리 블록을 계속 잡아 두지 않도록 합니다.
약간 복잡하게 생각될 수 있습니다. 하지만 Set 문을 살펴보십시오. 새 개체(이 경우 StreamReader 개체)의 인스턴스를 만들고 File.OpenText 메서드에서 반환된 텍스트 스트림에 간단히 지정하면 됩니다. OpenText를 열려는 파일(현재 루프를 거치는 FileNames 컬렉션의 파일)의 이름에 전달하게 됩니다.
따라서 StreamReader 변수인 sr이 파일의 내용을 포함합니다. 이제 또 하나의 변수가 필요합니다.
이 변수를 사용하여 방금 연 텍스트 파일의 첫 줄을 저장할 것입니다.
StreamReader 개체에 대해 ReadLine 메서드를 호출하여 파일에서 첫 줄을 읽습니다. StreamReader 개체는 파일의 내용을 포함합니다. 텍스트의 첫 줄을 strLine 변수에 저장합니다.
이제 ListBox 개체에 대해 Add 메서드를 호출하여 첫 줄을 목록 상자에 추가하면 됩니다.
ListBox1.Items.Add(strLine)
이 예제에서는 텍스트 파일의 전체 텍스트가 아닌 파일의 첫 줄만 필요하므로 StreamReader를 닫고 Using 블록을 닫을 수 있습니다.
이제 파일 열기 대화 상자에서 선택된 다음 파일을 계속해서 찾아 선택된 모든 파일을 읽고 모든 첫 줄을 목록 상자에 추가합니다. 완성된 코드는 그림 4와 같습니다.

그림 4 전체 ReadFiles 코드
Imports System
Imports System.IO
Public Class Form1
Private Sub Button1_Click _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim dlg As Windows.Forms.OpenFileDialog
Dim strName As String
dlg = New OpenFileDialog()
dlg.Multiselect = True
dlg.InitialDirectory = "c:\scripts"
dlg.Filter = "txt files (*.txt)|" & _
"*.txt|All files (*.*)|*.*"
If dlg.ShowDialog() = _
Windows.Forms.DialogResult.OK Then
For Each strName In dlg.FileNames
Using sr As StreamReader = _
File.OpenText(strName)
Dim strLine As String
strLine = sr.ReadLine()
ListBox1.Items.Add(strLine)
sr.Close()
End Using
Next
End If
End Sub
End Class
말씀드린 대로 응용 프로그램을 만드는 것이 스크립트를 작성하는 것보다 그렇게 어려운 일은 아닙니다.
F5(또는 디버깅 도구 모음의 디버깅 시작 단추)를 눌러 응용 프로그램을 테스트할 수 있습니다. 단추를 클릭한 다음 파일 열기 대화 상자에서 하나 이상의 파일을 선택하면 결과가 그림 5와 같이 나타나야 합니다.
그림 5 목록 상자에 표시된 선택 파일의 첫 줄
응용 프로그램이 의도한 대로 실행되면 빌드 메뉴에서 ReadFiles(또는 다른 프로젝트 이름) 빌드를 선택합니다. 그러면 다른 응용 프로그램과 마찬가지로 실행 가능하고 다른 사용자에게 배포할 수 있는 .exe 파일이 ReadFiles.exe 이름으로 생성됩니다.
파일 열기 대화 상자를 사용하는 것이 "전용 차선"을 이용하는 느낌과 같지 않을 수도 있습니다. 하지만 Windows Vista에서는 스크립트 작성을 통해 이와 같은 결과를 얻을 수 없다는 사실을 생각하면 간단한 응용 프로그램을 만드는 것은 작은 지출에 불과합니다. 실제로 전용 차선을 이용하려면 통행 요금을 지불해야 하는 것과 유사합니다. 약간 부담이 될 수도 있지만 결국에는 빠르게 원하는 곳으로 갈 수 있습니다.
이와 함께 Visual Basic을 사용하는 또 다른 이점은 이제 VBScript보다 강력한 도구를 사용하기 시작했다는 것이고, 편리한 사용자 인터페이스로 응용 프로그램을 쉽게 만들 수 있다는 것입니다. 시스템 관리자도 Visual Basic의 다른 여러 가지 용도를 찾을 수 있을 것입니다.
새로운 시스템의 전용 차선을 이용하기 위해 어떻게 운전해야 하는지 다시 배울 필요는 없습니다. 단지 새로운 차선에서는 정차 없이 앞의 차량들이 진행한다는 사실에만 익숙해지면 됩니다. 마찬가지로 VBScript를 알고 있다면 Visual Basic을 사용하기 위해 처음부터 완전히 새로운 언어를 배울 필요가 없습니다. 이 도구를 사용하여 더 많은 이점을 활용할 수 있다는 상황에만 적응하면 됩니다.
Scripting Guy는 Microsoft에서 고용되어 일하고 있는 Microsoft의 직원들입니다. 좋아하는 야구 경기와 기타 여러 활동을 하는 시간을 제외하고는 항상 TechNet 스크립트 센터를 운영합니다. 자세한 내용은
www.scriptingguys.com에서 확인하십시오.
© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다.