Posted by Gungume
,

파일날짜 일괄변경



파일날짜 일괄변경 프로그램을 약간 업데이트 했습니다.

우선 복구하기 기능을 추가했습니다. 복구하기 기능은 말 그대로 일괄변경하기 전의 파일이 가지고 있던 날짜로 복구하는 기능입니다. 프로그램을 종료하지 않는 이상 수차례의 일괄변경 후에도 복구가 가능합니다.

그리고 이전 버전의 경우 Windows 7에서 레이아웃이 깨지는 문제로 호환성을 위해서 프로그램의 크기 조절이 제한되었었는데 크기 조절에 제한이 없도록 변경하였습니다.

(사용언어 / 제작툴 / .Net Framework버전 : C# / VS2010 beta1 / 2.0)

이전 버전 받기
최신 버전 받기


Posted by Gungume
,
RenamerUseFoldername.exe
제목 그대로 폴더명을 이용해서 파일명을 변경하는 프로그램입니다.

사용법은 우선 이름을 변경하고 싶은 파일이 있는 폴더를 프로그램으로 드래그 & 드롭하면 목록이 추가됩니다.

파일은 드래그&드롭이 되지 않고, 드래그 & 드롭한 폴더를 기준으로 모든 하위 폴더&파일을 순회하면서 목록에 추가됩니다.
(숨긴파일에 대해서는 추가되지 않습니다.)

기본적인 명명 규칙은 폴더명에 '_'를 붙힌 후 일련번호를 붙히는 형식으로 작동됩니다.
(확장자는 원본 그대로 사용하고, 일련번호 자릿수는 1~10자리로 공백에 대해서는 0으로 채워집니다.)

아래 캡쳐화면은 "C:\Users\Administrator\Desktop" 경로에 있는 "Picture" 폴더 하나를 드래그 & 드롭한 것입니다.



아래 캡쳐화면은 "상위 경로 포함" 옵션을 사용한 경우로 드래그 & 드롭시 폴더목록(이 경우 Picture 폴더)을 최상위로 해서 최종 파일까지의 경로를 '_'로 구분하면서 최종 파일명을 생성합니다.



참고로 "일련번호 자릿수", "상위 경로 포함" 옵션은 폴더&파일 추가 후에도 수시로 변경 가능합니다.

또한, 추가되는 파일의 확장자는 특별히 가리지는 않지만 사진파일 관리를 위해 만든 프로그램으로 사용법이 사진파일명 변경에 최적화 되어있습니다.

(사용언어 / 제작툴 / .Net Framework버전 : C# / VS2010 beta1 / 2.0)


Posted by Gungume
,
FileTimeChanger.exe
도깨비님의 요청에 의해서 파일날짜를 일괄변경하는 프로그램을 만들어 봤습니다. 파일의 '만든 날짜', '수정한 날짜', '액세스한 날짜'를 지정한 날짜 및 시간으로 일괄변경시켜주는 간단한 프로그램입니다.

리네이머에 기능을 추가하려다가 리네이머의 초기목적이 심플이였기 때문에 별도의 프로그램으로 만들었습니다.

사용법은 우선 일괄변경하고자 하는 파일들을 프로그램위로 끌어놓습니다. 그 다음에 일괄변경할 날짜 및 시간을 정해주고 '변경하기' 버튼을 클릭하시면 일괄변경됩니다.

'날짜만 적용' 버튼을 체크하시고 '변경하기' 버튼을 누르면 말 그대로 설정한 날짜 및 시간에서 날짜 부분만 적용하고 시간은 원래 파일의 시간을 그대로 사용합니다.

참고로 '변경하기' 버튼을 누르면 바로 적용되고 복구되지 않으니 사용에 주의해주시기 바랍니다.

또한 C#으로 만들었기 때문에 닷넷프레임워크 2.0 이상이 설치되있어야 실행이 가능합니다.
(닷넷 프레임워크 다운로드와 관련해서는 2008/06/28 - [C#] - Microsoft .NET Framework 다운로드 페이지...를 참고해주세요.)


아래는 프로그램의 캡쳐화면입니다~

파일 추가 후

날짜만 적용 후

날짜 및 시간 적용 후



참고로 'Windows 7'에서는 화면이 아래와 같습니다. 뭐가 문제인지 XP에서 코딩한 것을 7에서 실행하면 레이아웃이 깨져서 일부분만 수정해놨습니다.(혹시 XP같은 모양으로 실행되신다면 리플 달아주세요;;;)

Windows 7 실행모습


Source: https://github.com/gungume/FileTimeChanger/releases/tag/0.1
(사용언어 / 제작툴 / .Net Framework버전 : C# / VS2008 / 2.0)

2009.07.25
Windows 7 최근 버전에서 레이아웃 깨지는 문제 발생 안함

최신 버전 받기


Posted by Gungume
,
C# 등의 닷넷계열의 언어를 이용해서 프로그래밍을 하면 어셈블리를 이용해 리버스 엔지니어링이 매우 쉽게 됩니다.

실제로 .NET Reflector 등을 사용해보면 어셈블리에서 원본코드와 거의 동일한 소스코드도 뽑아낼 수 있습니다.

이런 것을 방지하기 위한 것이 난독화인데 여러가지 방법 중에 간단한 것은 메소드명, 변수명 등을 a, b, c 등 의미없는 단어로 변경하는 방법입니다.

이런 난독화를 하는 프로그램이 몇개 있지만 Visual Studio를 설치하면 "Dotfuscator Community Edition"이 같이 설치되서 사용할 수 있습니다.(Community Edition으로 기능상에 제약이 있습니다.)


아래 예제에서는 별다른 옵션을 주지 않고 기본설정만을 이용한 간단한 사용법을 알아보겠습니다.

실행 방법은 Visual Studio의 도구메뉴에서 "Dotfuscator Community Edition"를 클릭하시면 됩니다.(시작메뉴에서도 실행은 가능하지만 Visual Studio가 실행이 되있어야 실행이 됩니다.)

프로그램을 실행하면 등록과 관련된 창이 뜨는데 일단 무시하시고, 실행이 완료되면 'Input' 탭에서 열기 아이콘을 이용해서 난독화를 수행할 파일을 선택해 줍니다.

파일 추가 후에 File메뉴나 툴바의 저장버튼을 이용해서 적당한 폴더에 프로젝트를 저장합니다.
(이때 설정한 폴더경로는 결과물이 저장될 경로이기도 합니다.)


그 다음에는 'Build' 탭으로 이동해서 'Build' 버튼을 클릭함으로써 난독화를 시작합니다.
(Directory 그룹박스 설정을 통해 결과물이 저장될 경로 변경가능합니다.)


Build가 완료되면 결과가 나옵니다. 뭐 대충 메소드명이나 필드명 등을 전체 몇개 중 몇개를 바꿨다는 내용으로 나오네요...


결과 확인을 위해 'Output' 탭으로 이동하면 아래 화면처럼 Program클래스, Main메소드, Sum메소드의 이름이 각각 'a'로 변경된 것을 알수 있습니다.
(실제 결과물은 위에서 프로젝트 저장 폴더로 지정한 경로에 가면 있습니다.)


다음은 위에서 작업한 파일의 원본 소스의 일부와 난독화한 파일을 .NET Reflector로 봤을 때 어떻게 변경됐는지를 보여줍니다.

Sum메소드명이 a로 변경되었고, Sum메소드의 매개변수인 var1, var2 각각이 A_0, A_1로 변경되었습니다.

예제에서는 소스코드가 단순해서 난독화 결과를 보고도 분석이 가능하지만 소스코드가 복잡했다면 의미없는 메소드명과 변수명등으로 도배가 된 코드를 분석하기는 어려울 것입니다.

▣ 소스코드
class Program
{
    static void Main(string[] args)
    {
        string str = "Test Message";
        Console.WriteLine(str);

        Console.WriteLine(Sum(10, 20));
    }

    static int Sum(int var1, int var2)
    {
        return var1 + var2;
    }
}

▣ .NET Reflector 결과화면


더 많은 기능이나 자세한 옵션 등은 아래 MSDN 페이지를 참조바랍니다.
Posted by Gungume
,
C#을 이용해서 웹페이지의 소스를 볼 수 있는 간단한 예제입니다.

웹페이지의 특성에 따라 인코딩 부분과 개행문자 부분은 변경해야 할 수도 있습니다.

using System.Net;
using System.IO;

WebRequest req = WebRequest.Create(url);
WebResponse res = req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8);
string result = sr.ReadToEnd().Replace("\n", "\r\n");

res.Close();
sr.Close();

(사용언어 / 제작툴 / .Net Framework버전 : C# / VS2008 / 3.5)


Posted by Gungume
,
using System.Data;
using System.Data.SqlClient;

// 연결문자열  
string ConnectionString = "server=localhost(or ServerIP);database=DB_Name;user id=sa;password=sa";

// 1. 데이터베이스 연결  
SqlConnection conn = new SqlConnection(ConnectionString);

// 2. 명령문 만들기  
string query = "SELECT * FROM table";
SqlCommand cmd = new SqlCommand(query, conn);

// 3. DataAdapter 개체 생성
SqlDataAdapter ad = new SqlDataAdapter();
ad.SelectCommand = cmd;

// 4. DataSet 개체 생성 및 데이터 채우기
DataSet ds = new DataSet();
ad.Fill(ds);

// 5. DataSet 개체를 GridView 컨트롤에 바인딩
GridView1.DataSource = ds;
GridView1.DataBind();
Posted by Gungume
,
using System.Data;
using System.Data.SqlClient;

// 연결문자열
string ConnectionString = "server=localhost(or ServerIP);database=DB_Name;user id=sa;password=sa";

// 1. 데이터베이스 연결
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();

// 2. 명령문 만들기
string query = "SELECT * FROM table WHERE id = @id";
SqlCommand cmd = new SqlCommand(query, conn);

// 둘 중 하나 사용~
cmd.Parameters.Add("@id", SqlDbType.VarChar).Value = "id_Value";
cmd.Parameters.AddWithValue("@id", "id_Value");

// 3. 명령 실행
SqlDataReader reader = cmd.ExecuteReader();

// 4. 실행 결과 보여주기
while (reader.Read())
{    
    // 둘 중 하나 사용~    
    Console.WriteLine(reader[index]);    
    Console.WriteLine(reader["컬럼명"]);
}

// 5. 데이터베이스 닫기
reader.Close();
conn.Close();
Posted by Gungume
,

ListViewItem 복사

Language/C# 2008. 12. 16. 10:00
하나의 ListView에서 다른 ListView로 모든 데이터를 복사하고 싶을 때 아래와 같이 코딩을 하면 오류가 발생한다.

foreach (ListViewItem item in listViewA.Items)
{
     listViewB.Items.Add(item);
}

위의 코드 수행에 따른 오류 메시지를 보면 "두 개 이상의 위치에 'xxx' 항목을 추가하거나 삽입할 수 없습니다. 먼저 항목의 현재 위치에서 항목을 제거하거나 복제해야 합니다."라고 나온다.

오류메시지를 대략 보면 foreach 구문에서 item이 참조형식으로 받아오기 때문에 생기는 문제같다. 오류메시지에 나온 해결방법중 복제하는 방법을 코드로 옮기면 아래와 같다.

아래 코드를 실행해보면 원하는데로 동작한다.
foreach (ListViewItem item in listViewA.Items)
{
     listViewB.Items.Add((ListViewItem)item.Clone());
}


좀더 자세한 내용은 MSDN Forums(copy listview item to another listview.) 참조...
Posted by Gungume
,
이번에 졸업작품으로 만든 프로그램으로 C#으로 만들었다.

주제가 좀 평범해서 몇가지 경우에 대해서는 소켓통신 대신에 WMI를 사용했다는 것이 조금 다를뿐이다...

원래는 기본기능 외에 부가적인 기능과 PC재배치 등에 대한 기능을 좀더 유동적으로 만들려고 했는데 예정에 없던 산업체현장실습과 교육 등으로 인해 실제 개발에 투자한 시간이 몇주밖에 되지않아 기본기능만 구현했다;;;

나름 핵심기능은 WMI를 이용해서 PC의 전원 및 프로세스, 레지스트리 관리정도와 소켓통신을 이용한 원격제어 등이다...

아래는 전체시스템 구성도로 중앙서버(=메인서버)와 클라이언트(관리할 PC들)로 구성된다.

관리를 하기위한 기능은 대부분 서버에서 이루어지고, 클라이언트는 처음 실행시 학번을 통해서 로그인을 하고 이후에는 백그라운드로 실행되면서 서버에서 요청한 정보를 전송해주는 기능정도만 한다..

- 전체시스템 구성도 -
전체시스템 구성도



- 서버 -




- 클라이언트 -



- 프로세스 정보 -
WMI를 이용해서 원격지의 프로세스 정보를 얻어옴
왼쪽은 구현한 프로그램에서 얻어온 프로세스 정보이고 오른쪽은 윈도우의 작업관리자에서 얻어온 프로세스 정보
프로그램상에서 선택한 프로세스에 대한 Kill 가능~



- 원격탐색기 -
소켓통신을 이용해서 원격지의 폴더 & 파일 정보를 얻어옴
파일전송 기능을 넣고 싶었지만 시간이 부족했다;;;
역시 왼쪽은 구현한 프로그램, 오른쪽은 윈도우의 탐색기



- 화면캡쳐 -
소켓통신을 이용해서 원격컴퓨터의 화면을 캡쳐해옴
버튼 클릭에 따른 캡쳐 및 설정된 타이머간격으로 캡쳐가능
캡쳐된 화면 JPG, BMP, PNG 파일로 저장가능



- 윈도우최적화 -
WMI를 사용 원격컴퓨터의 레지스트리를 변경해서 윈도우최적화



- 원격제어 -
소켓통신을 이용한 원격제어
화면캡쳐를 이용한 원격제어
기본적인 키보드 & 마우스제어 가능

Posted by Gungume
,