Microsoft IT Trend 2011

.net 2011.02.21 22:40


MS에서 제시하는 IT Trend 2011

브로슈어 : http://www.msittrend.com/brochure_down/ittrend2011.pdf

1. 커머셜 클라우드
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD01

2. 컨슈머 클라우드와 n스크린 사용자 경험
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD02

3. 비즈니스 플랫폼으로써 SNS
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD03

4. 스마트 워크
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD04

5. 상황 인식 컴퓨팅
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD05

6. 보안/프라이버시 360
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD06

7. 마켓플레이스 에코시스템
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD07

8. 진화하는 비즈니스 분석 기술
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD08

9. 멀티 플랫폼으로 확산되는 웹 표준
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD09

10. 애자일 프로세스와 애플리케이션 수명 주기 관리
http://www.msittrend.com/event/view.asp?Trend_PageNum=TRD10

신고

'.net' 카테고리의 다른 글

Microsoft IT Trend 2011  (0) 2011.02.21
Windows Service Programming With C# [2]  (0) 2011.01.20
Windows Service Programming With C# [1]  (4) 2011.01.20
Ping Class  (2) 2009.01.23

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret


3. 이제 본격적으로 Service 로직을 구현해보겠습니다.
System.ServiceProcess.ServiceBase를 상속받는 Service.cs를 생성합니다.

/*기본으로 제공되는 소스는 이 강좌에서 삭제되었습니다.*/

Service.cs

//클래스 변수 선언
Thread m_heartbeatThread_Remote = null;
bool m_threadAlive = true;

/// <summary>
/// 이 서비스를 시작합니다. 스레드 시작
/// </summary>
protected override void OnStart(string[] args)
{
    m_threadAlive = true;
    m_heartbeatThread_Remote = new Thread(new ThreadStart(startMonitorRemote));
    m_heartbeatThread_Remote.Start();
}
 
/// <summary>
/// 이 서비스를 중지합니다. 스레드 중지
/// </summary>
protected override void OnStop()
{
    m_threadAlive = false;
    m_heartbeatThread_Remote.Suspend();
}

/// <summary>
/// Config.ini파일을 읽기 위한 Method입니다.
/// </summary>
private void readConfig()
{
    //IniFile Class 객체생성
    IniFile ini = new IniFile( @"C:\serviceProject\Config.ini");
    PropertyClass.Url                      = ini.IniReadValue("Info","url");
    PropertyClass.HeartBeat_interval = ini.IniReadValue("Info","heartbeat");
    PropertyClass.TimeOut_interval  = ini.IniReadValue("Info","timeout");
}

/// <summary>
/// 호출될 웹 어플리케이션 URL에서 텍스트 문자열을 읽어드립니다.
/// 여기서는 정상적일때는 "OK"문자열을 읽어드려 true를 리턴하게 처리했습니다.
/// </summary>
private bool checkResponseContent(WebResponse webResponse)
{
    Stream responseStream = webResponse.GetResponseStream();
    StreamReader responseReader = new StreamReader(responseStream);
    string responseString = responseReader.ReadToEnd();
    if(responseString.Equals("OK"))
        return true;
    else
        return false;
  }

/// <summary>
/// 스레드로 인하여 주기적으로 호출될 Method입니다.
/// </summary>
private void startMonitorRemote()
{
    //먼저 Config.ini을 읽어드립니다.
    readConfig();

    bool sendFlag = true;
    bool error = false;
    WebResponse myHttpWebResponse = null;
    //m_threadAlive 변수가 true일때만 호출됩니다.
    while(m_threadAlive)
    { 
        try
        {
            try
            {
                //지정된 URL을 호출하기 위하여 HttpWebRequest 객체 생성
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(PropertyClass.Url1);
                myHttpWebRequest.KeepAlive = false;
                //설정된 TimeOut Interval을 지정합니다. 초단위 변경으로 인하여 * 1000
                myHttpWebRequest.Timeout=int.Parse(PropertyClass.TimeOut_interval) * 1000;
                myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                //생성된 HttpWebRequest 객체를 checkResponseContent Method호출로 해당 페이지의 Text를 읽어 드립니다.
                if(!checkResponseContent(myHttpWebResponse))
                    error = true;   //장애발생으로 판단
                else 
                    error = false;
            }
            catch
            {
                error = true;  //장애발생으로 판단
            }
            finally
            {
                try
                {
                    if(error)
                    {
                        /**
                        * sendFlag의 역활은 장애발생시 호출될 doAction Method에서 SMS, E-Mail를
                        * 발 송하게 된다고 가정을 하면 장애가 한번 발생하게 되면 장애가 복구되지 않는
                        * 한 계속 호출이 됩니다. 이를 방지하기 위함입니다.
                        */

                        if(sendFlag)
                            doAction(); //이 Method는 직접 구현해주시면 됩니다.
                        sendFlag = false;
                    }
                    else
                    {
                        sendFlag = true;
                        error = false;
                    }
                    myHttpWebResponse.Close();
                }
                catch(Exception ex1)
                {
                    /*에러로그를 남겨주세요.*/
                }
            }
        }
        catch(Exception ex2)
        {
             /*에러로그를 남겨주세요.*/
         }
         finally
        {
             //지정된 HeartBeat Interval마다 Thread Sleep합니다. 
            Thread.Sleep(int.Parse(PropertyClass.HeartBeat_interval) * 1000);
        }       
    }
}

여기까지가 Service Class구현부입니다.

그럼 이제 컴파일하시면 Service.exe가 생성되겠죠?

그럼 어떻게 Service.exe를 윈도우 서비스에 동록을 해야 될까요?

그 답은 아래와 같이 간단합니다.

등록     => C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\installUtil    Service.exe
등록해제 => C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\installUtil /u Service.exe

위 소스는 사실 많이 부족한 면이 있습니다만 이 소스를 가지고 뼈와 살을 좀 붙이시면 좀 더 멋진 서버모니터링이 가능한 윈도우 서비스가 될 것 같습니다.

여기까지 읽어 주셔서 감사합니다.

신고

'.net' 카테고리의 다른 글

Microsoft IT Trend 2011  (0) 2011.02.21
Windows Service Programming With C# [2]  (0) 2011.01.20
Windows Service Programming With C# [1]  (4) 2011.01.20
Ping Class  (2) 2009.01.23

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret


C#으로 아래 그림1과 같은 윈도우 서비스 프로그래밍을 만들어보겠습니다.

그림 1


그럼 어떤 서비스를 만들어볼까요?

사이트 상태점검을 주기적으로 하는 서비스를 만들어 볼까 합니다.
서버관리자라면 한번쯤 경험해보셨을 퇴근 이후에 사이트 이상으로 인하여 고생하셨을 텐데요.
이 문제를 빠르게 캐치할 수 있게 도와주는 프로그램을 만들어 보겠습니다.

대략적인 기능은 아래와 같습니다.
1. Config.ini의 환경설정 파일을 둔다.
2. 주기적으로 지정된 사이트 페이지를 호출 해서 사이트 이상유무를 파악한다.
3. 사이트 이상유무 발생시 관리자에게 SMS나 E-Mail을 보낸다. 경우에 따라서는 웹 서버를 재부팅 할 수 도 있습니다.

자 그럼 만들어 볼까요?

.net Framework 1.1기반에 Visual Sudio .NET 2003으로 만들어 보겠습니다.

Visual Sudio .NET은 그림2와 같이 윈도우서비스 프로그래밍 템플릿을 기본적으로 제공합니다.
파일 -> 새로만들기 -> 프로젝트 -> Visual C# 프로젝트 -> Windows 서비스

그림2

프로젝트를 생성하게 되면 기본적으로 윈도우 서비스 프로그래밍을 하기 위한 소스가 제공됩니다.(그림3) 저희는 그 안에 구현될 로직만 삽입하면 되는거죠 ^^

그림3

1. Config.ini파일 생성 및 PropertyClass 생성
우선 환경설정 파일을 생성한 이후 ini파일을 가져오기 위한 class를 만들어 보겠습니다.

Config.ini파일을 그림4와 같이 생성해주세요.
url : 서비스가 주기적으로 호출할 웹 어플리케이션의 경로입니다.
heartbeat : 서비스가 주기적으로 호출할 시간입니다. 여기는 60초로 설정했네요
timeout : 지정된 url로 호출 시 요청에 대한 제한 시간을 설정합니다. 여기서는 30초로 설정했습니다.

Config.ini를 읽기위한 PropertyClass를 만들어 보겠습니다.

PropertyClass.cs
public class PropertyClass
{
    public PropertyClass()
    {
    }
    static string url;
    static string timeOut_interval;
    static string heartBeat_interval;

    public static string Url
    {
        get{return url;}
        set{url = value;}
    }
    public static string HeartBeat_interval
    {
        get{return heartBeat_interval;}
        set{heartBeat_interval= value;}
    }
    public static string TimeOut_interval
    {
        get{return timeOut_interval;}
        set{timeOut_interval= value;}
    }
}

2. Config.ini을 읽어 드리기 위한 IniFile 구현

IniFile.cs
public class IniFile
{
    public string path;
    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string section,
    string key,string val,string filePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section,
    string key,string def, StringBuilder retVal,
    int size,string filePath);
    public IniFile(string INIPath)
    {
        path = INIPath;
    }
    public void IniWriteValue(string Section,string Key,string Value)
    {
        WritePrivateProfileString(Section,Key,Value,this.path);
    }
    public string IniReadValue(string Section,string Key)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(Section,Key,"",temp, 255, this.path);
        return temp.ToString();
    }
}

다음 강좌에서는 본격적으로 Thread를 이용하여 웹어플리케이션을 호출하는 Service를 만들어보겠습니다. ^^

신고

'.net' 카테고리의 다른 글

Windows Service Programming With C# [2]  (0) 2011.01.20
Windows Service Programming With C# [1]  (4) 2011.01.20
Ping Class  (2) 2009.01.23
XML XmlAttribute다루기(삭제, 수정, 추가)  (0) 2009.01.13

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글  4개가 달렸습니다.
  1. 비밀댓글입니다
    • 안녕하세요
      문의하신 내용은 아래 링크에 이미 있습니다. ^^
      http://using.tistory.com/23

      수고하세요~
    • doAction method 코드가 어떻게 되야할지 궁금해서요 ㅠㅠ
    • 흠.. 죄송하지만 doAction method가 무엇인지 모르겠네요.
      제가 작업한 소스는 해당 게시글에 모두 있습니다.
secret

Ping Class

.net 2009.01.23 11:18


서버관리를 하다보면 관리 웹서버의 상태를 확인하기 위해 Ping을 사용할때가 있다.

ping www.daum.net
ping 118.xxx.xxx.xxx

Ping만으로는 구체적인 웹서버의 상태를 확인하기는 힘들지만
간단하게 웹서버 상태를 확인하기 위해서 사용한다.
하지만 서버가 한두대가 아닌 여러대일 경우 매번 command창에서 명령어를 치기에는 요새
손목통증으로 고생하는 나로써는 큰 부담이 아닐 수 없다. =_=;
그리하여 한번 만들어볼까? 생각이 들어서...MSDN을 찾아봤다. 역시나... 없는거 빼고는 다있는 닷넷!!!

Ping Class발견!! 오호.. 이런게 있구나.. 싶어서...(.NET Framework 버전 2.0에서 새로 추가)
[MSDN Ping Class] http://msdn.microsoft.com/ko-kr/library/system.net.networkinformation.ping.aspx

넬름.. 예제코드를 가지고 테스트... 우와~~ 잘된다.!!! 그래서 만들게 된...
하지만.. 웹만 하다보니... =_=;

우선 Ping에 대하여 간단히 설명하면.

Ping은 호스트(서버)와의 데이터 교환을 하는데 이상유무를 확인하기 위한 네트워크 명령어로
일정 크기의 데이터 보내 지정한 서버가 제대로 응답했는지 확인 후 결과를 보여준다.
Ping명령어를 실행했을때 서버의 문제가 없다면 아래와 같은 메세지를 보여줄거다.
Reply from xxx.xxx.xxx.xx: bytes=32 time=15ms TTL=55
Reply from xxx.xxx.xxx.xx: bytes=32 time=15ms TTL=55
대략 위 메시지를 설명하면... 32바이트이 데이터를 보냈으며 15ms의 응답시간이 걸렸다는거다.
그리고 TTL이란 MSDN에서 설명하기를 TTL은 소스와 대상 사이를 이동할 때 노드에서 패킷을 전달할 수 있는 횟수를 정의합니다. 전달 횟수(홉 수라고도 함)가 TTL에 지정된 값을 초과하면 해당 패킷은 전달할 수 없는 패킷으로 간주되어 삭제됩니다.

만약 서버의 문제가 있다면.
Request timed out 라는 메세지를 보여준다.
위와 같은 결과에 대한 메시지를 보내기 위하여 Ping은 ICMP(Internet Control Message Protocol)라는 부수적인 프로토콜을 사용한다.


그럼 한번 만들어보자!

우선 디자인 폼이다.

별거는 없고 주기적으로 Ping을 날리기 위하여 Timer를 추가하였다.

소스는 아래와 같다.
//서버체크 메서드
private void ServerChk()
{
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();

//데이터를 여러 패킷으로 보낼 수 없을 경우 true이고, 그렇지 않으면 false 기본값은 false입니다.
options.DontFragment = true;

            listResult.Items.Clear();
            // 전송할 32바이트 데이터
            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 120;
            for (int i = 0; i < listIpBox.Items.Count; i++)
            {
                //Send된 작업의 결과 상태 및 데이터에 대한 정보를 제공한다.
                PingReply reply = pingSender.Send(listIpBox.Items[i].ToString(), timeout, buffer, options);
                if (reply.Status == IPStatus.Success)
                    listResult.Items.Add(reply.Address.ToString() + " 정상 status: " + reply.Status.ToString() + " RoundTrip time:" + reply.RoundtripTime + " Time to live: " + reply.Options.Ttl + " Don't fragment: " + reply.Options.DontFragment);
                else
                    listResult.Items.Add(listIpBox.Items[i].ToString() + " 불량 서버상태 : " + reply.Status.ToString());
            }
}

PingReply속성 자세한 내용은  MSDN 참고 =_=;
[MSDN PingReply] http://msdn.microsoft.com/ko-kr/library/system.net.networkinformation.pingreply_members.aspx


        /// <summary>
        /// 아이피 추가
        /// </summary>

        private void btnIpInput_Click(object sender, EventArgs e)
        {
            listIpBox.Items.Add(txtIp.Text);
            txtIp.Text = "";
            txtIp.Focus();
        }
        /// <summary>
        /// 아이피 삭제
        /// </summary>
        private void btnIpRemove_Click(object sender, EventArgs e)
        {
            if (listIpBox.SelectedIndex == -1)
                MessageBox.Show("삭제할 IP Address를 선택해주세요!");
            else
                listIpBox.Items.RemoveAt(listIpBox.SelectedIndex);
        }
        /// <summary>
        /// 시작
        /// </summary>

        private void btnStart_Click(object sender, EventArgs e)
        {
            Regex reg = new Regex(@"^[0-9]");
            if (textBox1.Text == "")
            {
                MessageBox.Show("입력해주세요!!");
                textBox1.Focus();
            }
            else if (!reg.IsMatch(textBox1.Text))
            {
                MessageBox.Show("숫자만 입력");
                textBox1.Focus();
            }
            else if (listIpBox.Items.Count < 1)
            {
                MessageBox.Show("체크할 IP Address를 하나이상 입력해주세요!");
                txtIp.Focus();
            }
            else
            {
                ServerChk();
                timer1.Interval = int.Parse(textBox1.Text) * 1000;
                timer1.Start();
            }
        }
        /// <summary>
        /// 중지
        /// </summary>
        private void btnStop_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }

완성된 화면...

 그다지 실용적이지는 않지만... 이런것도 있다는 정도만 알아두자.. ^^;

신고

'.net' 카테고리의 다른 글

Windows Service Programming With C# [1]  (4) 2011.01.20
Ping Class  (2) 2009.01.23
XML XmlAttribute다루기(삭제, 수정, 추가)  (0) 2009.01.13
Image Resizing  (0) 2008.12.23

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글  2개가 달렸습니다.
  1. 안녕하세요, 님께서 알려주신 소스로 하니 정상적으로 IP 체크는 됩니다만
    ping이 실패하는 IP가 List 내에 있을 경우 Exception이 걸립니다.

    예외처리 할때 실패 되는 IP들을 보여주게 하려면 어떻게 해야 할까요?
secret

Xml원본
<?xml version="1.0" encoding="utf-8" ?>
<basket>
     <item>
          <scene rc="0 0 590 420" embedCount="9">
              <image rc="0 0 590 420" priority="0" />
          </scene>
     </item>
</basket>



1. 속성삭제
  - image노드의 rc속성을 삭제해보자
XmlDocument doc = new XmlDocument();
doc.Load("xml경로");
XmlNode node = doc.SelectSingleNode("/descendant::basket/item/scene/image");
XmlAttributeCollection acxNode = node.Attributes;
if(acxNode.GetNamedItem("rc") != null)
{
     acxNode.Remove((XmlAttribute)acxNode.GetNamedItem("rc"))
}
doc.Save("경로");


2. 속성값 수정
  - image노드의 rc속성값을 변경해보자
XmlDocument doc = new XmlDocument();
doc.Load("xml경로");
XmlNode node = doc.SelectSingleNode("/descendant::basket/item/scene/image");
XmlAttributeCollection acxNode = node.Attributes;
if(acxNode.GetNamedItem("rc") != null)
{
     acxNode.GetNamedItem("rc").Value = "0 0";
}
doc.Save("경로");


3. 속성값 추가
  - image노드에 test노드를 추가해보자
XmlDocument doc = new XmlDocument();
doc.Load("xml경로");
XmlNode node = doc.SelectSingleNode("/descendant::basket/item/scene/image");
XmlAttributeCollection acxNode = node.Attributes;
XmlAttribute newAttr = doc.CreateAttribute("test");
newAttr.Value = "속성값";
acxNode.SetNamedItem(newAttr);
doc.Save("경로");
신고

'.net' 카테고리의 다른 글

Ping Class  (2) 2009.01.23
XML XmlAttribute다루기(삭제, 수정, 추가)  (0) 2009.01.13
Image Resizing  (0) 2008.12.23
Xml 수정하기(update)  (0) 2008.07.08

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

Image Resizing

.net 2008.12.23 19:20

특정폴더내 이미지들을 모두 특정사이즈로 리사이즈해야 하는 일이 생겨서... 만들어봤다.


DirectoryInfo dir = new DirectoryInfo(Server.MapPath("해당폴더 경로지정"));
if(dir.Exists)
{
FileInfo[] files = dir.GetFiles();
foreach(FileInfo subFile in files)
{
      //******************1. GetThumbnailImage()메소드방식*********************//
     System.Drawing.Image imgFile = System.Drawing.Image.FromFile(subFile.FullName.ToString());
     System.Drawing.Image thumbnail = imgFile.GetThumbnailImage(가로, 세로, null, (IntPtr)0);
     thumbnail.Save(Server.MapPath("리사이즈 경로"),System.Drawing.Imaging.ImageFormat.Gif);
     imgFile.Dispose();
     thumbnail.Dispose();
      //******************2. Bitmap방식*********************/
      Bitmap imgFile = new Bitmap(subFile.FullName.ToString());
      Bitmap thumbnail = new Bitmap(imgFile, 가로, 세로);
      thumbnail.Save(Server.MapPath("리사이즈 경로"),System.Drawing.Imaging.ImageFormat.Gif);
      imgFile.Dispose();
      thumbnail.Dispose();
}
}


위 소스를 보면 리사이즈 방식에 2가지 방법을 사용했다.
첫째는 GetThumbnailImage()를 사용
(참고 사이트 http://www.hoons.kr/Lecture/LectureView.aspx?BoardIdx=70&kind=11)
둘째는 Bitmap 객체를 생성해서 사용

http://msdn.microsoft.com/ko-kr/library/system.drawing.image.getthumbnailimage.aspx
GetThumbnailImage
메서드는 요청된 축소판 그림 이미지의 크기가 120 x 120픽셀 정도인 경우 제대로 작동합니다. 포함된 축소판 그림이 있는 Image에서 300 x 300 정도의 큰 축소판 그림 이미지를 요청한 경우 축소판 그림 이미지의 화질이 크게 떨어질 수 있습니다. 포함된 축소판 그림의 배율을 조정하는 것보다는 DrawImage 메서드를 호출하여 기본 이미지의 배율을 조정하는 것이 더 좋은 방법입니다.

첫번째 GetThumbnailImage()는 MSDN을 참고하면 위와 같이 120 x 120픽셀의 경우만 제대로 작동한다고 나와있다.

아래는 원본과 GetThumbnailImage(), Bitmap을 이용하여 리사이즈한 이미지들이다.

가. 원본


나. GetThumbnailImage()로 가로 319 & 세로 224로 변환한 이미지

다. Bitmap객체를 이용하여 가로 319 & 세로 224로 변환한 이미지

위 이미지만 비교해봐도 확연히 차이가 나는걸 확인할 수 있다.

신고

'.net' 카테고리의 다른 글

XML XmlAttribute다루기(삭제, 수정, 추가)  (0) 2009.01.13
Image Resizing  (0) 2008.12.23
Xml 수정하기(update)  (0) 2008.07.08
ASP.NET 디렉토리(directory) 복사  (1) 2008.07.04

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret

Xml 수정하기(update)

.net 2008.07.08 15:34

요즘 xml을 다루게 될일이 많아져서 요새 시달리는중~

아래와 같은 두 종류의 xml타입이 있으며 빨간부분의 값을 수정해볼 것이다.

A타입
<?xml version="1.0" encoding="utf-8"?>
  <projOrderInfo>
    <ORDR>
      <F_ORDR_CODE>8D62700301</F_ORDR_CODE>
      <F_PROJ_CODE>20080707005628</F_PROJ_CODE>
      <F_PROJ_PRICE>8900</F_PROJ_PRICE>
      <F_ORDR_CNTS>1</F_ORDR_CNTS>
    </ORDR>
    <ORDR>
      <F_ORDR_CODE>8D62700302</F_ORDR_CODE>
      <F_PROJ_CODE>20080707005633</F_PROJ_CODE>
      <F_PROJ_PRICE>8900</F_PROJ_PRICE>
      <F_ORDR_CNTS>1</F_ORDR_CNTS>
    </ORDR>
 <projOrderInfo>


B타입
<?xml version="1.0" encoding="utf-8"?>
  <projOrderInfo>
    <ORDR>
      <ITEM F_ORDR_CODE=8D62700301 F_PROJ_CODE=20080707005628/>
    </ORDR>
     <ORDR>
      <ITEM F_ORDR_CODE=8D62700302 F_PROJ_CODE=20080707005633/>
    </ORDR>
 <projOrderInfo>


위와 같은 형태의 XML파일이 있다고 가정하자.

간단하다.. 수정될 NODE로 접근하는 방법만 안다면...

A타입의 F_ORDR_CODE값이 "8D62700302" NODE값을 변경해보자.

XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(A.xml));
XmlNode node = doc.SelectSingleNode("/descendant::projOrderInfo/ORDR/F_ORDR_CODE[.='8D62700302']");
if (node != null)
{
    node.InnerText = "수정되지렁";
}
doc.Save(Server.MapPath(A.xml));

그렇다면 B타입의 F_ORDR_CODE 속성값 "8D62700302" 변경해보자.

XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(B.xml));
XmlNode node = doc.SelectSingleNode("/descendant::projOrderInfo/ORDR/ITEM [@F_ORDR_CODE='8D62700302']/@F_ORDR_CODE");
if (node != null)
{
    node.InnerText = "수정되지렁";
}
doc.Save(Server.MapPath(B.xml));

위 소스의 해당 node로 접근 하는 방법만 알면 별게 아니다.

만약 수정해야 할 node가 많다면 XmlNodeList를 사용하면 되겠다.
신고

'.net' 카테고리의 다른 글

Image Resizing  (0) 2008.12.23
Xml 수정하기(update)  (0) 2008.07.08
ASP.NET 디렉토리(directory) 복사  (1) 2008.07.04
Xml네임스페이스 "http://tempuri.org/"  (0) 2008.05.19

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret


ASP.NET에서는 디렉토리 복사가 지원하지 않는다.

왠지 있을 것 같았던.. 디렉토리 복사는 없었다..

Move, Create만 존재할 뿐... 이런거도 하나만들어주지말야...

아무튼 이번에 필요해서 하나 만들어보았음...

폴더형태는 아래와 같다.

사용자 삽입 이미지

현 위치는 로컬 D드라이버이며 AJAX라는 폴더 내에
왼쪽 이미지와 같이 많은 폴더가 존재하며 폴더내에는
파일도 있다.










그럼 위 폴더를 복사하는 소스는 아래와 같다.

주의할 점은 해당폴더내의 폴더목록을 다 가져오기 위해서는 재귀호출 메소드가 존재한다는
거다... 별건 아니고.. @.@;

우선 폴더목록 가져오는 메소드 부터...

public void GetDirectory(DirectoryInfo dir)
{
    try
    {
        Directory.CreateDirectory(dir.FullName.ToString().Replace("AJAX", "AJAX2"));
        //root폴더내 파일 부터 복사(요놈을 안해주면 root폴더내 파일은 복사가 안된다.)
        FileInfo[] files_ = dir.GetFiles();
        foreach(FileInfo subFile_ in files_)
        {
             File.Copy(subFile_.FullName, subFile_.FullName.Replace("AJAX", "AJAX2"), true);
        }
        DirectoryInfo[] directories = dir.GetDirectories();
        foreach(DirectoryInfo subdir in directories)
        {
             //디렉토리를 만들기, Replace는 AJAX2로 복사하기 위하여... 대충 이렇게^^;
             Directory.CreateDirectory(subdir.FullName.ToString().Replace("AJAX", "AJAX2"));

             //해당폴더내의 파일목록을 가져오자
             FileInfo[] files = subdir.GetFiles();
             foreach(FileInfo subFile in files)
             {
                 //해당파일 카피
                 File.Copy(subFile.FullName, subFile.FullName.Replace("AJAX", "AJAX2"), true);
             }
            //재귀호출하기 위한 함수 중요!! 폴더내의 폴더들을 쥐잡듯이 잡기 위해서~^^;
             GetDirectory(subdir);
         }
   }
   catch
   {
   }
}

이제 위 메소드를 쓰는 방법은... 아래와 같이 간단합니다.

DirectoryInfo dir = new DirectoryInfo(@"D:\AJAX");
if(dir.Exists)
{
    GetDirectory(dir);
}

요렇게 하면 폴더 copy는 해결!! 실력이 미천하여... 소스가 지저분하다는...

신고

'.net' 카테고리의 다른 글

Image Resizing  (0) 2008.12.23
Xml 수정하기(update)  (0) 2008.07.08
ASP.NET 디렉토리(directory) 복사  (1) 2008.07.04
Xml네임스페이스 "http://tempuri.org/"  (0) 2008.05.19

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 저 오래된 글이지만 궁금한게 하나 있어서요~ 디렉토리 생성하구 나서
    파일 foreach 문으로 카피해서 집어넣는 중에 파일복사가 안되고 catch 로 빠져나가는데 이유를 알수 있을까요?? 디버깅 걸어보니 경로랑 파일명은 제대로 가져오고 있어서요~
secret

A.xml

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">
  <projOrderInfo>
    <ORDR>
      <F_ORDR_CODE>3333333</F_ORDR_CODE>
      <F_PROJ_CODE>20080514006297</F_PROJ_CODE>
      <F_PROJ_PRICE>800</F_PROJ_PRICE>
      <F_ORDR_CNTS>2</F_ORDR_CNTS>
    </ORDR>

  </projOrderInfo>
</string>



 

B.xml

<?xml version="1.0" encoding="utf-8"?>
<string>
  <projOrderInfo>
    <ORDR>
      <F_ORDR_CODE>3333333</F_ORDR_CODE>
      <F_PROJ_CODE>20080514006297</F_PROJ_CODE>
      <F_PROJ_PRICE>800</F_PROJ_PRICE>
      <F_ORDR_CNTS>2</F_ORDR_CNTS>
    </ORDR>

  </projOrderInfo>
</string>


위 xml의 차이점은 Root노드 "string"에 네임스페이스의 유무다.

위 xml의 F_ORDR_CODE의 값을 수정하여 보자

소스(B.xml)
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(A.xml 또는 B.xml));

   
XmlNode node = doc.SelectSingleNode
("/descendant::string/projOrderInfo/ORDR/F_ORDR_CODE");
if (node != null)
{
  node.InnerText = "1111";
}

doc.Save(Server.MapPath(A.xml 또는 B.xml));


위 소스는 일반적인 DOM을 이용한 xml수정소스입니다.

그렇다면 실행결과는...A.xml은 수정이 되지않고 B.xml만 수정된다.

A.xml을 수정하려면 아래와 같은 형태로 소스를 수정해야 한다.

소스(A.xml)

XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("A.xml"));

   
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
     nsMgr.AddNamespace("temp", "http://tempuri.org/");
XmlNode node = doc.SelectSingleNode("//temp:F_ORDR_CODE", nsMgr);
if (node != null)
{
  node.InnerText = "1111";
}

doc.Save(Server.MapPath("A.xml"));

MSDN XmlNamespaceManager클래스 
신고

'.net' 카테고리의 다른 글

Image Resizing  (0) 2008.12.23
Xml 수정하기(update)  (0) 2008.07.08
ASP.NET 디렉토리(directory) 복사  (1) 2008.07.04
Xml네임스페이스 "http://tempuri.org/"  (0) 2008.05.19

WRITTEN BY
빵군
Web Programmer HOONS닷넷(http://www.hoons.kr) 2011 ASP.NET 시삽 http://about.me/y2kpooh

받은 트랙백이 없고 , 댓글이 없습니다.
secret