3 min read

앱에서도 Server.MapPath() 메소드 사용하기

Justin Yoo

HttpServerUtility.MapPath() 메소드는 닷넷 웹 애플리케이션을 개발할 때 가장 자주 쓰이는 메소드들 중 하나이다. 특히나 파일 입출력 관련해서는 없어서는 안될 메소드들 중 하나인데, 웹 상의 주소를 실제 서버의 물리적인 주소로 바꿔주는 역할을 하기 때문이다. 하지만, 이 메소드는 클라스명을 보면 알 수 있겠지만, 웹 애플리케이션에서만 사용할 수 있다. 일반적인 콘솔 앱이나 윈도우 앱에서는 이를 사용할 수 없는데, 이런 앱에서도 파일 입출력과 관련해서 비슷한 경우를 자주 접할 수 있기 때문에 그때그때 코드를 작성하는 편이다.

아래 소개할 라이브러리는 이러한 불편을 해소하기 위해 만들어진 것으로서 윈도우 앱과 웹 앱 양 쪽에서 모두 사용할 수 있고, 특히나 웹 앱에서는 HttpContext 객체의 의존성을 없애주어서 유용하게 쓰일 수 있다.

라이브러리

코드 소개

코드는 기존의 Server.MapPath() 메소드와 동일하게 사용할 수 있다.

public virtual async Task<ActionResult> Index(HomeIndexViewModel vm)
{
  using (var appUtil = new AppUtility())
  {
    try
    {
      var fullpath = appUtil.MapPath(vm.Directory);
      vm.FullPath = fullpath;
    }
    catch (Exception ex)
    {
      vm.FullPath = String.Format("FAIL!!: {0}", ex.Message);
    }
  }
  return View(vm);
}

위의 코드는 웹 앱에서 사용한 방법이다. 마찬가지로 콘솔 앱에서는 아래와 같은 식으로 사용할 수 있다.

private static void Run(IList<string> args)
{
  if (args == null || !args.Any())
  {
    throw new ArgumentNullException("args");
  }

  if (args.Count() > 1)
  {
    throw new ArgumentException("Too many arguments");
  }

  using (var appUtil = new AppUtility())
  {
    try
    {
      var fullpath = appUtil.MapPath(args.First());
      Console.WriteLine("{0} => {1}", args.First(), fullpath);
    }
    catch (Exception ex)
    {
      Console.WriteLine("{0} => FAIL!!: {1}", args.First(), ex.Message);
    }
  }
}

오히려 기존의 MapPath()보다 예외처리에 덜 민감하게끔 TryMapPath() 메소드도 제공한다.

using (var appUtil = new AppUtility())
{
  string fullpath;
  var result = appUtil.TryMapPath("~/Test", out fullpath);
}

위의 코드에서 볼 수 있다시피 만약 ~/Test 디렉토리의 물리적인 주소를 반환하면서 그 디렉토리가 유효하면 true를, 유효하지 않으면 false를 반환한다. 만약 유효하지 않은 디렉토리 값이라면 물리적인 주소는 null이 된다. 이에 실제 반환한 물리적인 주소가 실제로 존재하는지 여부도 체크하는데, 존재하지 않는 디렉토리라면 falsenull값을 반환한다.

이상으로 알찬 간단한 MapPath() 메소드 소개를 끝마친다.