PROGRAMMING WORKSHOP

VB.Net | System.IO ...VBA의 IO함수에 해당하는 것들

실버라이트페이지는 잠시 보류하고
본래의 VB.Net에 집중하자..
이유는 너무 많은 것을 하려고 하니..파워가 분산되기도 하지만
실버라이트는 현재의 버전상에서는 지금 하려는
File Stream에 관련된 작업을 하기가 여의치 않다
실버라이트는 보안관계상 사용자가 허용하는 한에서 컴퓨터의
[나의 문서]폴더와 관련한 시스템상에서 허용하는 폴더만 접근할수 있다
물론 차기 버전인 Silverlight 5.0에서는 이 부분도 모두 해제
하게 되었지만 5.0은 베타버전이고 아무튼 이런 저런 것이
번거롭다..그래서 잠시 보류하고
여기에서 사용하는 것은 WPF 폼 (윈도우폼의 XAML버전)을
(UNO-Daily를 만든 도구)주로 활용해보자
WPF나 SilverLight나 Window Phone7이나 모두 같은 부모에서
태어난(XAML문) 자식들이라서 어느 것으로 접근해도 괞찮다

VB.Net의 베이직을 먼저 하고 기초가 쌓인후에 다시 보는 것이 좋을 것 같다..
앞의 페이지는 그냥 그런 것이 있다는 정도로 하고..
VBA를 처음 시작하면서 신기해 하였던 것이 아마도 File I/O함수의
활용이였을 것이다

Sub SearchThisWorkBookPath() Dim sFileName As String, iX As Integer Dim oFile As New Collection, varX As Variant sFileName = Dir(ThisWorkbook.path & "\") Do While sFileName <> "" oFile.Add sFileName sFileName = Dir Loop With Worksheets.Add.Range("A1") For Each varX In oFile .Offset(iX) = varX iX = iX + 1 Next End With End Sub

와 같이 하면 통합문서가 있는 폴더의 화일을 찾아준다
혹은 FileSystemObject외부라이브러리 개체를 불러서
사용하기도 하였고

그럼 이와 같은 일을 하는 VB.Net..엄밀히 따지면
.Net FrameWork에서 이런 화일관련작업을 해주는 개체는
어디에서 보관하고 있나??
System.IO
라는 NameSpace의 이름하에 보관되어 있다
이것을 Imports시키고 사용하면 되는 것이다
이 System.IO내의 개체들은 좀더 파워풀하고 유용한 개체들이
널려있다

WPF 윈도우를 하나 만들어 가면서 이야기 하자
항상 주절주절떠드는 것이 스타일이 똑같다
System.IO 를 이야기한다고 이것만 하나 달랑이야기 하는스타일이
아니니..몇번을 보시면서 관련된 것을 골고루 즐기시기 바란다
아마도 VBA에서도 많이 해본 화일시스템을 시트에 뿌리던가
사용자정의폼에 뿌리던가 재귀프로시져등을 사용하면서 번접을 떨었었다
WPF의 TreeView콘트롤에 적절히 화일시스템을 나타내는 것을 간단히 구현하면서
System.IO가 갖고 있는 개체들을 살펴보는 것이다

<Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="UNO_ProgrammingWorkShop" Height="305" Width="500"> <Grid> <TreeView x:Name="TreeView1" Margin="0,0,115,0" /> <Grid.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF068BA3" Offset="0" /> <GradientStop Color="White" Offset="1" /> </LinearGradientBrush> </Grid.Background> </Grid> </Window>

위의 코드가 소위 말하는 XML문형식으로 작성되는 XAML언어인 것이다
위와 같이 하면 디자인 모드에서 아래와 같이 만들어진것이다



위와 같이 XMAL문으로 직접손으로 작성해도 되고
엑셀의 UserForm에 콘트롤 마우스로 끌어다 놓듯이 끌어 놓아도 마찬가지로
만들어지면서 XMAL문이 자동으로 작성되기도 하고
아무튼 얼마나 능숙하냐에 따라서 두방법을 같이 사용해도좋고..
XAML문만 작성해도 되고..콘트롤을 끌어다 놓는 방법도 좋고
XAML문으로 작성하는 것이 능숙하면 속도가 빠르다고 할 수 있을 것이고..
아무튼 위와 같이 한후
엑셀의 UserForm애서 Initialize이벤트에서 TreeView에 정보를
프로그래밍적으로 쏟아 붙듯이
위의 폼도 Window폼의 Loaded이벤트프로시져에서 VB로 쏟아 부면 되는 것이고
결과는 아래와 같다



System.IO.DriveInfo 개체는
컴퓨터의 드라이브에 대한 모든 정보를 제공해준다

컴퓨터내의 모든 드라이브를 집합체로 갖여 올수 있는 것은
System.IO.DriveInfo.GetDrives() 로 얻어오거나
또 다른 개체에서 제공하는
My.Computer.FileSystem.Drives 로 얻어오거나 할수 있다
My라는 NameSpace는 현재 작성중인 Application등의 개체를 관리해주는
또 다른 편리한 것이다..나중에 자주 나올 것이다
통합문서에서 편리하게 ThisWorkBook.Path 등과 같이 현재의 통합문서를
기준으로 개체에 접근하거나..
WorkSheet개체내의 모듈시트에서 Me.UsedRange같이 다른 개체를 편리하게
접근하게 하는 것과 비슷한것이 My(개체는 아니지만 개체를 관리하는 NameSpace)라는 것을
기억해두면 편리하게 사용할수 있다

For Each drive As DriveInfo In My.Computer.FileSystem.Drives (혹은 driveinfo.getdrives())
   Dim oNode = New TreeViewItem()
   With oNode
     .Header = drive
     .Tag = drive
     .Items.Add(oDummyNode)
   End With
	 TreeView1.Items.Add(oNode)
Next

For Each drive As DriveInfo In DriveInfo.GetDrives()
...
...
Next

위와 같이 InLine상에서 변수선언하는것은 VB.Net의 문법중의 하나라는 것
기억하시고 계실 것이고..
이렇게 순환하면 프로그램이 실행되는 컴퓨터내의 모든 드라이버를 얻을수 있는것
이것을 TreeView콘트롤에 뿌려주면 되는것이다
모든 것이 개체화되어 있다고 하였으니
TreeView콘트롤내의 잔 가지(Node)도 역시 개체이다
그래서 개체를 생성하여야 한다는 것!!잊지 마시고
Dim oNode=New TreeViewItem() 이라고 하면 가지(Node)가 생성된다 기존의 윈도우에서의 잔가지는 TreeNode라는 이름이였으나 여기에서는
쌩뚱맞게 TreeViewItem이라고
한다..이름이 그렇게 제각각이니 좀 헷갈리지만 상상력을 발휘하여
찾으면 된다
Item이라는 것을 집합체를 구성하는 개체들을 접근할때 많이 사용하니
이 단어를 기억하고 있으면 접근 하기 쉬워진다
잔가지 TreeViewItem개체를 생성하여 oNode변수에 담았으니
oNode의 속성에 값을 DriveInfo개체, 즉 drive라는 변수에 담긴것을
뿌려주면 된다
.Header라는 속성은 윈도우프로그램의 Text에 해당한다..
Caption, Text,Value등등과 유사한 개체다..아하..WPF의 TreeView개체를
구성하는 잔가지들 TreeViewItem에 값을 주려면 Header속성을 사용하는구나
로 알면 된다

이렇게 골치아픈 것을 왜 하나??라고 하시면
비교하여 엑셀이 얼마나 간편하고 편리한 개발도구인지 새삼 자꾸느끼시라는
의미도 크다는 점 아시면서 하시면 흥미로울 것이다

엑셀프로그래밍에서
Recursive Procedure 재귀프로시져 를 자주 했었다
아마도 재귀프로시져로 드라이브전체의 폴더와 화일을 찾아내는데는
한참을 버벅거렸던 기억이 날 것이다
재귀용법에 대한 이해를 위한 것이지, 바람직하지 않은 방법이다
한꺼번에 한번에 죄다 불러들이는 것 보다는
필요에 따라서 나누어서 불러 들이는 것이 바람직할 것이다

폼이 로딩될때..
Drive이름만 폼의 Treeview에 올려서 초기화시킨다
아주 간단하게 가볍에 로딩 될 것이다
아래의 그림과 같이 달랑 드라이브명만 나타나게 한다


이렇게 된 상태에서 이제 중요한 일을 해야 한다
각각의 TreeviewItem을 크릭할때마다 어떤 반응이 일어나야 한다
이 반응을 제대로 받아서 처리를 해주지 못한다면
먹통이고..그냥 그림일 뿐이다
세상의 모든 컴퓨터 프로그램은 얼마나 사용자의 자극에
반응을 민감하게 시키느냐가 관건이다...Interactive!!!
여기에서 엑셀의 이벤트프로시져가 자동으로 생각나면 다행이고..
뭔소린지 헷갈리면 문제고..

그래서 현대의 프로그램은 인터페이스를 디자인하고 구성하는 디자이너와
이것을 살아서 움직이게 하는 개발자..디벨롭퍼가 공동작업을 하게 되는 것이다
작은 소루션이야..디자이너도 되고 개발자도 되야겠지만..
두개의 기능을 혼자서 북치고 장구치고 다 처리한다면
DesignVeloper라고도 한다(Design+Developer)
세상이 바쁜 세상이니..멀티타스킹을 하려는 자세도 좋고
아무튼 우리는 프로그래머..개발자 입장이니까..어떻게 자극을 처리하느냐에
신경을 써야 한다
이런 측면에서 엑셀은 또 좋다..인터페이스가 이미 만들어져있으니
얼마나 좋은가..
셀에다가 결과를 팍팍 쏟아주면 된다..물론 디자인센스가 있다면
더욱 좋지만..
다른 개발환경은 안그렇다..만들어 그려 넣어야 한다..열심히..
잘못그리면 엉망이고..다행이 디자인쎈스가 있어서 잘하면 다행이고
C,D,E 드라이브가 있을때 D를 크릭하면 D이하의 폴더를 줄줄이 불러서
채워넣게 조치를 취해 주어야 하는 것이다

그런데 디자인 타임에 달랑 TreeView콘트롤만 화면에 올려놓고
폼이 Loading되면서 TreeView를 RunTime으로 구성하게 되니
이벤트프로시져를 도대체 어디에 만들어 주어야 하는가??
그것이 또하나의 프로그래밍의 재미있는 것들이다

WPF즉 XAML언어에서의 개체들은 모두가 Tree구조로 구성된다
부모밑에 자식있고, 자식밑에 또 손자있고 이렇게 개체속에 개체가
종속되어있다
물론 다른 프로그램도 그렇게 구성이 되지만 특히나 XAML언어로 구성된 개체들은
Tree구조..그 자체라고 보아야 한다
좀 따분하고 어려운 소리일수도 있겠다
이 페이지는 분명히 Syetem.IO를 이야기하겠다고 시작하고 또 주절주절
딴 소리를 하게 된다
그냥 상식적으로 접수하시고 System.IO를 잘 파악하여 이것을
VSTO같은 우리의 엑셀과 친근한 것을 할때 활용하면 된다
WPF는 그냥 잊어 먹으셔도 된다..System.IO 만 유용하게 잘 활용하시면 된다

***[LOG-IN]***