본문 바로가기

프로그래밍언어/C#

C# 파일 컨트롤 파일 I/O Stream 정리


파일컨트롤

 

 shakeJ 

 

 

-.NET Frame work 의 파일 I/O(Input/Output) System

 

 

 

Steream

 

.NET Framework에서는 스트림을 사전적으로 '흐름', '시내', '개울' 등의 뜻을 가지며, .NET Framework에서는 정보를 생산하고 소비하는 연속적이고 논리적인 데이터의 흐름을 의미한다. 스트림은 다음 그림과 같이 파일의 시작과 끝이 있고, 커서가 스트림에서의 현재 위치를 나타내는 1차원의 연속적인 데이터 흐름으로 표현된다.

스트림 자체는 논리적 흐름이기에, 개발자의 입장에서는 일관된 방식으로 어떤 물리적장치를 사용하더라도 파일 I/O를 제어할 수 있다.

쉽게 말하자면, 키보드를 쓰나 마우스를 쓰나, 혹은 모니터로 보나, 하드디스크에 저장을 하거나 파일자체는 같은 논리이기에, 물리적 장치에 구애받지 않고 가능하다는 뜻이다.

 

.NET Framework에서는 바이트 스트림, 문자 스트림, 선정 스트림 등 여러 스트림을 제공하지만 ASP.NET에서 주로 사용하는 것은

 

- 바이트 스트림

- 문자 스트림

이 2가지 이다.

 

.NET Framework의 파일 I/O 시스템은 근본적으로 파일의 가장 하위 레벨인 바이트 형태로 작업을 수행한다. 그러므로 어떤 종류의 파일이라도 파일의 생성, 복사 등의 작업을 쉽게 할 수 있다. 하지만 파일이 아닌 문자 같은 경우 이 바이트 스트림을 사용 할 수가 없다.

 

왜냐하면, .NET Framework에서는 한 문자가 2바이트인 유니코드를 사용하여 문자를 표시하지만, 바이트 스트림은 1바이트 단위로 작업을 수행하기 때문이다.

 

그래서 파일 자체가 아닌 파일 안으ㅢ 문자를 직접 제어 하기 위해서는 문자스트림을 사용한다.

 

문자 스트림은 바이트 스트림으로부터 만들어 진다!

 

바이트 스트림

<%@ Page Language="C#" %>

<%@ Import Namespace="System.IO" %> <~~이부분이 파일I/O말해주는

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<script runat="server">

 

protected void Button1_Click(object sender, EventArgs e)

{

 

if (Page.IsValid)

 

{

string dir = "C:\\Streamtest\\"; <~이부분에 폴더가 실제로 존재하지 않으면 오류발생

string iFullName = FileUpload1.PostedFile.FileName;

 

string oFullName = dir + FileUpload1.FileName;

FileStream fi = new FileStream(iFullName, FileMode.Open);

FileStream fo = new FileStream(oFullName, FileMode.Create);

 

int i;

do

{

i = fi.ReadByte();

 

if (i != -1)

{

fo.WriteByte((byte)i);

 

 

}

} while (i != -1);

 

fi.Close();

fo.Close();

 

 

 

Label1.Text = "사할파일: " + iFullName + "<br>" + "사된파일: " + oFullName;

}

}

</script>

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

<title>|¬n ú©ª¨ö</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<h3>öUI¡¢ç ö¨¬¡¢ç¬©÷ ¯©ö|</h3>

<asp:FileUpload ID="FileUpload1" runat="server" />

<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="¬©öícO ¡AI¡í ù¡¾AIù¨ù¯a" ControlToValidate="FileUpload1"></asp:RequiredFieldValidator><br />

<asp:Button ID="Button1" runat="server" Text="¬©öícO÷¡§¥U!" OnClick="Button1_Click" /><br />

<asp:Label ID="Label1" runat="server" Text=""></asp:Label>

</div>

</form>

</body>

</html>

다음과 같이 c의 지정해준 폴더로 복사가 되게 된다.

 

문자스트림

<%@ Page Language="C#" %>

<%@ Import Namespace="System.IO" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<script runat="server">

 

protected void Button1_Click(object sender, EventArgs e)

{

FileStream fi = new FileStream(FileUpload1.PostedFile.FileName, FileMode.Open);

 

StreamReader si = new StreamReader(fi, System.Text.Encoding.Default);

 

string str;

string result = "";

 

 

 

do

{

str = si.ReadLine();

if (str != null)

{

result += str + "\r\n";

}

} while (str != null);

TextBox1.Text = result;

si.Close();

}

 

 

 

protected void Button2_Click(object sender, EventArgs e)

{

string dir = "C:\\StreamTest\\test.txt";

FileStream fo = new FileStream( dir , FileMode.Create);

StreamWriter so = new StreamWriter(fo, System.Text.Encoding.Default);

so.Write(TextBox1.Text);

so.Close();

}

</script>

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

<title>|¬n ú©ª¨ö</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<h3>ö¢çU ö¨¬¡¢ç¬©÷ ¯©ö|</h3>

 

<asp:FileUpload ID="FileUpload1" runat="server" /><br />

<asp:Button ID="Button1" runat="server" Text="¡AI ¨¢¾a" OnClick="Button1_Click" />

<p></p>

<asp:TextBox ID="TextBox1" runat="server" Columns="50" Rows="9" TextMode="MultiLine"></asp:TextBox><br />

<asp:Button ID="Button2" runat="server" Text="¡AI a¤A" OnClick="Button2_Click" />

</div>

</form>

</body>

</html>