파일명 : 비주얼프로그래밍_8장

Download Report

Transcript 파일명 : 비주얼프로그래밍_8장

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 DirectoryInfo(@"C:\Program 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 클래스의 주요 메서드
속성
Length
설명
현재 파일의 크기를 구함
메소드
설명
AppendText
FileInfo의 인스턴스가 나타내는 파일에 텍스트를 추가하는 StreamWriter를 생성
CopyTo
새 파일에 기존 파일을 복사
Create
파일을 생성
CreateText
새 텍스트 파일을 쓰는 StreamWriter를 생성
Delete
파일을 영구적으로 삭제
MoveTo
지정된 파일을 새 위치로 이동하고 새 파일의 이름을 지정할 수 있는 옵션을 제공
Open
다양한 읽기/쓰기 및 공유 권한으로 파일을 개설
OpenRead
읽기 전용으로 FileStream을 생성
OpenText
UTF8 인코딩 방식으로 기존 텍스트 파일에서 읽는 StreamReader를 생성
OpenWrite
쓰기 전용으로 FileStream을 생성
ToString
정규화된 경로를 문자열로 반환
- 예) 파일의 정보를 구하여 출력하는 프로그램
class Program {
public static void Main() {
FileInfo finfo = new FileInfo(@"C:\C#\test.txt");
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 DirectoryInfo(@"E:\hwp\Data\C#");
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 클래스를 이용할 경우
File.Copy(@"c:\test\a.txt", @"c:\test\b.txt"); // 정적 메서드 사용
//FileInfo 클래스를 이용할 경우
FileInfo fi = new FileInfo(@"c:\test\a.txt"); // 객체를 생성
fi.CopyTo(@"c:\test\b.txt")
- 예) 복사 프로그램 작성하기 (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
정규화된 경로를 문자열로 반환
- 예) File 클래스 사용해보기
public class Program
{
public static void Main() {
Console.WriteLine("1. 프로그램 시작");
File.Copy(@“C:\test.txt",@“C:\Output.txt",true);
Console.WriteLine("2. === Copied Successfully!!===");
bool exist = File.Exists(@“C:\Output.txt");
Console.WriteLine("3. Output.txt존재여부:" + exist);
DateTime dt = File.GetCreationTime(@" C:\Output.txt ");
Console.WriteLine("4. 파일 생성시간:"+ dt.ToString());
Console.WriteLine("5. 프로그램 끝");
}
}
- 예) 메모장 프로그램 만들기
컨트롤
MenuStrip
파일
속성
MenuItem
MenuItem
MenuItem
MenuItem
편집
MenuItem
MenuItem
RichTextBox
값
Name
menuNew
Text
새로만들기
Name
menuOpen
Text
열기
Name
menuSave
Text
저장
Name
menuExit
Text
끝내기
Name
menuCopy
Text
복사하기
Name
menuPaste
Text
붙여넣기
Name
txtMemo
Anchor
Top, 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("에러 발생");
}
}