파일 & 디렉토리
- System.IO
- FileInfo
- DirectoryInfo
- FileSystemInfo
- 파일 및 디렉토리 조작 관련 클래스
인코딩
- 문자 코드를 컴퓨터가 이해가능한 0과 1의 바이너리 값을 가지는 연속적인 비트형태로 매핑시켜주는 작업
- ASCII : 7비트사용, 총 128문자 표현
- ISO-8859-1 : 8비트 사용, 서유럽 문자 집합, 기존 ASCII코드에 추가 문자 포함, 총 256문자 표현
- KSC 5601 : 한국 공업표준, 2바이트 완성형 한글 표현, ASCII 문자제외
- EUC-KR : ASCII문자 코드는 1바이트, 한글은 2바이트로 표현
- 유니코드 : 인간이 사용하는 모든 언어표현, 2바이트 사용, 총 65365개 문자표현
- UTF-8 : ASCII문자 코드는 1바이트, 다른 문자는 2바이트나 그 이상으로 표현(한글은 3바이트로 인코딩), 기본 사용 추세
- UTF-16 : 2바이트로 모든 문자 코드 표현
스트림
- C#에서의 모든 입출력
- 스트림을 통해 입출력되는 단위는 byte -> 스트림 내부에는 데이터 타입X -> 어떤 종류의 입출력장치나 파일도 쉽게 처리
- 프로그램상의 객체(데이터)는 데이터 타입이 있기 때문에 이런 바이트 단위와 변한하는 과정이 필요 -> 닷넷 스트림 관련 클래스
- System.IO : 스트림 관련 클래스
Stream 추상클래스
- 모든 스트림
- FileStream, MemoryStream, NetworkStream
- 입출력 장치에 관계없는 일관된 프로그래밍 지원
FileStream
- 파일에 들어있는 데이터를 바이트 배열로 읽고 쓰기 위한 기능 제공
Stream 관련 클래스
- 의미없이 연속된 바이트 데이터를 의미있는 타입 데이터로 바꾸는 기능 제공
- Reader / Writer
- StreamReader : 파일등의 입출력 장치에서 얻은 바이트들을 여러 인코딩을 통해서 의미있는 문자나 문자열로 해석(TextReader 구현)
- StreamWriter : 프로그램에서의 의미있는 문자나 문자열을 입출력 장치로 쓸수 있게 한다(TextWriter 구현)
- 개발자는 더이상 바이트 스트림에 대한 신경 안써도 됨 -> 스트림을 직접 다루지 않아도 된다.
FileStream.Flush
- 스트림에 대한 모든 버퍼를 지우고 버퍼링된 모든 데이터가 내부 장치에 저장되도록 한다.
- Close를 하기전에 적절히 사용
파일 메소드
- 파일에 텍스트 추가 : File.AppendText, FileInfo.AppendText
- 파일이름 변경, 이동 : File.Move,FileInfo.MoveTo
- 파일삭제 : File.Delete, FileInfo.Delete
- 파일복사 : File.Copy, FileInfo.CopyTo
- 파일 크기를 정보 : FileInfo.Length
- 파일특성 가져옴 : File.GetAttributes
- 파일의 특성 설정 : File.SetAttributes
- 파일이 존재여부 체크 : File.Exists
- 파일의 정규화된 경로를 검색 : Path.GetFullPath
- 파일 확장명을 검색 : Path.GetExtension
- 경로에서 파일 이름 및 확장명을 검색 : Path.GetFileName
- 파일 확장명을 변경 : Path.ChangeExtension
* 파일 속성 이용 예제
using System;
using System.IO;
namespace CSharpStudy
{
class MainClass
{
[STAThread]
static void Main(string[] args)
{
string path = @"C:\boot.ini";
Console.WriteLine("------------- -FileInfo ------------------");
FileInfo file = new FileInfo(path);
if(file.Exists) //파일이 해당경로에 존재하는지 여부 체크
{
Console.WriteLine("Attributes : {0}", file.Attributes);
Console.WriteLine("File Name : {0}", file.Name);
Console.WriteLine("File Ext : {0}", file.Extension);
Console.WriteLine("File Size : {0}", file.Length);
Console.WriteLine("Create time : {0}", file.CreationTime);
Console.WriteLine("DirectoryName : {0}", file.DirectoryName);
Console.WriteLine("Full Name: {0}", file.FullName);
Console.WriteLine("Last AccessTime : {0}", file.LastAccessTime.ToString());
Console.WriteLine("Last WriteTime : {0}", file.LastWriteTime.ToString());
}
else
{
Console.WriteLine("파일이 존재하지 않습니다.");
}
Console.WriteLine("\n");
Console.WriteLine("-------------- DirectoryInfo ------------------");
string dirPath = @"D:\Inetpub\wwwroot";
DirectoryInfo dir = new DirectoryInfo(dirPath);
Console.WriteLine("Attributes : {0}", dir.Attributes);
Console.WriteLine("Directory Name : {0}", dir.Name);
Console.WriteLine("Parent : {0}", dir.Parent.Name);
Console.WriteLine("Root : {0}", dir.Root.Name);
Console.WriteLine("Create time : {0}", dir.CreationTime);
Console.WriteLine("Full Name: {0}", dir.FullName);
Console.WriteLine("Last AccessTime : {0}", dir.LastAccessTime.ToString());
Console.WriteLine("Last WriteTime : {0}", dir.LastWriteTime.ToString());
}
}
}
*파일 메소드 이용예제
using System;
using System.IO;
namespace CSharpStudy
{
class MainClass
{
[STAThread]
static void Main(string[] args)
{
string path = @"text.txt";
FileInfo file = new FileInfo(path);
bool flag = true;
while(flag)
{
Console.WriteLine("=====================");
Console.WriteLine(" 파일 처리");
Console.WriteLine("=====================");
Console.WriteLine("1. 파일생성");
Console.WriteLine("2. 텍스트추가");
Console.WriteLine("3. 파일 읽기");
Console.WriteLine("4. 파일삭제");
Console.WriteLine("5. 파일 복사");
Console.WriteLine("6. 파일이동");
Console.WriteLine("7. 종료");
Console.Write("\n원하시는 작업 : ");
string sel = Console.ReadLine();
switch(sel)
{
case "1":
CreateText(file);
break;
case "2":
AppendText(file);
break;
case "3":
ReadText(file);
break;
case "4":
DeleteFile(file);
break;
case "5":
CopyFile(file);
break;
case "6":
MoveFile(file);
break;
case "7":
default:
Console.WriteLine("프로그램을 종료합니다.");
flag = false;
break;
}
}
}
//파일생성
public static void CreateText(FileInfo file)
{
StreamWriter writer = file.CreateText();
//UTF-8로 인코딩된 텍스트를 쓰기 위해 파일을 만들거나 엽니다
//file.CreateText(쓰기용으로 사용할 파일의 경로); -> 경로가 없으면 자기자신에게 실행
writer.Close();
Console.WriteLine("파일이 생성되었습니다\n\n");
}
//텍스트추가
public static void AppendText(FileInfo file)
{
if(file.Exists)
{
Console.WriteLine("\n텍스트를 입력하세요(/p : 입력종료)");
StreamWriter writer = file.AppendText();
//기존 파일에 UTF-8로 인코딩된 텍스트를 추가하는 StreamWriter를 만듬
//file.AppendText(추가하고자하는 파일의 경로); ->경로가 없으면 자기자신에게 실행
string inputString = Console.ReadLine();
while(inputString != "/q")
{
writer.WriteLine(inputString);
inputString = Console.ReadLine();
}
writer.Close();
Console.WriteLine("텍스트 추가가 완료 되었습니다.\n\n");
}
else
{
Console.WriteLine("파일이 존재하지 않습니다.");
}
}
//파일읽기
public static void ReadText(FileInfo file)
{
if(file.Exists)
{
StreamReader reader = file.OpenText();
//UTF-8로 인코딩된 기존 텍스트 파일을 읽기 용으로 엽니다
Console.WriteLine(reader.ReadToEnd());
Console.WriteLine("\n\n");
reader.Close();
}
else
{
Console.WriteLine("파일이 존재하지 않습니다\n\n");
}
}
//파일삭제
public static void DeleteFile(FileInfo file)
{
if(file.Exists)
{
file.Delete();
Console.WriteLine("파일을 삭제하였습니다.");
}
else
{
Console.WriteLine("파일이 존재하지 않습니다\n\n");
}
}
//파일복사
public static void CopyFile(FileInfo file)
{
if(file.Exists)
{
file.CopyTo("copy.txt", true);
Console.WriteLine("파일을 복사하였습니다.");
}
else
{
Console.WriteLine("파일이 존재하지 않습니다\n\n");
}
}
//파일이동
public static void MoveFile(FileInfo file)
{
if(file.Exists)
{
Console.Write("이동 경로 입력 : ");
string dirPath = Console.ReadLine();
file.MoveTo(dirPath + "\\move.txt"); //해당경로로 이름을 바꿔서 이동한다.
Console.WriteLine("파일을 복사하였습니다.");
}
else
{
Console.WriteLine("파일이 존재하지 않습니다\n\n");
}
}
}
}
SSISO Community