8장 - 파일 작업
이 장에서는 파일의 읽기, 쓰기, 업데이트, 삭제에 대하여 연습합니다.
이전 챕터에서 어떻게 데이터베이스에 데이터를 저장하는 배웠습니다. 그러나, 웹사이트에있는 텍스트 파일을 사용할 수 있습니다. 예를 들어, 여러분이 사이트에 대한 데이터를 저장하는 간단한 방법으로 텍스트 파일을 사용할 수 있습니다. (데이터를 저장하는 데 사용되는 텍스트 파일은 때로는 flat(플랫) 파일이라고합니다.) 텍스트 파일은 .txt,. xml 또는. CSV (쉼표로 구분된 값) 같이 다른 포멧일 수 있습니다.
무엇을 배우는가:
- 텍스트 파일을 만드는 방법과 데이터를 기록하는 방법.
- 기존 파일에 데이터를 추가하는방법.
- 파일을 읽고 출력하는 방법.
- 웹 사이트에서 파일을 삭제하는 방법.
- 사용자가 하나의 파일 또는 여러 개의 파일을 업로드하는 방법.
이들은 장에서 소개하는 ASP.NET 프로그래밍 기능입니다 :
- 파일을 관리할 수있는 방법을 제공하는 File object.
- FileUpload Herper.
- 경로와 파일 이름을 얻는 방법을 제공하는 Path object.
1. 텍스트 파일을 생성 및 데이터 읽기
텍스트 파일에 데이터를 저장하려는 경우, 파일을 만드는것을 지정하고 데이터를 쓰기위해 File.WriteAllText 메서드를 사용할 수 있습니다. 이 절차에서는 세 가지 Input elements (이름, 성, 이메일 주소)와 간단한 양식을 포함하는 페이지를 작성하고 버튼을 제출합니다. 사용자가 양식을 제출하면, 텍스트 파일에 사용자의 입력을 저장합니다.
- 존재하지 않는 경우, App_Data라는 이름의 새 폴더를 만듭니다.
- 웹사이트 루트에, UserData.cshtml라는 새 파일을 만듭니다.
- 기본 마크업과 코드를 다음과 같이 교체합니다:
@{ var result = ""; if (IsPost){ var firstName = Request["FirstName"]; var lastName = Request["LastName"]; var email = Request["Email"]; var userData = firstName+","+lastName+","+email+Environment.NewLine; var dataFile = Server.MapPath("~/App_Data/data.txt"); File.WriteAllText(@dataFile, userData); result = "기록하신 정보가 저장되었습니다"; } }
<!DOCTYPE html> <html> <head> <title>파일에 데이터 쓰기</title> </head> <body> <form id="form1" method="post"> <div> <table> <tr> <td>첫 번째 이름: </td> <td><input id="FirstName" name="FirstName" type="text" /></td> </tr> <tr> <td>마지막 이름: </td> <td><input id="LastName" name="LastName" type = "text" /></td> </tr> <tr> <td>Email: </td> <td><input id="Email" name="Email" type="text" /> </td> </tr> <tr> <td></td> <td><input type="Submit" value="확인" /></td> </tr> </table> </div> <div> @if (result !=""){ <P>결과: @result</P> } </div> </form> </body> </html> |
HTML 마크업은 텍스트 상자 3개의 양식을 만듭니다. 코드에서, 처리를 시작하기 전에 페이지가 제출되었는지 여부를 확인할 IsPost 속성을 사용합니다.
첫 번째 작업은 사용자 입력을 받아 변수에 할당됩니다. 코드는 그때 그때 쉼표로 구분된 문자열로 별도의 변수에 저장됩니다. 공지 사항: 쉼표 구분 기호는 말 그대로 당신이 만들고있는 큰 문자열에 쉼표를 포함하기 때문에 (","), 인용 부호에 포함된 문자열입니다. 당신이 함께 연결할 데이터의 끝에, Environment.NewLine를 추가합니다. 이것은 (개행 문자)줄 바꿈을 추가합니다. 문자열의 결합은 다음과 같습니다.:
(끝 부분에 눈에 보이지 않는 줄바꿈으로.)
다음은 데이터를 저장하는 파일의 경로가 포함된 파일을 지정하는 변수(dataFile)를 만듭니다. 경로는 절대경로가 아닌 웹사이트 루트 경로(~/)로 지정합니다.
- 브라우저에서 실행한 페이지입니다.
![](https://t1.daumcdn.net/cfile/cafe/1427104D4DCDC1B10C)
- 입력란에 값을 입력한 다음 확인을 누릅니다.
- 브라우저를 닫습니다.
- 프로젝트에서 새로 고침을 누르십시오.
- data.txt 파일을 열어보면 당신이 폼에 제출된 데이터는 파일에 있습니다.
![](https://t1.daumcdn.net/cfile/cafe/2020484D4DCDC1B110)
2. 기존 파일에 데이터를 추가
앞의 예제에서, 당신은 그것에있는 데이터의 한 조각을 가지고있는 텍스트 파일을 만들 WriteAllText를 사용했습니다. 다시 메서드를 호출하고 그것을 동일한 파일 이름을 전달, 기존의 파일이 완전히 덮어 씁니다. 그러나, 파일을 만든후 자주 파일의 끝에 새 데이터를 추가하려면 파일 개체의 AppendAllText 메서드를 사용 할 수 있습니다.
- 웹사이트에, UserData.cshtml 파일의 복사본을 만들고 복사본 이름을 UserDataMultiple.cshtml 로 바꿉니다.
- <! DOCTYPE html로>태그 시작 전에 코드 블록을 다음과 같은 코드 블록으로 교체합니다.
@{ var result = ""; if (IsPost){ var firstName = Request["FirstName"]; var lastName = Request["LastName"]; var email = Request["Email"]; var userData = firstName+","+lastName+","+email+Environment.NewLine; var dataFile = Server.MapPath("~/App_Data/data.txt"); File.AppendAllText (@dataFile, userData); result = "기록하신 정보가 저장되었습니다"; } } |
이 코드는 이전 예제에서 한가지 변화가 있습니다. WriteAllText를 사용하는 대신, AppendAllText 메서드를 사용합니다. 방법은 AppendAllText는 파일의 끝에 데이터를 추가하는 것을 제외하고, 비슷합니다. 그것은 이미 존재하지 않는 경우 WriteAllText과 마찬가지로, AppendAllText는 파일을 만듭니다.
- 브라우저에서 실행한 페이지입니다.
![](https://t1.daumcdn.net/cfile/cafe/130680554DCDCD8B20)
- 필드 값을 입력한 다음 확인을 누릅니다.
- 더 많은 데이터를 양식에 제출하십시오.
- 프로젝트 폴더를 누른 다음 새로 고침을 누릅니다.
- data.txt 파일을 열면 방금 입력한 새 데이터가 포함되어 있습니다.
![](https://t1.daumcdn.net/cfile/cafe/180DEF554DCDCD8B1A)
3. 파일에서 데이터를 읽고 표시하기
텍스트 파일에 데이터를 쓸 필요는 없다하더라도, 당신은 아마 때때로 데이터를 읽여야 할 때가있습니다. 이렇게하려면, 다시 File object를 사용할 수 있습니다. 또는 개별적(줄바꿈으로 구분)으로 각 라인을 읽는 방법 또는 분리된 것과는 상관 없이 개별적으로 읽는 방법에서 File 메서드를 사용할 수 있습니다.
이 절차에서는 이전 예제에서 만든 데이터를 읽고 표시하는 방법을 보여줍니다.
- 웹사이트 루트에, DisplayData.cshtml라는 새 파일을 만듭니다.
- 다음과 같이 기존 코드를 교체합니다:
@{ var result = ""; Array userData = null; char[] delimiterChar = {','}; var dataFile = Server.MapPath("~/App_Data/data.txt"); if (File.Exists(dataFile)){ userData = File.ReadAllLines(dataFile); if(userData == null){ //Empty file. result = "파일이 비어있습니다."; } } else{ //화일이 존재하지 않음. result = "화일이 존재하지 않습니다."; } }
<!DOCTYPE html> <html> <head> <title>파일로부터 데이터 읽기</title> </head> <body> <div> <h1>파일에서 데이터 가져와 읽기</h1> @result @if(result ==""){ <ol> @foreach(string dataLine in userData){ <li> 사용자 <ul> @foreach(string dataItem in dataLine.Split(delimiterChar)){ <li>@dataItem</li> } </ul> </li> } </ol> } </div> </body> </html> |
코드는 다음과 같은 메서드 호출을 사용하여, UserData를라는 이름의 변수로 이전 예제에서 만든 파일을 읽기 시작합니다 :
File.ReadAllLines(dataFile) |
이 작업을 수행하는 코드는 if 문 안쪽에서 이루어집니다. 파일을 읽으려면 첫 번째로 파일을 사용할 수 있는지 여부를 결정하는 File.Exists 메서드를 사용하는 것이 좋습니다. 코드는 또한 파일이 비어 있는지 여부를 확인합니다.
본문은 두 foreach 루프가 있으며, 내부에 중첩된 다른 하나가 포함되어 있습니다. 외부 foreach 절은 데이터 파일에서 한 번에 하나의 라인을 가져옵니다. 이 경우, 라인이 파일에서 줄바꿈에 의해 정의됩니다 - 즉, 각 데이터 항목은 자체 라인에 있습니다. 외부 루프는 주문한 목록 (<ol> 요소) 내부에 새 항목을 (<li> 요소)를 만듭니다.
내부 루프는 구분 기호로 쉼표를 사용하여 항목에 각 데이터 라인 (fields) 분할합니다. (이전 예제를 기반으로, 이것은 각각의 라인은 5 필드를 포함 것을 의미 -. 첫 번째 이름, 성, 이메일 주소, 각각 쉼표로 구분) 내부 루프는 또한 <ul> 목록을 표시 한리스트 항목에 대한 각 필드에 대한 데이터를 생성합니다.
이 코드는 배열(Array)와 문자(Char)의 두가지 데이터 타입의 사용법을 설명합니다. 배열은 배열로부터 데이터를 가져오는 File.ReadAllLines이 필요합니다. 문자(Char)는 배열의 각 문자 타입으로부터 데이터를 가져오는 Split 메서드가 필요합니다.
- 브라우저에서 실행한 페이지입니다. 당신이 이전 예제에 대한 입력 데이터가 표시됩니다.
![](https://t1.daumcdn.net/cfile/cafe/165947344DCDE4442A)
Microsoft Excel의 쉼표로 구분된 파일에서 데이터 표시 쉼표로 구분된 파일과 스프레드 시트에 포함된 데이터를 저장하려면 Microsoft Excel(.csv 파일)을 사용할 수 있습니다. 일반 텍스트파일로 저장할 때, 파일이 Excel 형식이 아닌 일반 텍스트로 저장됩니다. 스프레드 시트의 각 행은 텍스트 파일에 줄바꿈으로 구분되고 각 데이터 항목은 쉼표로 구분됩니다. 코드에서 데이터 파일의 이름을 변경하여 Excel에서 쉼표로 구분된 파일을 읽을 때, 앞의 예제에 표시된 코드를 사용할 수 있습니다. |
4. 파일 삭제
웹사이트에서 파일을 삭제하려면, 당신은 File.Delete 메서드를 사용할 수 있습니다. 이 절차는 사용자가 화일명을 알고 있는 이미지 폴더에서 이미지를 삭제(.jpg)하는 방법을 알려줍니다.
- 웹사이트 루트에, images라는 이름의 하위 폴더를 만듭니다.
- images폴더에 하나 이상의 jpg 파일을 복사합니다.
- 웹사이트의 루트에, FileDelete.cshtml라는 새 파일을 만듭니다.
- 기본 마크업과 코드를 다음과 같이 교체합니다:
@{ bool deleteSuccess = false; var photoName = ""; if(IsPost){ photoName = Request["photoFileName"] + ".jpg"; var fullPath = Server.MapPath("~/Images/"+photoName); if(File.Exists(fullPath)){ File.Delete(fullPath); deleteSuccess = true; } } }
<!DOCTYPE html> <html> <head> <title>Delete a Photo</title> </head> <body> <h1>사이트에서 파일 삭제</h1> <form name="deletePhoto" action="" method="post"> <p>삭제할 파일명(.jpg 확장자 없이): <input name="photoFileName" type="text" value="" /> </p> <p><input type="submit" value="삭 제" </p> </form> @if(deleteSuccess) { <p> @photoName 삭제되었습니다! </p> } </body> </html> |
이 페이지는 사용자가 이미지 파일의 이름을 입력할 수있는 양식이 포함되어 있습니다. 그들은 입력하지 않은 파일 이름 확장명을 jpg로;. 이런식으로 파일 이름을 제한함으로써, 당신은 귀하의 사이트에 임의의 파일을 삭제하지 못하도록 방지하는데 도움이됩니다.
코드는 사용자가 입력한 파일 이름을 읽은 다음 전체 경로를 구성합니다. 경로를 만들려면 코드는 현재 웹사이트의 경로를 가르키며(Server.MapPath 메서드에 의해 반환된), Images 폴더 이름, 사용자가 제공하는 이름을 리터럴 문자열로 ". jpg"를 사용합니다.
파일을 삭제하려면, 코드는 당신이 방금 만들어진 전체 경로를 통과, File.Delete 메서드를 호출합니다. 끝 부분에 삭제 확인 메시지에 "파일을 삭제했습니다"를 마크업합니다.
- 브라우저에서 시행한 페이지입니다.
![](https://t1.daumcdn.net/cfile/cafe/164CDA4A4DCDED5421)
- 삭제할 파일의 이름을 넣은 다음 삭제을 누릅니다. 파일이 삭제된 경우 파일의 이름이 페이지의 하단에 표시됩니다.
![](https://t1.daumcdn.net/cfile/cafe/12517B4A4DCDED541A)
5. 사용사 업로드 파일 내려받기
FileUpload Helper로 사용자가 귀하의 웹사이트에 파일을 업로드할 수 있습니다. 절차는 아래 방법을 사용자가 한 파일을 업로드할 수 있도록 보여줍니다.
- 당신의 웹사이트에 ASP.NET Web Helpers Library를 추가하지 않았다면 Chapter 1 - Getting Started with ASP.NET Web Pages의 설명과 같이 추가합니다.
- App_Data 폴더에 새 폴더 이름을 UploadedFiles 만듭니다.
- 루트에, FileUpload.cshtml라는 새 파일을 만듭니다.
- 기본 마크업과 코드를 다음과 같이 교체합니다 :
@{ var fileName = ""; if(IsPost){ var fileSavePath = ""; var uploadedFile = Request.Files[0]; fileName = Path.GetFileName(uploadedFile.FileName); //사용자 경로에서 실제 파일 이름을 추출하기 fileSavePath = Server.MapPath("~/App_Data/UploadedFiles/" + fileName); //Server 저장 경로에 화일명 추가 uploadedFile.SaveAs(fileSavePath); } }
<!DOCTYPE html> <html> <head> <title>FileUpload - Single-File Example</title> </head> <body> <h1>파일 업로드 - 싱글 파일 예제</h1> @FileUpload.GetHtml( initialNumberOfFiles:1, allowMoreFilesToBeAdded:false, includeFormTag:true, uploadText:"업로드") @if (IsPost) { <span>파일이 업로드 되었습니다.!</span><br/> } </body> </html> |
페이지의 본문 부분에 FileUpload helper를 사용하여 아마도 익숙한 업로드 상자와 버튼를 만듭니다:
FileUpload Helper에 대해 업로드 버튼을 클릭했을 때 하나의 업로드 파일을 원한것에 대한 속성을 지정합니다.(당신이 장의 뒷부분에서 더 많은 상자를 추가할 것입니다.)
사용자가 업로드 버튼을 클릭햇을 때, 체이지의 상단에 있는 코드는 파일을 얻고 저장합니다. 일반적으로 폼으로부터 값을 얻기위하여 사용되는 Request 개체는 또한 업로드된 file(files)을 포함하는 files Array를 갖습니다.
배열의 특정 위치의 개별 파일의 출력을 얻을 수 있습니다 - 예를 들어, 첫 번째 업로드된 파일을 얻으려면, 당신은 Request.Files [0], 두 번째 파일을 얻으려면 Request.Files [1] 등등. (프로그래밍 에서 보통 "0"에서 시작하는 것을 기억하세요.)
올린 파일을 가져올 때, 그것을 조작할 수 있도록 변수(여기서, uploadedFile)에 넣어. 업로드된 파일의 이름을 확인하려면, 단지 그 파일 이름 속성을 받습니다. 그러나, 사용자가 파일을 업로드할 때, FileName은 전체 경로를 포함하는 사용자의 원래 이름을 포함하고 있습니다. 그것은 다음과 같이 :
Path.GetFileName(uploadedFile.FileName)
서버가 아닌 사용자의 컴퓨터에 있는 경로이기 때문에 모든 경로 정보를 얻을 수 없습니다. 실제 파일 이름 (Sample.txt) 얻고 싶을 때, 이 같은 Path.GetFileName 메서드를 사용하여 경로에서 파일을 적절히 추출하고 있습니다 :
Path.GetFileName(uploadedFile.FileName) |
Path 개체는 경로의 분할과 결합 등등의 방법에 관한 유틸리티입니다.
일단 업로드할 파일의 이름을 얻고, 웹사이트로부터 얻은 파일을 당신이 원하는 경로에 저장할 수 있도록 새로운 경로를 구축할 수 있습니다. 이 경우에 새로운 경로를 만들 Server.MapPath 메서드에 폴더 이름(App_Data / UploadedFiles), 그리고 새로 분리한 파일 이름을 결합하여. 그런 다음 실제로 파일을 저장 업로드된 파일의 SaveAs 메서드를 호출할 수 있습니다.
- 브라우저에서 실행한 페이지입니다.
- 찾아보기를 누른 다음 업로드할 파일을 선택합니다.
찾아보기 버튼 옆에있는 텍스트 상자의 경로와 파일 위치가 포함됩니다.
- Click 업로드.
![](https://t1.daumcdn.net/cfile/cafe/20339D554DCE16AB28)
- 웹사이트 마우스 오른쪽 단추로 프로젝트 폴더를 누른 다음 새로 고침을 누릅니다.
- UploadedFiles 폴더를 오픈하면, 당신이 올린 파일은 폴더에 있습니다.
6. 사용자가 업로드한 다중파일 내리기
앞의 예제에서 사용자가 하나의 파일을 업로드했습니다. 하지만 당신은 한 번에 하나 이상의 파일을 업로드하는 FileUpload 도우미를 사용할 수 있습니다. 이것은 한 번에 하나의 파일을 업로드하는 지루한 작업이 아닌 사진 업로드와 같은 시나리오에 대한 편리합니다. (당신은 제 9 장의 사진을 업로드에 대해 읽을 수있다 -. 이미지 작업) 사용자는 한 번에 두개를 업로드할 수 있도록하는 방법과 그 이상을 업로드하려면 같은 기술을 사용할 수 있지만 이 예제는두개를 한번에 업로드하는 방법을 보여줍니다.
- 당신의 웹사이트에 ASP.NET Web Helpers Library를 추가하지 않았다면 Chapter 1 - Getting Started with ASP.NET Web Pages의 설명과 같이 추가합니다.
- FileUploadMultiple.cshtml라는 새 페이지를 만듭니다.
- 기본 마크업과 코드를 다음과 같이 페이지를 교체합니다:
@{ var message =""; if(IsPost){ var fileName = ""; var fileSavePath = ""; int numFiles = Request.Files.Count; int uploadedCount = 0; for(int i = 0; i < numFiles; i++){ var uploadedFile = Request.Files[i]; if(uploadedFile.ContentLength > 0) { fileName = Path.GetFileName(uploadedFile.FileName); fileSavePath = Server.MapPath("~/App_Data/UploadedFiles/" + fileName); uploadedFile.SaveAs(fileSavePath); uploadedCount++;} } message = "파일이 완전히 업로드되었습니다. 업로드된 파일 수는 : "+uploadedCount.ToString(); } } <!DOCTYPE html> <html> <head><title>FileUpload - Multiple File Example</title></head> <body> <form id="myForm" method="post" enctype="multipart/form-data" action=""> <div> <h1>파일 업로드 - 다중 파일 올리기 샘플</h1> @if (!IsPost) { @FileUpload.GetHtml( initialNumberOfFiles:2, allowMoreFilesToBeAdded:true, includeFormTag:true, addText:"Add another file", uploadText:"Upload") } <span>@message</span> </div> </form> </body> </html> |
이 예제에서는 페이지의 본문에 FileUpload Helper 에서 사용자는 기본적으로 2개의 파일을 업로드할 수 있도록 구성되어 있습니다. allowMoreFilesToBeAdded가 treu 로 세팅되어있기 때문에 사용자가 업로드 박스를 더 추가할 수 있습니다:
![](https://t1.daumcdn.net/cfile/cafe/14580E434DCE289830)
Request.Files에서 파일을 다음으로 저장 - 파일 처리를 위해서는 사용자가 업로드 즉, 코드는 이전 예제에 사용되는 동일한 기본 기술을 사용합니다. (당신이 바로 파일 이름과 경로를 얻기 위해서해야 할 여러 가지를 포함.)이 시간은 사용자가 여러 파일을 업로드하는 것, 그리고 그 많은 모른다는 혁신. 확인하려면, 당신은 Request.Files.Count를 얻을 수 있습니다.
손, 당신은 루프를 통해 할 수 Request.Files이 번호와,, 차례로 각 파일을 가져와 그것을 저장합니다. 당신은 컬렉션을 반복 번 알려진 전화 번호를 원한다면, 당신은 이런식으로 루프를위한을 사용할 수 있습니다 :
용 (int는 나는 = 0; 나는 <numFiles; 난 + +) {
var에 uploadedFile가 = Request.Files [나];
(uploadedFile.ContentLength> 0) {면
파일명 = Path.GetFileName (uploadedFile.FileName);
/ / 등
} 변수 난 당신이 설정한대로 상한에 제로에서 가서 그냥 일시적인 카운터이다. 이 경우에는 상한 파일의 개수입니다. 하지만 제로 카운터 시작에, 같은 ASP.NET에서 시나리오를 계수에 대한 전형적인 모습입니다, 상한 실제로 하나의 파일 개수보다 적습니다. (3 파일을 업로드하는 경우, 개수는 2 제로입니다.)
uploadedCount 변수가 성공적으로 업로드되며 저장된 모든 파일을 합계. 예상 파일을하지 못할 수있는 가능성에 대해서도이 코드 계정을 업로드할 수 있습니다.
브라우저에서 4.Run 페이지입니다. 브라우저는 페이지를 표시 두 상자를 업로드는.
5.Select이 파일을 업로드합니다.
6.Click 다른 파일을 추가합니다. 페이지가 새 상자를 업로드 표시됩니다.
7.Click 업로드.
![](https://t1.daumcdn.net/cfile/cafe/1958D3434DCE289833)
8.In 웹사이트 마우스 오른쪽 단추로 프로젝트 폴더를 누른 다음 새로 고침을 누릅니다.
성공적으로 업로드된 파일을 볼 UploadedFiles 폴더를 9.Open.
추가 리소스
제 9 장 - 이미지 작업
CSV 파일 내보내기에
면도기 문법 레퍼런스와 ASP.NET 웹 페이지