[C#] 외부 프로세스 실행하고 대기하기

콘솔 프로그램은 개발의 간편성과 그 기능과 책임이 명확함으로 단위 기능을 제공하는, 마치 API와 같은 역할을 제공한다고 할 수 있습니다. 이러한 콘솔 프로그램의 진정한 가치의 발휘는 여러 개의 콘솔 프로그램이 조합되어 실행되고 그 결과들이 모여 또 다른 하나의 결과로 취합 또는 새롭게 생성되는 것인데요. 이러한 콘솔 프로그램을 실행하고 실행된 프로그램이 종료될때까지 기다리는 C# 함수에 대한 소개입니다.

using System.Diagnostics;

private int RunProcess(String FileName, String Args)
{
    Process p = new Process();

    p.StartInfo.FileName = FileName;
    p.StartInfo.Arguments = Args;

    p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

    p.Start();
    p.WaitForExit();

    return p.ExitCode;
}

위의 RunProcess 함수는 2개의 인자를 받습니다. FileName 인자는 프로그램에 대한 실행 파일 경로이고 Args는 실행 파일이 받는 Command Line 단의 인자에 대한 문자열입니다. 이 함수는 실행되는 프로그램이 반환하는 값을 다시 반환하고 있으므로 이 반환값을 이용해 해당 프로그램의 성공 여부를 판단할 수 있습니다.

사실 RunProcess 함수는 .NET에서 Process라는 클래스의 사용을 좀더 편리하고 쉽게 사용할 수 있도록 한 것입니다. Process 클래스는 프로세스에서 출력하는 내용에 대한 처리라든지, 실행 및 종료 처리는 물론, 종료시 또는 에러발생시에 대한 이벤트 처리 등에 대한 다양한 기능을 제공하므로 더욱 고급진 프로세스의 처리가 가능합니다.

[C#] 레지스트리(Registry) 읽기

C# 언어를 이용하여 윈도우즈(Windows)의 레지스트리(Registry)를 읽는 코드입니다. 먼저 읽고자 하는 레지스트리는 다음과 같습니다.

즉, 위의 INSTALL_PATH의 Data 값을 얻고자 하는 것인데요. 코드는 아래와 같습니다.

RegistryKey reg = Registry.LocalMachine;
reg = reg.OpenSubKey("Software\\GeoService\\GeoService-Xr", true);

if (reg != null)
{
    Object val = reg.GetValue("INSTALL_PATH");
    if (null != val)
    {
        MessageBox.Show(Convert.ToString(val));
    }
}

위의 코드를 실행하기 위해서는 using 절에 Microsoft.Win32에 대한 추가가 필요합니다. 즉, 아래와 같이 말입니다.

using Microsoft.Win32;

또 추후에 윈도우즈에서 레지스트리 값을 읽어올 때를 위해 정리해 둡니다.

[C#] 하위 폴더 내부의 파일 목록 얻는 함수

특정 폴더에 대해서 그 하위 폴더까지 확장자가 .shp 인 파일 목록을 얻어는 함수입니다. 확장자의 지정은 함수 내부에 마법의 상수값으로 박혀 있습니다.

private void GetShpFileNames(string folderName, ArrayList fileNamesList)
{
    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(folderName);
    foreach (System.IO.FileInfo f in di.GetFiles())
    {
        if (f.Extension.ToLower().CompareTo(".shp") == 0)
        {
            String strInFileName = di.FullName + "\\" + f.Name;
            fileNamesList.Add(strInFileName);
        }
    }

    foreach (System.IO.DirectoryInfo sd in di.GetDirectories())
    {
        GetShpFileNames(sd.FullName, fileNamesList);
    }
}

최근에 C# 5.0에 대한 책을 3일에 걸쳐 대충 설렁 설렁 봤더랬습니다. 비록 위의 코드는 C#의 고전 문법만 존재하지만.. 여하튼, 클라이언트 단의 개발 언어로써 C#은 정말 단연 최고가 아닌가 할 정도였습니다. 자바스크립트의 비슷한 개념도 가져오고, 특히나 클래스 타입 자체를 동적으로 생성하는 기능에서는 ‘미친거아냐?’라는 생각마저 들었습니다. 마치 프로그램이 프로그램을 만들 수 있다라는 개념도 가능하다는 것이죠. 이런 미친…. -_-;

[C#] 지정된 폴더(Folder)에서 파일명(File Name) 목록(List) 얻기

C#에서 지정된 폴더에 담긴 파일명의 목록을 얻는 코드입니다.

String FolderName = tbFolder.Text;
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(FolderName);
foreach (System.IO.FileInfo File in di.GetFiles())
{
    if (File.Extension.ToLower().CompareTo(".xrv") == 0)
    {
        String FileNameOnly = File.Name.Substring(0, File.Name.Length - 4);
        String FullFileName = File.FullName;

        MessageBox.Show(FullFileName + " " + FileNameOnly);
    }
}

1번 코드에서 파일명 목록을 얻고자 하는 폴더명이 지정됩니다. 그리고 5번에서 확장자가 .xrv 인 파일만을 필터링합니다. 그리고 7번은 오직 파일명(경로와 확장자를 제외)만을 얻습니다. 끝으로 8번은 파일명의 전체 이름(경로와 확장자를 포함)을 얻습니다.

폴더 안의 서브 폴더를 처리하기 위해서는 DirectoryInfo의 GetDirectories 매서드를 사용하여 서브 폴더명의 리스트를 얻어와 처리하면 됩니다.

CSV 포맷(Format)의 문자열(String) 파싱(Parse, Parsing)

CSV 형태로 된 문자열을 파싱하기 위한 C#언어로 작성된 함수입니다. 예전에 XrGeocoder 프로그램을 개발할때 사용했던 함수로.. 또 다른 프로젝트에서 사용되면서 함수만을 분리해 정리해 봅니다.>/p>

private List SeperateStringWithComma(String value)
{
    bool inQuotes = false;
    char delim = ',';
    List strings = new List();

    StringBuilder sb = new StringBuilder();
    foreach (char c in value)
    {
        if (c == '\'' || c == '"')
        {
            if (!inQuotes)
                inQuotes = true;
            else
                inQuotes = false;
        }

        if (c == delim)
        {
            if (!inQuotes)
            {
                strings.Add(sb.Replace("'", string.Empty).Replace("\"", string.Empty).ToString());
                sb.Remove(0, sb.Length);
            }
            else
            {
                sb.Append(c);
            }
        }
        else
        {
            sb.Append(c);
        }
    }

    strings.Add(sb.Replace("'", string.Empty).Replace("\"", string.Empty).ToString());
    return strings;
}

위의 함수를 사용하는 예제는 다음과 같습니다.

String csv = "2011-01-01,18,2008,개인,인천,중구,~,2010-12-31,233400,남자";
List values = SeperateStringWithComma(csv);

int cntValues = values.Count;
for (int i = 0; i < cntValues; i++)
{
    MessageBox.Show(values[i]);
}