카테고리 : .NET

Directory.GetFiles

예전에 도스에서 파일명의 형태는 8.3이었다.
파일명 길이8 확장자 길이3, 최대길이로.. 그리고 띄어쓰기도 들어가면 안된다..
이 파일명 형태를 지금의 윈도우에서도 쓸수 있는데 명령창에서 dir /x 라고 치면 확인할수 있고
거기에 나오는 이름으로 파일명을 적을수 있다..

그런데 이게 문제가 된것이..
DirectMove의 테스트를 위해 한 폴더의 ksf들을 ksfa로 확장자를 바꾸고 한개만 테스트용으로 만들어놨더니
ksfa들이 다 검색에 걸린것이다..
Directory.GetFiles이 함수는 8.3 형태의 파일명도 지원하기 때문에
*.ksf로 검색했을 경우  abcd.ksfa 이 파일들이 abcd~1.ksf 의 형태로 인식되서 검색에 걸린것이다..

쉽게
Directory.GetFiles(path, "*.ksf"); 이런식으로 호출했더니
이 함수가 8.3 형태의 파일명을 지원하면서 검색하게 되었다.
그래서 abcd.ksfa가 abcd~1.ksf로 인식돼서 *.ksf에 적합한 파일명으로 인식되었다.
이런 이야기인데
물론 *.ksf의 검색에 abcd.ksfa가 검색됐으니 정상적인게 아니다..
그래서 이를 처리하려면 별도의 함수를 만들어서 처리해야 된다..-_-;;
귀찮게..

재미없는 함수로 해결

private List<string> GetFiles(string ext)
{
    List<string> files = new List<string>();
    foreach (string file in Directory.GetFiles(path, "*." + ext))
    {
        if (file.ToLower().EndsWith(ext.ToLower()))
        {
            files.Add(file);
        }
    }
    return files;
}

by kiho | 2006/10/15 13:08 | .NET | 트랙백 | 덧글(2)

C#키워드를 변수명으로 쓰기

변수명이나 함수명에 C#키워드를 쓰고 싶다면 이름앞에 @를 붙이면 된다..



int @class;
@class = 0;

void @lock()
{
    this.@lock(); // 스택 오버플로 나겠지. -_-;;
}



닷넷은 여러언어로 쓸수 있는데, 함수나 변수명이 다른언어의 키워드로 쓰일수 있기 때문에 이런 기능이 있는것 같다..
나도 예전에 lock 이라는 함수를 쓰다가 발견한 기능 :)

(검색어 보고 생각나서 씀..)
 

by kiho | 2006/10/14 16:51 | .NET | 트랙백 | 덧글(0)

MDX (Managed DirectX)를 쓸 때 LoaderLock문제..

vs2005와 mdx1.1를 쓸 경우.. 디버깅할 때 가끔 LoaderLock Exception이 발생한다..
별 문제는 없지만 디버깅할 때 짜증남..
릴리즈 모드에서는 이상이 없다고 한다.

해결법
1) vs2003와 mdx1.1를 쓴다.
2) mdx 2.0을 쓴다..
3) 메뉴에서 디버그-예외 에 들어가서, LoaderLock 체크를 해제한다. (나는 이걸로 해결..)


좀 더 자세한 원문
http://www.thezbuffer.com/articles/304.aspx
 

by kiho | 2006/10/07 20:07 | .NET | 트랙백 | 덧글(0)

ManagedAudiere의 한글문제

기존 StringConverter 소스가 c++의 char 하나를  c#의 char 하나로 복사해버렸기 때문에.. 파일 주소에 한글이 들어가면 읽지 못하는 상황이 일어났다.. 그래서 멀티바이트를 처리하도록 수정했다.. 밑이 그 소스..

class StringConverter
{
public:
    static std::string ToStd(System::String^ a)
    {
        std::string ret = "";
        array<unsigned char>^ bytes = Encoding::Default->GetBytes(a);
        for (int i = 0; i < bytes->Length; i++)
        {
            ret += bytes[i];
        }
        return ret;
    }
    static System::String^ ToNet(std::string a)
    {
        List<unsigned char>^ bytes = gcnew List<unsigned char>();
        for (unsigned int i = 0; i < a.length(); i++)
        {
            bytes->Add(a[i]);
        }
        String^ ret = Encoding::Default->GetString(bytes->ToArray());
        return ret;
    }
};


참고로 audiere는 lgpl의 오디오 라이브러리이고, ManagedAudiere는 닷넷용 래핑 라이브러리[?]이다.

by kiho | 2006/08/31 17:52 | .NET | 트랙백 | 덧글(2)

VisualStudio 2005 단축키..

자주 쓰는 단축키
자동완성 : Alt + ->
파라미터 목록 : Ctrl + Shift + Space
빌드 : Ctrl + Shift + B
주석처리 : Ctrl + K, Ctrl + C
주석취소 : Ctrl + K, Ctrl + U
한줄삭제 : Ctrl + L
함수만들기 : Ctrl + K, Ctrl + M
이름바꾸기(리팩토링) : Ctrl + R, Ctrl + R
소스 재정렬? : Ctrl + K, Ctrl + F

그외 유용한? 단축키
다음 에러로 이동 : Ctrl + Shift + F12



by kiho | 2006/08/30 00:56 | .NET | 트랙백 | 덧글(2)

mono, 리눅스에서 .net하기

mono 설치:
gentoo에서 emerge mono

asp.net는
emerge mod_mono 설치후 아파치 설정(/etc/conf.d/apache2)에 -D MONO 추가
virtual host파일에 다음처럼 설정

<VirtualHost *:80>
    DocumentRoot "/var/www"
    MonoApplications default "/:/var/www"
    MonoDocumentRootDir "/var/www"
    <Location />
        SetHandler mono
    </Location>
</VirtualHost>


c# 소스파일 컴파일하기:
mcs 소스파일명
혹은
gmcs 소스파일명

mcs가 C# 1.0의 컴파일러이고, gmcs는 C# 2.0의 컴파일러라고 한다.


실행하기:
mono 실행파일명

by kiho | 2006/08/11 22:54 | .NET | 트랙백 | 덧글(2)

C# 코딩 가이드라인

http://blogs.msdn.com/brada/articles/361363.aspx

Pascal String : 모든 단어의 첫글자만 대문자, 나머진 소문자
camelString : 첫 단어의 첫글자가 소문자

멤버변수, 파라미터, 지역변수명에는 camelString을 쓴다.
그 외에는 PascalString을 쓴다. inteface의 경우 앞에 I 를 붙인다 (예, interface IList {} )

 

C#파일의 구성

namespace MyNamespace

{

    using System;

 

    public class MyClass : IFoo

    {

 

        // fields

        int foo;

 

        // constructors

        public MyClass() { }

 

        // properties

        public int Foo { get { } set { } }

 

        // events

        public event EventHandler FooChanged { add { } remove { } }

 

        // methods

        void DoSomething() { }

        void FindSomethind() { }

 

        //private interface implementations

        void IFoo.DoSomething() { DoSomething(); }

 

        // nested types

        class NestedType { }

 

    }

 

}

 

 

 

 

Nested Type는 되도록 피한다.

Nested Type 혹은 그 생성자가 private 일 경우가 아니면 되도록 밖으로 빼낸다.

 

by kiho | 2006/07/13 01:55 | .NET | 트랙백 | 덧글(0)

멀티쓰레드에서 컨트롤의 속성 바꾸기

닷넷 폼 컨트롤들은 컨트롤핸들이 속한 쓰레드 외에서 접근하려 하면 예외를 발생시킨다.
그래서 다른 쓰레드에서 접근하려면 Invoke 함수를 통해 접근해야한다.

현재 쓰레드에 컨트롤 핸들이 속했는지를 알기 위해서는 Control 클래스의 InvokeRequired 속성을 참조하면 된다.
이 속성이 true일 경우에만 Invoke함수를 쓸 필요가 있는 것이다.

public object Invoke(Delegate method);

public object Invoke(Delegate method, params object[] args);

 

이 Invoke함수는 method로 넘긴 delegate함수를 컨트롤핸들이 속한 쓰레드에서 실행할 수 있도록 해준다.
파라미터가 필요한 경우는 두번째 함수를 쓰면 된다.
비동기적으로 쓰고 싶으면 BeginInvoke, EndInvoke를 쓰면 된다.
(Invoke, BeginInvoke, EndInvoke, CreateGraphics 외의 함수를 다른 쓰레드에서 호출하면 예외가 발생된다.)

다음은 내가 짜서 쓰고 있는 클래스..


 

static class ControlProperty

{

    delegate void PropertySetter(object control, string propertyName, object value);

 

    private static void Setter(object control, string propertyName, object value)

    {

        try

        {

            Type type = control.GetType();

            PropertyInfo prop = type.GetProperty(propertyName);

            prop.SetValue(control, value, null);

        }

        catch

        {

        }

    }

 

    public static void Set(object control, string propertyName, object value)

    {

        if (control is Control)

        {

            Control ctrl = control as Control;

            if (ctrl.InvokeRequired)

                ctrl.Invoke(new PropertySetter(Setter), control, propertyName, value);

            else

                Setter(control, propertyName, value);

        }

    }

}

 

 

사용예

 

ControlProperty.Set(nicknameTextBox, "Enabled", false);

ControlProperty.Set(nicknameTextBox, "Text", string.Empty);

 

by kiho | 2006/07/13 01:15 | .NET | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶