- 1 - C# Programming 고급 이현정 hjyi@hotmail.com MCT/MCSD/MCAD/MCSD.NET
교재목차 - 2-1부 C# 언어 1장 C, C++ 그리고 C# 2장 Hello, C#! 3장변수와자료형 4장연산자 5장흐름제어 6장메쏘드 7장클래스 8장배열과컬렉션 9장속성과인덱서 10장델리게이트와이벤트 11장예외처리 12장특성 13장일반화프로그래밍 2부.NET 프레임워크활용 14 장비주얼 C# 익스프레스시작하기 15 장 C# 윈도우프로그래밍의기초 16 장메모장만들기 17 장파일관리자만들기 - Part 1 18 장파일관리자만들기 - Part 2 19 장 MyCanvas - GDI+ 20 장데이터베이스와 ADO.NET 21 장 ADO.NET 과함께하는 MyFriends 프로젝트 22 장쓰레드 (Thread) 23 장네트워크프로그래밍 24 장컴포넌트프로그래밍 25 장.NET 리모팅 26 장이책에서다루지못한것들
목차 Day1 Day2 Day3 Day4 Day5 파일다루기 Serialization Assembly 멀티쓰레드프로그래밍.NET 네트워크프로그래밍 -I.NET 네트워크프로그래밍 -II.NET 리모팅 Window Form 프로그램소개 UI 구현 / 대화상자 GDI+ 소개 배포 - 3 -
- 4 - 파일다루기 (17장-18장파일관리자만들기 ) 디렉토리다루기 파일다루기 FileSystemWatcher Reader/Writer로파일다루기 StreamReader/StreamWriter BinaryReader/BinaryWriter
파일및디렉토리다루기 - 5-1. 파일과디렉토리관련클래스 2. Directory와 DirectoryInfo 클래스 2.1 DirectoryInfo 사용예제 2.2 디렉토리관리예제 2.3 디렉토리탐색하기 (dir) 3. File과 FileInfo 클래스 3.1 FileInfo 사용예제 3.2 FileAttribute 3.3 파일관리예제 4. 파일시스템감시 4.1 FileSystemWatcher 예제
1. Sytem.IO 네임스페이스 - 6 -
2. 디렉토리와파일다루기 - 7 - Directory 와 DirectoryInfo 클래스 File 과 FileInfo 클래스
2.1 디렉토리다루기 - 8 - Directory - Static 메서드들만 디렉토리생성, 이동및삭제등메서드제공 DirectoryInfo- Instance 메서드들만 디렉토리생성, 이동및삭제등메서드제공 객체재사용시보안체크안함 DirectoryInfo dir dir = new new DirectoryInfo("."); foreach (FileInfo f in in dir.getfiles("*.cs")) String name = f.fullname;
2.1 DirectoryInfo 사용예제 - 9 - using using System.IO; System.IO;.. DirectoryInfo DirectoryInfo dirinfo dirinfo = = new new DirectoryInfo(@ c:\winnt\system ); DirectoryInfo(@ c:\winnt\system ); if if (dirinfo.exists) (dirinfo.exists) Console.WriteLine( Console.WriteLine( 디렉토리이름디렉토리이름 :0,dirInfo.Name); :0,dirInfo.Name); Console.WriteLine( Console.WriteLine( 생성일생성일 :0,dirInfo.CreationTime); :0,dirInfo.CreationTime); Console.WriteLine( Console.WriteLine( 루트루트,dirInfo.Root);,dirInfo.Root); Console.WriteLine( Console.WriteLine( 부모부모,dirInfo.Parent);,dirInfo.Parent); Console.WriteLine( Console.WriteLine( 디렉토리속성디렉토리속성 0,dirInfo.Attribute); 0,dirInfo.Attribute); else else Console.WriteLine( Console.WriteLine( 디렉토리가디렉토리가없습니다없습니다. );. );
2.2 디렉토리관리예제 - 10 - using using System.IO; System.IO;.. DircetoryInfo DircetoryInfodir= dir= new new DirectoryInfo( c:\\temp ); if if (!dir.exists) (!dir.exists) Console.WriteLine( 0 디렉토리를디렉토리를생성합니다생성합니다.,dir);.,dir); dir.create(); dir.create(); Console.WriteLine( 하위디렉토리를하위디렉토리를생성합니다생성합니다 ); ); dir.createsubdirectory(@ temp ); dir.createsubdirectory(@ nested\temp ); Console.WriteLine( 0 디렉토리디렉토리하위까지하위까지모두모두지웁니다지웁니다.,dir);.,dir); dir.delete(true);
2.3 디렉토리탐색하기 (dir) - 11 - using using System.IO; System.IO;.. Console.WriteLine( 디렉토리명을디렉토리명을입력하시오입력하시오 ); ); String String reqdir reqdir = Console.ReadLine(); DircetoryInfo DircetoryInfodir= dir= new new DirectoryInfo(reqDir); if if (dir.exists) (dir.exists) FileSystemInfo[] FileSystemInfo[] results results = dir.getfilesysteminfos(); foreach(filesysteminfo fsi fsi in in results) results) Console.WrietLine( 0\t1fsi.Attribute,fsi.FullName); Console.WriteLine( 모두모두 0 0 개의개의파일이파일이있습니다있습니다.,results.Length); else else //System.IO.DirectoryNotFoundException 으로도으로도처리가능처리가능 Console.WriteLine( 해당해당디렉토리가디렉토리가존재하기존재하기않습니다않습니다. );. );
2.3. 파일다루기 - 12 - File- Static Method 만 파일생성, 복사, 삭제, 이동, 열기에관련된메서드들제공 FileInfo - Instance Methods 만 파일생성, 복사, 삭제, 이동, 열기에관련된메서드들제공 객체를재사용시보안체크안함 FileStream astream = File.Create("foo.txt");
2.3.1 FileInfo 사용예제 - 13 - using using System.IO; System.IO;.. FileInfo FileInfofileInfo fileinfo = new new FileInfo( c:\\test.txt ); if if (fileinfo.exists) Console.WriteLine( 폴더이름폴더이름 :0,fileInfo.Directory); Console.WriteLine( 전체이름전체이름 :0,fileInfo.FullName); Console.WriteLine( 파일이름파일이름 :0,fileInfo.Name); Console.WriteLine( 확장자이름확장자이름 :0,fileInfo.Extension); Console.WriteLine( 생성일생성일 :0,fileInfo.CreationTime); Console.WriteLine( 크기크기 [ 바이트바이트 ]:0,fileInfo.Length); Console.WriteLine( 파일속성파일속성 0,fileInfo.Attribute); else else Console.WriteLine( 파일이파일이없습니다없습니다. );. );
2.3.2 파일관리예제 - 14 - using using System; System; using using System.IO; System.IO; class class MainClass MainClass public public static static void void Main() Main() //File //File Handling Handling FileInfo FileInfo sourcefile sourcefile = = new new FileInfo FileInfo ("c:\\test.txt"); ("c:\\test.txt"); if if (sourcefile.exists (sourcefile.exists ) ) FileInfo FileInfo copyfile copyfile = = sourcefile.copyto("c:\\temp\\copytest.txt",true); sourcefile.copyto("c:\\temp\\copytest.txt",true); copyfile.moveto(@"c:\move.text"); copyfile.moveto(@"c:\move.text"); if if (copyfile.exists (copyfile.exists ) ) copyfile.delete copyfile.delete (); (); else else Console.WriteLine Console.WriteLine (" (" 파일이파일이없습니다없습니다 "); ");
3. 파일시스템감시 FileSystemWatcher 파일시스템을감시 FilesystemWatcher 객체생성 - 15 - FileSystemWatcher watcher watcher = new new FileSystemWatcher(); 구성 watcher.path watcher.path = args[0]; args[0]; watcher.filter watcher.filter = "*.txt"; "*.txt"; watcher.notifyfilter = NotifyFilters.FileName; watcher.renamed watcher.renamed += += new new RenamedEventHandler(OnRenamed); 감시시작 watcher.enableraisingevents = true; true; 이벤트처리 public public static static void void OnRenamed(object OnRenamed(objects,RenamedEventArgs e) e) Console.WriteLine("File: 0 0 renamed renamed to to 1", 1", e.oldfullpath, e.oldfullpath, e.fullpath); e.fullpath);
3.1 FileSystemWatcher 예제 - 16 - class class Watcher Watcher public public static static void void Main() Main() string string name name = = "c:\\";//directory "c:\\";//directory 지정지정 FileSystemWatcher FileSystemWatcher w w = = new new FileSystemWatcher FileSystemWatcher (); (); w.path w.path = = name; name; w.notifyfilter w.notifyfilter = = NotifyFilters.LastAccess NotifyFilters.LastAccess NotifyFilters.LastWrite NotifyFilters.LastWrite NotifyFilters.FileName NotifyFilters.FileName NotifyFilters.DirectoryName NotifyFilters.DirectoryName ; ; w.filter w.filter ="*.txt"; ="*.txt"; // // txt txt file file 를 watch watch //Event //Event Handler Handler w.changed w.changed += += new new FileSystemEventHandler(OnChanged); FileSystemEventHandler(OnChanged); w.created w.created += += new new FileSystemEventHandler(OnChanged); FileSystemEventHandler(OnChanged); w.deleted w.deleted += += new new FileSystemEventHandler(OnChanged); FileSystemEventHandler(OnChanged); w.renamed w.renamed += += new new RenamedEventHandler(OnRenamed); RenamedEventHandler(OnRenamed); // // watch watch 시작시작 w.enableraisingevents w.enableraisingevents = = true; true; Console.WriteLine Console.WriteLine ("Preass ("Preass \'q\' \'q\' to to quit quit the the sample."); sample."); while(console.read while(console.read () ()!=!= 'q'); 'q');
3.1 FileSystemWatcher 예제 -II - 17 - public public static static void void OnChanged(object OnChanged(object source, source, FileSystemEventArgs FileSystemEventArgs e) e) Console.WriteLine Console.WriteLine ("File: ("File: " " + + e.fullpath e.fullpath +" +" " " + + e.changetype e.changetype ); ); public public static static void void OnRenamed(object OnRenamed(object source, source, RenamedEventArgs RenamedEventArgs e) e) Console.WriteLine Console.WriteLine ("File: ("File: 0 0 renamed renamed to to 1", 1", e.oldfullpath e.oldfullpath,e.fullpath,e.fullpath ); );
4. Reader/Writer로파일다루기 - 18-1. 텍스트파일 (Text File ) 다루기 1.1 StreamWriter 1.2 StreamReader 2. 바이너리파일 (Binary File) 다루기 2.1 BinaryWriter 2.2 BinaryReader
4.1. 텍스트파일 (Text File ) 다루기 - 19 - StreamWriter StreamReader
4.1.1 StreamWriter Text File 쓰기 (p269 참조 ) - 20 - 파일을생성 String, Integer, Floating Point Number 등을 Write Write() WriteLine() 파일닫기 (Close) //... StreamWriter sw sw = File.CreateText("MyFile.txt"); sw.writeline ("This is is my my file"); sw.writeline ( "I "I can can write ints 0 0 or or floats 1", 1, 1, 4.2); sw.close(); //...
4.1.2 StreamReader - Text File 읽기 (p268) - 21 - 생성 FileStream FileStreamf = File.Open( data.txt,filemode.open); StreamReader StreamReadersr sr = new new StreamReader(f); StreamReader(f); FileStream FileStreamf = new new FileStream( data.txt, FileMode.Open); FileMode.Open); StreamReader StreamReadersr sr = new new StreamReader(f); StreamReader(f); StreamReader StreamReadersr sr = new new StreamReader( data.txt, System.Text.Encoding.Default); // // 한글한글 Read Text from a File and Output It to the Console Read() : 한글자씩읽기 ReadLine() : 한라인씩읽기 ReadToEnd() : 파일끝까지읽기
4.1.2 StreamReader - Text File 읽기 (p268) - 22 - //... StreamReader sr sr = new new StreamReader( c:\\test.txt, System.Text.Encoding.Default); // // 한글한글 String input; while ((input=sr.readline())!=null) Console.WriteLine(input); Console.WriteLine ( "The end end of of the the stream has has been reached."); sr.close(); //...
4.2 바이너리파일 (Binary File ) 다루기 - 23 - BinaryWriter BinaryReader
4.2.1 BinaryWriter : Binary File로데이터쓰기 - 24 - using using System; System; using using System.IO; System.IO; // // public public static static void void Main() Main() // // Binary Binary file file 생성해서생성해서쓰기쓰기 if if (File.Exists (File.Exists("c:\\test.bin")) Console.WriteLine (" (" 이미이미파일이파일이있습니다있습니다.");."); FileStream FileStreamf = new new FileStream FileStream ("c:\\test.bin",filemode.createnew ); ); BinaryWriter BinaryWriterw = new new BinaryWriter BinaryWriter (f); (f); for for (int (inti =0; =0; i < 2000000;i++) 2000000;i++) w.write w.write (i); (i); w.close w.close (); (); f.close f.close (); ();
4.2.2 BinaryReader : Binary File 읽기 - 25 - //Binary //Binary File File 읽어오기읽어오기 FileStream FileStreamf = new new FileStream FileStream ("c:\\test.bin",filemode.open); BinaryReader BinaryReaderr = new new BinaryReader BinaryReader (f); (f); for for (int (inti=0;i<11;i++) i=0;i<11;i++) Console.WriteLine (r.readint32 (r.readint32()); ()); r.close r.close (); (); f.close f.close (); ();
Serialization - 26 -
Serialization 이란? - 27 - My Object SerializationInfo Serialize( ) Formatter BinaryFormatter SoapFormatter Stream Some Storage Device New Object SerializationInfo Formatter Stream Deserialize( ) (File, memory, buffer, socket) Persistence Store and retrieve a graph of objects to and from a file Remoting Pass by value arguments that are transmitted between processes
Binary Serialization - 28 - Mark the class with the Serializable attribute [Serializable] public class MyObject public int n1 = 0; public int n2 = 0; public string str = null; BinaryFormatter or SoapFormatter
Serialization/Deserialzation Example - 29 - MyObject MyObjectobj obj = new new MyObject(); MyObject(); obj.n1 obj.n1 = 10; 10; obj.n2 obj.n2 = 20; 20; obj.str obj.str = Hello ; = Hello ; FileStream FileStreams = File.Create( test.bin"); // // create create the the BinaryFormatter BinaryFormatter BinaryFormatter BinaryFormatterb = new new BinaryFormatter(); // // serialize serialize the the graph graph to to the the stream stream b.serialize(obj, b.serialize(obj, l); l); s.close(); s.close(); // // open open the the filestream filestream FileStream FileStreams = File.OpenRead( test.bin"); // // create create the the formatter formatter BinaryFormatter BinaryFormatterb = new new BinaryFormatter(); // // deserialize deserialize MyObject MyObjectp = (MyObject) (MyObject) b.deserialize(s); s.close(); s.close(); Console.WriteLine( n1=0 n2=1 n2=1 str=2,p.n1, str=2,p.n1, p.n2,p.str); p.n2,p.str);
XML Serialization - 30 - To serialize and deserialize an object Create the object Construct an XMLSerializer Call the Serialize/Deserialize methods StreamWriter myswriter = new StreamWriter( @ C:\myFileName.xml" ); ); try // // Serialize the MyObject object XmlSerializer serializer = new XmlSerializer( typeof ( MyObject ) ); ); serializer.serialize( myswriter, MyObject ); ); finally myswriter.close( ); );
- 31 - Assembly (24장컴포넌트프로그래밍 ) Assembly 란? Private Assembly Shared Assembly
1. Assembly 란 - 32 -.Exe 또는.dll 과같은실행파일 Ildasm C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe Module과 resource, Manifest를패키징한것 Manifest : Assembly 이름, 버전정보, 참조되는 Assembly, Type 정보등 Assembly :.dll 또는.exe Manifest Resource Module class
1.1 Assembly 만들기 - 33 - Visual C# 2008 Express Edition 사용 클래스라이브러리만들기 (.dll) 클래스라이브러리사용 - 참조추가.NET SDK Compiler 사용 클래스라이브러리만들기 C>csc /out:mylibrary.dll /t:library mycode.cs 클래스라이브러리사용 C>csc /r:mylibrary.dll main.cs
1.2 internal - 34 - Internal Access Modifier 하나의 Assembly 안에서만접근가능 class BankAccount // // default: internal private double balance ; // // default:private internal void Deposit( double amount) // // default:public balance += += amount;
1.3 실습 클래스라이브러리만들기 - 35 - Visual C# 2008 Expression Edition을시작하여파일 - 새프로젝트 - 클래스라이브러리를선택하고이름은 MyLibrary를입력한다. 다음코드를추가하고빌드하여 MyLibrary.dll이생성된것을확인한다. using System; namespace MyLibrary public class Class1 public string HelloWorld() return "Hello,World!!"; public int Add(int a, a, int b) b) return a + b; b;
1.3 실습 클래스라이브러리사용하기 - 36 - 솔루션탐색기에서추가 - 새프로젝트 - Windows 응용프로그램을선택하고이름은 UseLibrary를입력한다. 다음과같이폼을만들고 MyLibrary를참조추가한다.
1.3 실습 클래스라이브러리사용하기 - 37 - public 다음과 partial 같이 class 코드를 Form1 : 추가하고 Form 빌드하여실행해본다. public partial class Form1 : Form // //.... private void button1_click(object sender, EventArgs e) e) MyLibrary.Class1 obj = new MyLibrary.Class1(); int r = obj.add(convert.toint32(textbox1.text), Convert.ToInt32(textBox2.Text)); MessageBox.Show(" 결과는 " + r.tostring() + " 입니다 ");
2. Private Assembly 와 Shared Assembly - 38 - Private Assembly 프로그램디렉토리나 Assembly 이름과같은하위디렉토리에위치 해당프로그램만사용 Shared Assembly=Strong-Named Assembly 여러프로그램이공유 GAC(Global Assembly Cache 전역어셈블리캐시 ) 에등록 C:/windows/assembly 탐색기에서해당어셈블리를드래깅 or gacutil 를사용 강력한이름 (Strong-Name 이필요 )
2.1 실습 - Shared Assembly - 39 - 탐색기를두개띄운다. 앞에서작성한 MyLibrary.dll를드래깅하여다른탐색기의 GAC(c:\windows\assembly) 로드래깅한다. 솔루션탐색기에서 Properties를선택하여, 서명탭을선택하여다음그림과같이강력한이름을생성하여빌드한다.
2.1 실습 - Shared Assembly - 40 - 다시 MyLibrary.dll를드래깅하여 GAC(c:\windows\assembly) 로드래깅한다. 성공적으로드래깅됨을확인한다. UseLibrary 프로젝트의솔루션탐색기에서참조 -MyLibrary.dll를삭제하고강력한이름을가지는.dll로다시참조추가한다. \UseLibrary\bin\Debug\MyLibrary.dll를삭제하고실행해본다.
3. Assembly 버전관리 - 41 - <Major>.<Minor>.<Build>.<Revision> 1.0.0.0과 1.0.0.1은호환됨 1.0.0.0과 2.0.0.0은호환안됨 AssemblyInfo.cs <Assembly:AssemblyVersion( 1.0.* )> 구성파일생성하기 ApplicationName.exe.config.NET Framework Configruation마법사로생성가능 (mscorcfg.msc)
3. Assembly 버전관리 - 42 - ApplicationName.exe.config <configuration> <runtime> <assemblybinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentassembly> <assemblyidentity name=" MyLibrary " publickeytoken="f0548c0027634b66" culture=""/> <publisherpolicy apply="no"/> <bindingredirect oldversion="2.0.0.0" newversion="2.0.1.0"/> </dependentassembly> </assemblybinding> </runtime> </configuration>