'2018/03'에 해당되는 글 4건

Programming/.NET

Web API는 AJAX와 비슷한 동작방식을 통해 데이터및 저장소처리작업등을 단일 페이지안에서 모두 처리가 가능하도록 하는 기술입니다. 이 기술을 실제 활용해 보기 위해 예제를 만들어 볼텐데, 예제 프로젝트는 생성할때 다음과 같이 Web API 부분을 먼저 체크하여 Web API구현에 필요한 요소가 프로젝트에 추가될 수 있도록 해야합니다.

 

 

이렇게 프로젝트가 생성한 후

 

public class Member
{
    public string Id { getset}
    public string Name { getset}
    public int Level { getset}
}

 

간단한 Model을 생성하고

 

public class Members
{
    private static Members mbs = new Members();

    public static Members GetMbs
    {

         get { return mbs}
    }

    public List<MemberMemberList = new List<Member{
        new Member { Id = "cliel1"Name = "홍길동"Level = 10 },
        new Member { Id = "cliel2"Name = "홍길순"Level = 20 },
        new Member { Id = "cliel3"Name = "홍길남"Level = 30 },
        new Member { Id = "cliel4"Name = "홍길영"Level = 40 },
        new Member { Id = "cliel5"Name = "홍길석"Level = 50 }
    };

    public IEnumerable<MemberGetMember()
    {
        return MemberList;
    }

    public Member GetById(string id)
    {
        return MemberList.Where(x => x.Id == id).First();
    }

    public bool AddMember(Member m)
    {
        MemberList.Add(m);

         return true;
    }

    public bool RemoveMember(string id)
    {
        Member m = GetById(id);
        MemberList.Remove(m);

        return true;
    }

    public bool ModifyMember(Member m)
    {
        Member mb = GetById(m.Id);

        if (mb == null)

             return false;

        mb.Name = m.Name;
        mb.Level = m.Level;

        return true;
    }
}

 

해당 Model을 대상으로 가져오기및 추가, 삭제가 가능한 별도의 클래스를 구현합니다.

 

public class MyController : ApiController
{
    private Members mbs = Members.GetMbs;

    // GET: Home
    public IEnumerable<MemberGetMembers()
    {
        return mbs.GetMember();
    }

    public Member GetMember(string id)
    {
        return mbs.GetById(id);
    }

    public bool AddMember(Member m)
    {
        return mbs.AddMember(m);
    }

    public bool RemoveMember(string id)
    {
        return mbs.RemoveMember(id);
    }

    public bool ModifyMember(Member m)
    {
        return mbs.ModifyMember(m);
    }
}

 

그리고 조금은 특별한 Controller를 하나를 생성해야 하는데 Web API에서 중요한 부분입니다. 이 컨트롤러는 ApiController를 상속받아야 하며 일반적인 액션메서드와는 달리 이 컨트롤러의 액션메서드는 Model개체 자체를 반환하는 성격을 가져야 합니다.

 

위와 같은 컨트롤러를 생성하고 예제 프로그램을 실행시킨뒤 /api/my 로 이동하면 MyController의 GetMembers 메서드가 실행되고 json이나 XML데이터를 통해 IEnumerable 형식의 Member 개체를 반환할 것입니다. 이러한 동작이 가능한 이유는 프로젝트에 Web API 동작을 위한 별도의 라우팅구성을 마련했고 그 설정을 WebApiConfig.cs 파일을 통해 제공하고 있기 때문입니다.

 

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name"DefaultApi",
        routeTemplate"api/{controller}/{id}",
        defaultsnew { id = RouteParameter.Optional }
    );
}

 

따라서 /api/my 의 이동은 아무런 매개변수 전달이 없는 HTTP요청이 되고 이 매개변수없는 요청은 GetMembers() 메서드와 일치하여 최종적으로 Member의 배열요소를 반환할 수 있게 되는 것입니다. 만약 api/my/cliel3 URL을 요청하게 되면 이 요청은 id값의 매개변수를 가진 요청이 되고 이것은 우선적으로 GetMember(id) 메서드와 일치하여 cliel3의 id에 해당하는 Member개체를 반환하게 됩니다.

 

참고로 URL매칭같은 Get이외에 Post와 같은 요청에서만 일치되는 메서드를 지정하고 싶다면 [HttpPost]와 같은 속성을 메서드에 지정하면 됩니다.

 

Web API구현은 이것으로 끝났습니다. 단지 클래스하나를 만드는 것만으로 Web API를 사용할 수 있으며 이제 컨틀롤러를 활용할 HomeController와 Index뷰를 생성해 보도록 하겠습니다.

 

@model WebApplication1.Models.Member

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <script src="~/Scripts/jquery-3.1.1.js"></script>
    <script type="text/javascript">
        var getMembers = function () {
            $.ajax('/api/my'{ type: "GET", success: printList });
        };

        var printList = function (d) {
            $('#tbl_list tr').remove();

            for (var i = 0; i < d.length; i++)
                $('#tbl_list').append('<tr><td>' + d[i].Id + '1</td><td>' + d[i].Name + '1</td><td>' + d[i].Level + '1</td></tr>');
        };

        $(function () {
            getMembers();
        });
    </script>
    <title>Index</title>
</head>
<body>
    <table id="tbl_list">
        <tr><td>Member List</td></tr>
    </table>
    <br />
</body>

</html>

Index에서는 JQuery를 이용하여 위에서 만든 Web API 와 통신할 수 있는 AJAX구현을 통해 초기 페이지가 열릴때 Member개체의 리스트를 받아오도록 하였습니다.

 

<script type="text/javascript">
    var getMembers = function () {
        $.ajax('/api/my'{ type: 'GET', success: printList });
    };

    var removeMember = function (id) {
        $.ajax('/api/my/' + id, { type: 'DELETE', success: getMembers });
    };

    var printList = function (d) {
        $('#tbl_list tr').remove();

        for (var i = 0; i < d.length; i++)
            $('#tbl_list').append('<tr><td>' + d[i].Id + '</td><td>' + d[i].Name + '</td><td>' + d[i].Level + '</td><td><input type="button" onclick="removeMember(\'' + d[i].Id + '\');" value="삭제" /></td ></tr > ');
    };

    $(function () {
        getMembers();
    });
</script>

 

스크립트를 수정하여 이번에는 리스트를 가져올때 각 명단측면에 '삭제'버튼이 존재하도록 하였습니다. 사용자가 삭제버튼을 누르면 removeMember 메서드가 호출되고 DELETE 요청이 들어가 해당 Member를 삭제할 것입니다.

 

[HttpDelete]
public bool RemoveMember(string id)
{
    return mbs.RemoveMember(id);
}

 

참고로 MyController의 RemoveMember메서드에서는 Delete 요청을 받아들일 수 있도록 속성을 추가 하였습니다.

 

@model WebApplication1.Models.Member

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <script src="~/Scripts/jquery-3.1.1.js"></script>
    <script type="text/javascript">
        var getMembers = function () {
            $.ajax('/api/my'{ type: 'GET', success: printList });
        };

        var removeMember = function (id) {
            $.ajax('/api/my/' + id, { type: 'DELETE', success: getMembers });
        };

        var addMember = function () {
            var member = { Id: $('#id').val(), Name: $('#Name').val(), Level: $('#Level').val() };
            $.ajax({
                type: 'POST',
                data: JSON.stringify(member),
                url: 'api/my/AddMember',
                contentType: 'application/json',
                success: getMembers
            });
        };

        var printList = function (d) {
            $('#tbl_list tr').remove();

            for (var i = 0; i < d.length; i++)
                $('#tbl_list').append('<tr><td>' + d[i].Id + '</td><td>' + d[i].Name + '</td><td>' + d[i].Level + '</td><td><input type="button" onclick="removeMember(\'' + d[i].Id + '\');" value="삭제" /></td ></tr > ');
        };

        $(function () {
            getMembers();
        });
    </script>
    <title>Index</title>
</head>
<body>
    <table id="tbl_list">
        <tr><td>Member List</td></tr>
    </table>
    <br />
    @Html.TextBoxFor(x => x.Id)<br />
    @Html.TextBoxFor(x => x.Name)<br />
    @Html.TextBoxFor(x => x.Level)<br />
    <input type="button" onclick="javascript: addMember()" value="추가" />
</body>
</html>

 

마지막으로 Member를 추가하는 경우입니다. 추가버튼을 누르면 addMember 메서드를 호출하게 되고 이 메서드에서 Member 속성에 맞는 각 입력값들로 member개체를 만들어 POST로 Web Api에 전달하여 Member개체를 추가할 것입니다.

 

이때 url속성을 'api/my/AddMember'로 명시적으로 지정하였는데 이 URL을 사용하기 위해 라우팅구성을 다음과 같이 추가하였습니다.

 

config.Routes.MapHttpRoute(
    name"ControllerAndAction",
    routeTemplate"api/{controller}/{action}"
);

config.Routes.MapHttpRoute(
    name"DefaultApi",
    routeTemplate"api/{controller}/{id}",
    defaultsnew { id = RouteParameter.Optional }
);

 

'Programming > .NET' 카테고리의 다른 글

[C#] 자동구현속성  (0) 2018.04.17
[C#] 익명메서드(anonymous method)  (0) 2018.04.10
[ASP.NET MVC] Web API  (0) 2018.03.28
[ASP.NET MVC] 필터(Filter)  (0) 2018.03.20
[ASP.NET MVC] 컨트롤러(Controller)  (0) 2018.03.14
[C#] File / FileInfo  (0) 2018.03.07
0 0
Programming/.NET

1. 인증및 권한

 

로그인된(인증된) 사용자에게만 접근을 허용하고자 한다면 필요한 컨트롤러 클래스나 액션메서드에 Authorize 속성을 지정해 인증필터를 구현하면 됩니다.

 

[Authorize]
public ActionResult MyPage()
{
    return View();
}

 

더불어 Authorize 에 특정 사용자나 그룹을 지정해 권한필터를 구현할 수 있습니다. 이때 권한필터는 인증필터이후 액션필터나 메서드가 실행되기 직전에 실행됩니다.

 

[Authorize(Users ="admin")]
public ActionResult MyPage()
{
    return View();
}

 

admin 사용자에게만 MyPage 로의 접근을 허용합니다. 이 속성이 컨틀롤러 클래스에 적용되면 하위 모든 액션메서드가 영향을 받게 됩니다.

 

[Authorize(Roles ="admins")]
public ActionResult MyPage()
{
    return View();
}

 

특정 사용자가 아닌 사용자 그룹단위의 권한인 경우에는 Roles 속성을 지정합니다. 사용자와 그룹모두 2개 이상을 지정해야 하는 경우에는 각 사용자/그룹을 콤마(,)로 구분합니다.

 

2. 예외

 

예외필터는 HandleError 속성을 사용함으로서 구현할 수 있습니다.

 

[HandleError(ExceptionType =typeof(DivideByZeroException)View = "ErrorPage")]
public ActionResult MyPage(int id)
{
    float f = 25 / id;

    return View();
}

 

HandleError에 사용된 ExceptionType은 예외를 발생시키게 되는 예외타입을 지정하며 지정된 해당 타입이외에 다른 예외는 HandleError에서 처리하지 않습니다. 하지만 이 속성을 따로 지정하지 않으면 기본적으로 System.Exception 으로 처리하기에 모든 예외를 다루게 됩니다.

 

View는 예외가 발생했을때 사용자에게 보여질 View페이지를 지정합니다. 이 속성의 기본값은 Error입니다.

 

<body>

     <div> 
        예외 발생 정보 : <br />
        컨트롤러 : @(((HandleErrorInfo)Model).ControllerName)<br />
        메서드 : @(((HandleErrorInfo)Model).ActionName)<br />
        예외내용 : @(((HandleErrorInfo)Model).Exception)
    </div>
</body>

 

참고로 View 페이지에서는 위와 같이 예외를 발생시킨 기본적인 정보를 확인할 수 있습니다.

 

3. 필터 메서드 구현

 

컨트롤러 클래스에서 직접적으로 필터에 대한 메서드를 오버라이드하면 속성을 구현하지 않고도 필터를 적용할 수 있습니다.

 

protected override void OnException(ExceptionContext filterContext)
{
            
}

 

예를 들어 예외처리에 대한 필터는 OnException 으로

 

protected override void OnAuthorization(AuthorizationContext filterContext)
{
            
}

 

인증및 권한에 관한건 OnAuthorization 메서드로 구현됩니다.

 

다만 이렇게 메서드를 오버라이드하여 구현하면 필터는 컨트롤러 클래스 단위로 적용됩니다.

 

4. 전역 필터

 

전역필터는 모든 컨트롤러 클래스와 액션 메서드에 적용되는 필터로서 App_Start 폴더에 있는 FilterConfig.cs 파일안에서 정의됩니다.

 

namespace Filters
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            
        }
    }
}

 

만약 App_Start 안에 FilterConfig.cs 파일이 없다면 위 내용대로 새로운 파일을 만들어야 합니다.

 

namespace Filters
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }
}

 

필터의 추가는 filters개체의 Add 메서드를 통해 추가할 수 있습니다. 예제에서는 HandleErrorAttribute 개체를 생성해 등록하고 있으므로 프로그램에서의 모든 예외를 여기서 처리하게 됩니다.

 

위와 같이 전역적으로 사용할 필터를 등록했으면 Global.asax 파일에서 해당 필터가 동작할 수 있게끔 다음과 같이 설정해야 합니다.

 

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
}

'Programming > .NET' 카테고리의 다른 글

[C#] 익명메서드(anonymous method)  (0) 2018.04.10
[ASP.NET MVC] Web API  (0) 2018.03.28
[ASP.NET MVC] 필터(Filter)  (0) 2018.03.20
[ASP.NET MVC] 컨트롤러(Controller)  (0) 2018.03.14
[C#] File / FileInfo  (0) 2018.03.07
[C#] Hashtable / SortedList  (0) 2018.02.27
0 0
Programming/.NET

1. 요청값 처리

 

ASP.NET MVC에서는 컨트롤러와 뷰를 나타내는 세그먼트 이외에 다른 값은 컨트롤러의 매개변수로서 처리할 수 있습니다. 예를 들어

 

routes.MapRoute(
    name"Default",
    url"{controller}/{action}/{id}",
    defaultsnew { controller = "Home"action = "Index"id = UrlParameter.Optional }
);

 

기본 라우트 설정에 의해 id를 유동적으로 받을 수 있다면 컨트롤러에서는 id를 매개변수로 하여

 

public ActionResult Index(string id)
{
    ViewBag.id = id;

    return View();
}

 

필요한 값을 받아올 수 있게 됩니다.

 

public ActionResult Index(string id = "cliel")
{
    ViewBag.id = id;

    return View();
}

 

이 예제는 매개변수에 기본값을 지정하여 아무런 값이 전달되지 않았을때 대안을 마련한 것입니다. 참고로 값형식의 매개변수는 값이 반드시 존재해야 하지만 string이나 object와 같은 참조형식은 아무런 값이 없을때 null이 됩니다.

 

2. 액션 처리

 

액션 메서드에서는 필요에 따라 다른 경로로 리다이렉션을 하거나 특정한 부분뷰를 반환할 수 있습니다. 예를 들어

 

public ActionResult Index()
{
    return Redirect("/Home/MyPage");
}

 

사용자를 리다이렉션하려면 위와 같이 Redirect 메서드를 사용할 수 있습니다. 이외에도 사용자에게 다양한 뷰를 렌더하기 위한 다음 헬퍼메서드들이 존재합니다.

 

 View

 뷰를 렌더합니다.

 PartialView

 부분 뷰를 렌더합니다.

 Redirect

 특정 URL로 302 리다이렉션을 수행합니다.

 RedirectPermanent

 특정 URL로 301 리다이렉션을 수행합니다.

 RedirectToRoute

 라우트에 기반한 302 리다이렉션을 수행합니다.

 RedirectToRoutePermanent

 라우트에 기반한 301 리다이렉션을 수행합니다.

 RedirectToAction

 RedirectToRoute 의 래퍼버전

 RedirectToActionPermanent

 RedirectToRoutePermanent 의 래퍼버전

 HttpStatusCodeResult

 특정 HTTP 상태값을 반환합니다.

 File

 파일과 같은 이진데이터를 전송합니다.

 Json

 Json 형식의 데이터를 반환합니다.

 JavaScript

 JavaScript 코드를 반환합니다.

 None

 401 미인증 오류를 반환합니다.

 HttpNotFound

 404 찾을 수 없음 오류를 반환합니다.

 None

 매개변수에 특정 코드를 입력하면 코드에 해당하는 HTTP 코드를 반환하거나 아무런 동작도 수행하지 않습니다.

 

특히 View는 가장 자주 사용되는 메서드로서 아래와 같이 메서드만을 사용할 경우

 

public ActionResult Index()
{
    return View();
}

 

액션 메서드와 동일한 이름의 뷰를 렌더하거나

 

public ActionResult Index()
{
    return View("MyPage");
}

 

같은 컨트롤러안에 다른 뷰를 렌더할 수 있습니다.

 

public ActionResult Index()
{
    return RedirectToRoute(new { controller = "My"action = "MyPage" });
}

 

RedirectToRoute는 특정 컨트롤러나 뷰로의 리다이렉션을 수행합니다. 그런데 이 동작은 RedirectToAction을 통해서도 동일하게 수행할 수 있습니다.

 

public ActionResult Index()
{
    return RedirectToAction("MyPage");
}

 

같은 컨트롤러에 있는 MyPage로의 액션메서드로 리다이렉션을 수행합니다.

 

public ActionResult Index()
{
    return RedirectToAction("MyPage""My");
}

 

다른 컨트롤러의 액션메서드를 지정해야 한다면 두번째 매개변수로 컨트롤러를 지정합니다.

 

public ActionResult Index()
{
    return new HttpStatusCodeResult(404, "Page Not Found");
}

 

특정 HTTP 상태값을 전달하려면 HttpStatusCodeResult 메서드를 사용합니다. 하지만 이 메서드를 별도의 헬퍼메서드를 제공하지 않으므로 개체를 직접 생성해서 전달해야 합니다.

 

public ActionResult Index()
{
    return HttpNotFound();
}

 

같은 404 코드라면 HttpNotFound 메서드를 사용할 수 있습니다.

 

3. 데이터 전달

 

컨트롤러와 뷰사이에 데이터를 전달해야 하는 경우에는 일반적으로 ViewBag 개체를 사용합니다.

 

public ActionResult Index()
{
    ViewBag.name = "cliel";
    ViewBag.time = DateTime.Now;
    return View();
}

 

컨트롤러에서 ViewBag을 사용해 전달하고자 하는 데이터를 저장합니다. 이때 name 이나 time 속성은 임의로 지정이 가능하며

 

<body>

    <div>
        test
        @ViewBag.name 님 @ViewBag.time 에 로그인

    </div>
</body>

 

뷰에서는 컨트롤러와 마찬가지로 ViewBag의 속성을 통해 설정된 값을 가져올 수 있습니다.

 

만약 리다이렉션을 통하여 데이터를 전송해야 한다면 ViewBag만으로는 원하는바를 이루기가 힘들것입니다. 이때는 TempData 를 이용할 수 있습니다.

 

public ActionResult Index()
{
    TempData["name"] = "cliel";
    TempData["time"] = DateTime.Now;

    return RedirectToAction("MyPage""My");
}

 

TempData는 임의의 값을 위와 같이 설정하고

 

<body>

    <div>
        @TempData["name"] 님 @(((DateTime)TempData["time"]).Hour) 시에 접속
    </div>
</body>

 

뷰에서는 동일한 방법으로 값을 읽어올 수 있습니다. 주의해야할 점은 TempData는 기본적으로 값을 한번 읽으면 더이상 값을 보존하지 않고 삭제합니다. 따라서 한번 읽은 값은 다시 읽을 수 없습니다.

 

다만

 

@TempData.Peek("name") 님 @(((DateTime)TempData["time"]).Hour) 시에 접속

 

Peek 메서드를 통해 값을 읽으면 한번 더 데이터를 읽을 수 있도록 임시로 데이터를 보존할 수 있습니다.

 

4. 데이터 모델

 

뷰에 특정 모델에 대한 개체를 전달하려면 View메서드에 해당 개체를 지정하면 됩니다.

 

public ActionResult Index()
{
    var t = DateTime.Now;
    return View(t);
}

 

예제의 컨트롤러에서는 View에 현재시간을 개체로 하여 모델로 전달하고 있습니다.

 

<body>

     <div>
        현재는 : @(((DateTime)Model).Month) 월 입니다.
    </div>
</body>

 

뷰에서 모델을 받을때는 해당 형식으로 변환해 줘야 합니다. 왜냐하면 뷰에서 모델은 기본적으로 object형식이기 때문입니다.

 

혹은 뷰에서 미리 모델의 형식을 지정해 두면 뷰본문에서 모델의 형변환절차를 생략할 수 있습니다.

 

@model DateTime

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        현재는 : @Model.Month 월 입니다.
    </div>
</body>
</html>

 

5. 세션처리

 

[SessionState(System.Web.SessionState.SessionStateBehavior.Default)]
public class HomeController : Controller
{
    // GET: Home
    public ActionResult Index()
    {
        return View();
    }
}

 

SessionState 속성으로 SessionStateBehavior 열거형값을 설정하면 세션처리를 어떻게 할지 컨트롤러 범위에서 결정할 수 있습니다.

 

SessionStateBehavior 가 Default면 기본적인 세션처리를 의미하며 HttpContext에서 세션처리를 위임하게 됩니다. 반면 Required면 세션에 대한 읽기/쓰기가 가능하고 ReadOnly면 세션에 대해 읽기만 가능하도록 합니다. 마지막으로 Disabled면 세션을 사용하지 않도록 합니다.

 

세션처리가 중요한 이유는 성능에 영향을 미칠 수 있기 때문입니다. 가능하면 세션을 사용하지 않는것이 성능에 도움이 됩니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET MVC] Web API  (0) 2018.03.28
[ASP.NET MVC] 필터(Filter)  (0) 2018.03.20
[ASP.NET MVC] 컨트롤러(Controller)  (0) 2018.03.14
[C#] File / FileInfo  (0) 2018.03.07
[C#] Hashtable / SortedList  (0) 2018.02.27
[ASP.NET MVC] 라우팅(Routing)  (0) 2018.02.21
0 0
Programming/.NET

System.IO.File은 파일을 조작하기 위한 클래스입니다.

 

System.IO.File.Copy("aaa.txt", "bbb.txt");
System.IO.File.Copy("aaa.txt", "bbb.txt", true);

 

aaa.txt파일을 bbb.txt로 복사합니다. 다만 복사될 위치(Environment.CurrentDirectory값 기본)에 bbb.txt가 존재한다면 예외가 발생하는데, 예외를 발생시키지 않고 그냥 덮어쓰고자 하는경우 3번째 인자값으로 true전달하면 됩니다.

 

if (File.Exists("aaa.txt")) {
    //
}

 

파일이 존재하는지의 여부는 Exists메서드로 알 수 있습니다.

 

File.Move("aaa.txt", "bbb.txt");

 

Move는 파일을 이동시키는 메서드입니다. 첫번째와 두번째 인자에서 지정한 파일의 위치가 같을 경우 aaa.txt파일명을 bbb.txt로 바꾸는 결과를 얻게됩니다. Move()메서드에서는 파일이 이미 존재하는 경우 예외를 발생시킵니다.

 

byte[] b = File.ReadAllBytes("aaa.txt");
string[] s = File.ReadAllLines("aaa.txt");
string ss = File.ReadAllText("aaa.txt");

 

파일을 읽을때는 Read~로 시작하는 메서드를 사용할 수 있으며 각 형식에 맞게 읽어들인 파일내용을 변수에 저장하여 활용할 수 있습니다.

 

foreach (string line in File.ReadLines("aaa.txt")) {
    //
}

 

ReadLines메서드는 파일의 내용을 한줄씩 읽어 컬렉션형태로 반환합니다. ReadAllLines는 파일의 내용전체를 모두 배열로 반환할때까지 기다려야 하지만 ReadLines는 한줄씩 읽어 한줄씩 반환하므로 전체를 다 읽을때까지 기다릴 필요가 없습니다.

 

var fv = from line in File.ReadLines("aaa.txt")
        where line.Contains("abc")
        select line;

foreach (var sv in fv) {
    //
}

 

ReadLines()메서드를 사용할때 LINQ등을 사용하면 필요한 내용을 가진것만 필터링이 가능합니다.

 

Write~메서드는 파일을 내용을 쓰는 기능을 수행합니다.

 

string[] s = new string[] {"korea", "hello", "cliel" };
File.WriteAllLines("aaa.txt", s);

 

File클래스는 몇몇 정적메서드를 제공해 파일의 조작기능을 수행합니다. 하지만 FileInfo는 특정 파일을 클래스의 인스턴스로 구현해 해당 파일을 조작할 수 있도록 합니다.

 

FileInfo f = new FileInfo("aaa.txt");

 

위 예제에서는 aaa.txt파일의 인스턴스로 f를 생성했으며 이제 파일 조작은 f개체로 수행할 수 있습니다.

 

f.CopyTo("bbb.txt"); //aaa.txt를 bbb.txt로 복사합니다.
f.Delete(); //aaa.txt파일을 삭제합니다.

 

'Programming > .NET' 카테고리의 다른 글

[ASP.NET MVC] 필터(Filter)  (0) 2018.03.20
[ASP.NET MVC] 컨트롤러(Controller)  (0) 2018.03.14
[C#] File / FileInfo  (0) 2018.03.07
[C#] Hashtable / SortedList  (0) 2018.02.27
[ASP.NET MVC] 라우팅(Routing)  (0) 2018.02.21
[C#] Stack / Queue  (0) 2018.02.13
0 0
1
블로그 이미지

클리엘