8 장 파일과 디렉토리
FileSystemInfo 클래스 - 주어진 파일과 디렉토리 ( 또는 폴더 ) 에 대한 일반적인 정보를 알아내는데 사용 - FileSystemInfo 클래스의 주요 속성 및 메서드 속성설명 Attributes 현재 FileSystemInfo 의 FileAttributes CreationTime 현재 FileSystemInfo 개체를 만든 시간 Exists 파일이나 디렉토리가 있는지 여부 Extension 파일의 확장명 부분을 나타내는 문자열 FullName 파일이나 디렉토리의 전체 경로 LastAccessTime 현재 파일이나 디렉토리에 마지막으로 액세스한 시간 LastWrtieTime 현재 파일이나 디렉토리에 마지막으로 쓴 시간 Name 파일의 경우 : 이름 디렉토리의 경우 : 계층에 있는 마지막 디렉토리의 이름 메소드설명 Delete 파일이나 디렉토리를 삭제
DirectoryInfo - 디렉토리 : 관련된 파일을 모아 놓은 물리적인 공간 - DirectoryInfo 클래스를 사용해 디렉토리에 대한 다양한 처리가 가능 - DirectoryInfo 클래스의 주요 속성과 메서드 속성설명 Attributes 현재 FileSystemInfo 의 FileAttributes CreationTime 디렉토리 생성시간 Exists 디렉토리가 있는지 여부 Extension 파일의 확장자 FullName 파일이나 디렉토리의 전체 경로 Name DirectoryInfo 인스턴스의 이름 Parent 지정된 하위 디렉토리의 부모 디렉토리 Root 경로의 루트 메소드설명 Create 디렉토리를 생성 CreateSubDirectory 지정된 경로에서 하나 이상의 하위 디렉토리를 생성 Delete 경로에서 DirectoryInfo 및 해당 내용을 삭제 GetDirectories 현재 디렉토리으 하위 디렉토리를 반환 GetFiles 현재 디렉토리에서 파일 목록을 반환 GetFileSystemInfos FileSystemInfo 개체 배열 MoveTo DirectoryInfo 인스턴스 및 해당 내용을 새 경로로 이동 ToString 사용자가 통과한 원래의 경로를 반환
- 예 ) Internet Explorer 디렉토리의 정보를 출력하는 프로그램 class Program { public static void Main() { DirectoryInfo dinfo = new Files\Internet Explorer"); if(dinfo.Exists){ Console.WriteLine(" 전체 경로 : {0}", dinfo.FullName); Console.WriteLine(" 디렉토리이름 : {0}", dinfo.Name); Console.WriteLine(" 생성일 : {0}", dinfo.CreationTime); Console.WriteLine(" 디렉토리속성 : {0}", dinfo.Attributes); Console.WriteLine(" 루트 경로 : {0}", dinfo.Root); Console.WriteLine(" 부모 디렉토리 : {0}", dinfo.Parent); }
FileInfo - 새로운 파일을 만들거나 삭제 및 파일에 대한 정보를 구할 때 사용 - FileInfo 클래스의 주요 메서드 메소드설명 AppendText FileInfo 의 인스턴스가 나타내는 파일에 텍스트를 추가하는 StreamWriter 를 생성 CopyTo 새 파일에 기존 파일을 복사 Create 파일을 생성 CreateText 새 텍스트 파일을 쓰는 StreamWriter 를 생성 Delete 파일을 영구적으로 삭제 MoveTo 지정된 파일을 새 위치로 이동하고 새 파일의 이름을 지정할 수 있는 옵션을 제공 Open 다양한 읽기 / 쓰기 및 공유 권한으로 파일을 개설 OpenRead 읽기 전용으로 FileStream 을 생성 OpenText UTF8 인코딩 방식으로 기존 텍스트 파일에서 읽는 StreamReader 를 생성 OpenWrite 쓰기 전용으로 FileStream 을 생성 ToString 정규화된 경로를 문자열로 반환 속성설명 Length 현재 파일의 크기를 구함
- 예 ) 파일의 정보를 구하여 출력하는 프로그램 class Program { public static void Main() { FileInfo finfo = new if(finfo.Exists) { Console.WriteLine(" 폴더이름 : {0}", finfo.Directory); Console.WriteLine(" 파일이름 : {0}", finfo.Name); Console.WriteLine(" 확장자 : {0}", finfo.Extension); Console.WriteLine(" 생성일 : {0}", finfo.CreationTime); Console.WriteLine(" 파일크기 : {0}", finfo.Length); Console.WriteLine(" 파일속성 : {0}", finfo.Attributes); } else Console.WriteLine(" 파일이 존재하지 않습니다."); }
- 예 ) 임의의 디렉토리의 모든 하위 디렉토리와 파일 정보를 출력 class Program { public static void Main() { DirectoryInfo dinfo = new if( dinfo.Exists ) { // 하위 디렉토리 구함 DirectoryInfo [] dir = dinfo.GetDirectories(); foreach( DirectoryInfo d in dir ) { FileInfo [] files = d.GetFiles();// 디렉토리에 있는 파일 구함 Console.WriteLine(" 디렉토리 : {0}, 포함된 파일 수 : {1}", d.FullName, files.Length ); int index = 0; foreach( FileInfo f in files ) { // 파일 정보 구함 string str = String.Format("[{0}] : Name: {1}, Ext: {2}, Size: {3}",++index, f.Name, f.Extension, f.Length ); Console.WriteLine(str); }
Directory 클래스 / File 클래스 - DirectoryInfo 와 FileInfo 클래스와 비슷한 기능을 하는 클래스 - 정적 메서드로만 이루어져 있어서 객체를 생성하지 않아도 사용 가능 - 예 ) //File 클래스를 이용할 // 정적 메서드 사용 //FileInfo 클래스를 이용할 경우 FileInfo fi = new // 객체를 생성
- 예 ) 복사 프로그램 작성하기 (using System.IO 필요 ) class Program { static void Main( String[] args ) { if( args.Length < 2 ) { Console.WriteLine(" 사용법 : FileEx4.exe [ 복사할 파일 ] [ 복사될 경로 ]"); return; } // 명령행 인수로 준 파일의 정보를 구함 FileInfo s_file = new FileInfo( args[0] ); string dest_filename = args[1] + s_file.Name; // 복사될 파일 경로 명 if( s_file.Exists ) { Console.WriteLine("{0} 파일을 {1} 로 복사합니다....", s_file.Name, args[1]); FileInfo c_file = s_file.CopyTo( dest_filename, true );// 파일 복사 if( c_file.Exists ) { Console.WriteLine(" 파일을 성공적으로 복사했습니다.!"); } Console.WriteLine(" 복사된 파일을 삭제하려면 Y 키를 입력하세요 >> "); string input = Console.ReadLine().Trim(); if( input[0] == 'Y' ) { FileInfo m_file = new FileInfo(dest_filename); m_file.Delete(); // 파일 삭제 Console.WriteLine("{0} 파일을 삭제했습니다.", m_file.Name); } - 명령행 인수를 지정하려면 [ 프로젝트 ]->[ 속성 ]->[ 디버그 ]->[ 명령줄 인수 ] 에 프로그램 실 행에 필요한 명령행 인수를 지정 예 ) C:\test.txt C:\
File 클래스 - 파일에 관련된 정보를 제공하거나 FileStream 의 객체를 생성하여 파일의 I/O 작업을 수행 - 정적 메서드로만 이루어져 있어서 객체를 생성하지 않아도 사용 가능 - 주요 메소드 메소드설명 AppendText 기존 파일에 UTF-8 로 인코딩된 텍스트를 추가하는 StreamWriter 를 생성 Copy 새 파일에 기존 파일을 복사 Create 지정된 경로에 파일을 생성 Delete 지정된 파일을 삭제 GetAttributes 경로에 있는 파일의 FileAttributes Move 지정된 파일을 새 위치로 이동하고 새 파일의 이름을 지정할 수 있는 옵션을 제공 Open 다양한 읽기 / 쓰기 및 공유 권한으로 파일을 개설 OpenRead 읽기 전용으로 기존 파일을 개설 OpenText UTF8 인코딩 방식으로 기존 텍스트 파일에서 읽는 StreamReader 를 생성 OpenWrite 쓰기 전용으로 FileStream 을 생성 ToString 정규화된 경로를 문자열로 반환
public class Program { public static void Main() { Console.WriteLine("1. 프로그램 시작 "); Console.WriteLine("2. === Copied Successfully!!==="); bool exist = Console.WriteLine("3. Output.txt 존재여부 :" + exist); DateTime dt = C:\Output.txt "); Console.WriteLine("4. 파일 생성시간 :"+ dt.ToString()); Console.WriteLine("5. 프로그램 끝 "); } - 예 ) File 클래스 사용해보기
- 예 ) 메모장 프로그램 만들기 컨트롤속성값 MenuStrip 파일 MenuItemNamemenuNew Text 새로만들기 MenuItemNamemenuOpen Text 열기 MenuItemNamemenuSave Text 저장 MenuItemNamemenuExit Text 끝내기 편집 MenuItemNamemenuCopy Text 복사하기 MenuItemNamemenuPaste Text 붙여넣기 RichTextBox NametxtMemo AnchorTop, Bottom, Left, Right
- 변수 선언하기 // 현재 텍스트 박스에 출력될 내용을 저장하고 있는 디폴트 파일 이름 string fName = "noname.txt"; // 파일을 저장할 때 현재 텍스트 박스 내용의 변경 유무를 저장 bool modifyFlag = false; - 파일과 편집메뉴 항목들에 Click 이벤트 처리기를 추가 - RichTextBox 컨트롤에 TextChanged 이벤트 처리기를 추가 private void menuOpen_Click(object sender, EventArgs e) { // 현 작업 내용을 저장하지 않았다면 저장 후 파일 열기 대화상자 수행 if( modifyFlag == true ) { DialogResult answer = MessageBox.Show(" 변경된 내용을 저장하겠습니까 ?", " 저장 “, MessageBoxButtons.YesNo); if( answer == DialogResult.Yes ) { // 변경 내용 저장 if( fName == "noname.txt" ) { // 전에 기록된 적이 없는 파일인가 ? // 저장할 파일 이름 지정 if( saveFileDialog1.ShowDialog() == DialogResult.OK ) { // 파일을 생성 StreamWriter fs1 = File.CreateText(saveFileDialog1.FileName); fs1.WriteLine(txtMemo.Text); // 파일에 저장 fs1.Close(); }
else { // 디폴트가 아닌 파일명이 이미 지정된 경우 StreamWriter fs = File.CreateText(fName); fs.WriteLine(txtMemo.Text); fs.Close(); } // 열기 대화상자에서 선택한 파일을 RichTexdtBox 에 출력 openFileDialog1.ShowDialog(); // 파일 열기 대화상자 fName = openFileDialog1.FileName; // 읽기 파일 이름 StreamReader fs = File.OpenText(fName); // 파일 열기 txtMemo.Text = fs.ReadToEnd(); // 파일 끝까지 읽기 modifyFlag = false; // 변경 사항 없음 fs.Close(); } private void menuSave_Click(object sender, EventArgs e) { if( fName == "noname.txt" ){ // 전에 기록된 적이 없는 파일인가 ? saveFileDialog1.ShowDialog(); // 파일 저장 대화상자 fName = saveFileDialog1.FileName;// 저장 파일 이름 } // UTF-8 로 인코딩된 텍스트를 쓰기 위해 파일을 만들거나 엽니다. StreamWriter fs = File.CreateText(fName); fs.WriteLine(txtMemo.Text); // 텍스트박스의 내용 파일에 쓰기 modifyFlag = false; fs.Close(); }
private void menuNew_Click(object sender, EventArgs e) { if( modifyFlag == true ) { // 현 작업 내용을 저장하지 않았다면 DialogResult answer = MessageBox.Show(" 변경된 내용을 저장하겠습니까 ?", " 저장 “, MessageBoxButtons.YesNo); if( answer == DialogResult.Yes ) { // 변경 내용 저장 if( fName == "noname.txt" ) { // 전에 기록된 적이 없는 파일인가 ? if( saveFileDialog1.ShowDialog() == DialogResult.OK ){ StreamWriter fs = File.CreateText(saveFileDialog1.FileName); fs.WriteLine(txtMemo.Text); fs.Close(); } else { StreamWriter fs = File.CreateText(fName); fs.WriteLine(txtMemo.Text); fs.Close(); } // 새로 편집할 파일 생성 txtMemo.Text=""; // 텍스트박스 clear modifyFlag = false; fName = "noname.txt"; }
private void menuExit_Click(object sender, EventArgs e) { if(modifyFlag == true) { // 현 작업 내용을 저장하지 않았다면 DialogResult answer = MessageBox.Show(" 변경된 내용을 저장하겠습니까 ?", " 저장 ", MessageBoxButtons.YesNo); if(answer == DialogResult.Yes) { if(fName == "noname.txt") { if(DialogResult.OK == saveFileDialog1.ShowDialog()) { StreamWriter fs = File.CreateText(saveFileDialog1.FileName); fs.WriteLine(txtMemo.Text); fs.Close(); } else { StreamWriter fs = File.CreateText(fName); fs.WriteLine(txtMemo.Text); fs.Close(); } Close(); }
private void menuCopy_Click(object sender, EventArgs e) { try { // 컨테이너에 있는 활성 컨트롤을 가져옵니다. RichTextBox contents = (RichTextBox)ActiveControl; if(contents != null) { // 시스템 클립보드에 데이터를 배치 Clipboard.SetDataObject(contents.SelectedText); } } catch { // 클립보드에 저장할 수 없을 때 예외 발생 MessageBox.Show(" 에러 발생 "); } // txtMemo.Copy(); } // RichTextBox 의 내용이 변경되었으면 새로 만들기나 열기를 수행시 // 현재 작업된 내용을 파일에 반영하도록 // modifyFlag 를 true 로 설정 private void txtMemo_TextChanged(object sender, EventArgs e) { modifyFlag = true; }
// 붙여넣기는 클립보드에 저장된 내용을 얻어와서 텍스트 박스에 삽입 private void menuPaste_Click(object sender, EventArgs e) { try { RichTextBox contents = (RichTextBox)ActiveControl; // 활성 컨트롤 if(contents != null) { // 현재 시스템 클립보드에 있는 데이터를 검색 IDataObject data = Clipboard.GetDataObject(); if(data.GetDataPresent(DataFormats.Text)) { // 이 인스턴스에 저장된 데이터가 지정된 형식과 관련되어 있거나 // 해당 형식으로 변환될 수 있는지 여부를 확인하고 결과를 display contents.SelectedText = data.GetData(DataFormats.Text).ToString(); modifyFlag = true; } } catch { MessageBox.Show(" 에러 발생 "); }