2017.11.15 21:00


이런 초보적인... ^^;


Directory 생성후 생성한 폴더에 작업시 오류가 발생한다면...


            if (!Directory.Exists(directoryName))

            {

                Directory.CreateDirectory(target.FullName);

                Thread.Sleep(100);

            }


또는


            if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);

            int i = 0;

            while (true)

            {

                if (Directory.Exists(directoryName))

                    break;

                

                Thread.Sleep(100);

                i++;


                if (i > 10) break;

            }



행복한 고수되셔요. ^^


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




'.NET > C#' 카테고리의 다른 글

[C#] CreateDirectory  (0) 2017.11.15
[C#] Logging on File  (0) 2017.10.24
[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
Posted by woojja
2017.10.24 20:30


Log4Net 을 사용하다가 다소 불편한 감이 있어서

File 에 Log 를 작성하는 Class 를 간단하게 작성했습니다.

그냥 동적으로 로그 파일을 만들어서 확확 적어버리고 싶었거든요. 




내용은 이렇습니다.


    public enum LogLevel

    {

        NONE,

        TRACE,

        INFO,

        DEBUG,

        WARNING,

        ERROR,

        FATAL,

        MANNUAL

    }


    public class Logger

    {        

        public Logger()

        {

        }

        

        /// <summary>

        /// Format a log message based on log level

        /// </summary>

        /// <param name="level">Log level</param>

        /// <param name="text">Log message</param>

        public static int WriteLog(string filePath, string fileName, string text, LogLevel level = LogLevel.INFO, bool withLevel = true, bool append = true)

        {

            string DatetimeFormat = "yyyy-MM-dd HH:mm:ss.fff";

            string pretext = DateTime.Now.ToString(DatetimeFormat);

            string strLevel = " : ";


            if (withLevel)

            {

                switch (level)

                {

                    case LogLevel.TRACE:

                        strLevel = " [TRACE]   : ";

                        break;

                    case LogLevel.INFO:

                        strLevel = " [INFO]    : ";

                        break;

                    case LogLevel.DEBUG:

                        strLevel = " [DEBUG]   : ";

                        break;

                    case LogLevel.WARNING:

                        strLevel = " [WARNING] : ";

                        break;

                    case LogLevel.ERROR:

                        strLevel = " [ERROR]   : ";

                        break;

                    case LogLevel.FATAL:

                        strLevel = " [FATAL]   : ";

                        break;

                    default: break;

                }

            }


            return WriteLine(filePath, fileName, pretext + strLevel + text);

        }


        /// <summary>

        /// Format a log message based on log level

        /// </summary>

        /// <param name="level">Log level</param>

        /// <param name="text">Log message</param>

        public static async Task<int> WriteLogAsync(string filePath, string fileName, string text, LogLevel level = LogLevel.INFO, bool withLevel = true, bool append = true)

        {

            string DatetimeFormat = "yyyy-MM-dd HH:mm:ss.fff";

            string pretext = DateTime.Now.ToString(DatetimeFormat);

            string strLevel = " : ";


            if (withLevel)

            {

                switch (level)

                {

                    case LogLevel.TRACE:

                        strLevel = " [TRACE]   : ";

                        break;

                    case LogLevel.INFO:

                        strLevel = " [INFO]    : ";

                        break;

                    case LogLevel.DEBUG:

                        strLevel = " [DEBUG]   : ";

                        break;

                    case LogLevel.WARNING:

                        strLevel = " [WARNING] : ";

                        break;

                    case LogLevel.ERROR:

                        strLevel = " [ERROR]   : ";

                        break;

                    case LogLevel.FATAL:

                        strLevel = " [FATAL]   : ";

                        break;

                    case LogLevel.MANNUAL:

                        strLevel = " [MANNUAL] : ";

                        break;

                    default: break;

                }

            }


            return await WriteLineAsync(filePath, fileName, pretext + strLevel + text);

        }

        

        /// <summary>

        /// Write a line of formatted log message into a log file

        /// </summary>

        /// <param name="text">Formatted log message</param>

        /// <param name="append">True to append, False to overwrite the file</param>

        /// <exception cref="System.IO.IOException"></exception>

        private static int WriteLine(string filePath, string fileName, string text, bool append = true)

        {

            int intReturn = 0;


            if (string.IsNullOrEmpty(filePath))

                throw new ArgumentNullException("filePath");


            if (string.IsNullOrEmpty(fileName))

                throw new ArgumentNullException("fileName");


            if (string.IsNullOrEmpty(text))

                throw new ArgumentNullException("text");


            if (!Directory.Exists(filePath))

            {

                Directory.CreateDirectory(filePath);

                Thread.Sleep(100);

            }

            

            fileName = fileName + "_" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";

            filePath = Path.Combine(filePath, fileName);


            text += "\r\n";

            //byte[] buffer = Encoding.Unicode.GetBytes(text);

            byte[] buffer = Encoding.UTF8.GetBytes(text);

            Int32 offset = 0;

            Int32 sizeOfBuffer = 4096;

            //FileStream fileStream = null;


            FileMode fileMode = FileMode.Append;

            if (!append)

                fileMode = FileMode.OpenOrCreate;


            try

            {

                using (FileStream fileStream = new FileStream(filePath, fileMode, FileAccess.Write,

                FileShare.None, bufferSize: sizeOfBuffer, useAsync: true))

                {

                    fileStream.Write(buffer, offset, buffer.Length);

                }


                intReturn = 1;

            }

            catch (Exception ex)

            {

                //Write code here to handle exceptions.

                string strMessage = ex.Message;

            }

            finally

            {

                //if (fileStream != null)

                //    fileStream.Dispose();

            }

            return intReturn;

        }


        static async Task<int> WriteLineAsync(string filePath, string fileName, string text, bool append = true)

        {

            int intReturn = 0;


            if (string.IsNullOrEmpty(filePath))

                throw new ArgumentNullException("filePath");


            if (string.IsNullOrEmpty(fileName))

                throw new ArgumentNullException("fileName");


            if (string.IsNullOrEmpty(text))

                throw new ArgumentNullException("text");


            if (!Directory.Exists(filePath))

            {

                Directory.CreateDirectory(filePath);

                Thread.Sleep(100);

            }


            fileName = fileName + "_" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";

            filePath = Path.Combine(filePath, fileName);


            text += "\r\n";

            //byte[] buffer = Encoding.Unicode.GetBytes(text);

            byte[] buffer = Encoding.UTF8.GetBytes(text);

            Int32 offset = 0;

            Int32 sizeOfBuffer = 4096;

            //FileStream fileStream = null;


            FileMode fileMode = FileMode.Append;

            if (!append)

                fileMode = FileMode.OpenOrCreate;


            try

            {

                using (FileStream fileStream = new FileStream(filePath, fileMode, FileAccess.Write,

                FileShare.None, bufferSize: sizeOfBuffer, useAsync: true)){

                    await fileStream.WriteAsync(buffer, offset, buffer.Length);

                }


                //fileStream = new FileStream(filePath, fileMode, FileAccess.Write,

                //FileShare.None, bufferSize: sizeOfBuffer, useAsync: true);

                //await fileStream.WriteAsync(buffer, offset, buffer.Length);

                intReturn = 1;

            }

            catch(Exception ex)

            {

                //Write code here to handle exceptions.

                string strMessage = ex.Message;

            }

            finally

            {

                //if (fileStream != null)

                //    fileStream.Dispose();

            }

            return intReturn;

        }


    }


사용은 ...


        private async void WriteLog(string anyLocation, string logMessage, LogLevel level = LogLevel.INFO)

        {

            string strRootPath = Application.StartupPath;

            string strPath = Path.Combine(strRootPath, anyLocation+ "_Logs");


            await SystemLogger.WriteLogAsync(strPath, strFileName, logMessage, level);

        }


이렇게 별도의 함수를 만들어 호출하여 사용하면 되겠습니다.

매번 async 를 붙이기도 귀찮더라고요. ^^;


            WriteLog(anyLocation, "Write some Log.");


이제부터는 개떡같이 쓰여졌더라도 찰떡같이 알아 보시는 쎈스를 동원하시면 되겠습니다. 


다른 방법이 있다면 알려주셔요~ ^^



행복한 고수되셔요. ^^


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




'.NET > C#' 카테고리의 다른 글

[C#] CreateDirectory  (0) 2017.11.15
[C#] Logging on File  (0) 2017.10.24
[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
Posted by woojja

아래의 내용을 봤습니다.

 

https://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use

 

저는 아래 구문이 그런데로 나은듯한데요.

 

        private bool IsFileLocked(string filePath)
        {

            try
            {
                using (Stream stream = new FileStream(filePath, FileMode.Open))

                {

                     // File/Stream manipulating code here

                }
            }
            catch (IOException ex)
            {
                return true;
            }
            finally
            {
            }

            //file is not locked
            return false;
        }

 

잠시 생각해보니 궁금한 점이 생기네요.

IsFileLocked Method 에 접근하는 동안 Lock 이 발생하지 않을까요?

파일이 잠겨있는지 확인하는데 Lock 이 걸린다면.

stream 이 Close 될때까지의 시간이 그리 길지 않겠지만 말이죠.(당연히 파일의 크기에 따라 달라지겠죠?)

 

행복한 고수되셔요. ^^

 

woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




'.NET > C#' 카테고리의 다른 글

[C#] CreateDirectory  (0) 2017.11.15
[C#] Logging on File  (0) 2017.10.24
[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
Posted by woojja
TAG c#, file lock
VisualBasic 은 그냥 프로퍼티 하나 추가해주면 되는 것을...
C# 은 쩝...

VB 는 아래와 같이 설정하지요...


갑자기 구현을 해야할 것이 생겨서요 찾아보다가
다음 페이지를 참고해서? ㅡㅡ' (베껴서 작성했습니다.)


덕분에 금새 만들었습니다요... ㅡㅡ'

보실 분들 참고 하셔요...
http://ko.w3support.net/index.php?db=so&id=391339

    4     static class Program

    5     {

    6         /// <summary>

    7         /// 해당 응용 프로그램의 주 진입점입니다.

    8         /// </summary>

    9         [STAThread]

   10         static void Main()

   11         {

   12             if (!IsAppAlreadyRunning())

   13             {

   14                 Application.EnableVisualStyles();

   15                 Application.SetCompatibleTextRenderingDefault(false);

   16                 Application.Run(new frmUserSynch());

   17             }

   18             else

   19             {

   20                 MessageBox.Show("Application 이 이미 실행중입니다!!!\n작업관리자의 Process 를 확인해 보시기 바랍니다.");

   21             }

   22         }

   23 

   24         private static bool IsAppAlreadyRunning()

   25         {

   26             System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();

   27             return (IsAppAlreadyRunning(currentProcess.Id, currentProcess.ProcessName));

   28         }

   29 

   30         private static bool IsAppAlreadyRunning(int ID, string Name)

   31         {

   32             bool isAlreadyRunnig = false;

   33 

   34             System.Diagnostics.Process[] processess = System.Diagnostics.Process.GetProcesses();

   35 

   36             foreach (System.Diagnostics.Process process in processess)

   37             {

   38                 if (ID != process.Id)

   39                 {

   40                     if (Name == process.ProcessName)

   41                     {

   42                         isAlreadyRunnig = true;

   43                         break;

   44                     }

   45                 }

   46             }

   47             return isAlreadyRunnig;

   48         }

   49     }


그럼 행복한 고수되셔요...




'.NET > C#' 카테고리의 다른 글

[C#] Logging on File  (0) 2017.10.24
[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
[C#] 요것 한번 보시죠... VB.NET 에는 없어요. ^^'  (0) 2009.03.06
Posted by woojja

C# 4.0 의 새로운 Feature 에 대한 이야기를 하고자 한다.
왜  C# 은 세상개발자들이 폄하하는 위대한 VB 의 내용을 따라하는가?
(따라한다... 라는 말에 대해서도 해야할 말들이 많기는 하다... - 그것이 진정 따라하는 것인가? 라는 주제로... - 결론만 먼저 이야기 한다면 사람에 따라서 따라한다고 말을 할 수도 있겠지만... 그것은 시대적인 요구와 흐름에 의해서 자연적으로 발생한 것뿐.(참조는 했을수도 있겠지만... 따라했다고 비난할 것은 아니다 라는 것이 내 개인적인 생각이다.)

음... 여튼.. C# 4.0 에 새로나온 내용중  Optional 과 Named Parameter 에 대해서 말하고자 한다.

이 기능은 VB 를 해 본 사람이라면 기본적으로 알고 있는 아주 당연한 Feature 중 하나다.

여러분들중 개발을 조금이라도 해본(나같은 ㅋㅋㅋ) 초보자도 Method 의 Overloads 에 대해서 알고 있을 것이다.

Function 명은 같지만 Parameter 의 갯수가 다른... (Constructor 에도 적용되는...)

하나의 Person Class 를 만들어 보자.
public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Phone{ get; set; }
        public string Address{ get; set; }

        public Person(string lastName, string firstName)
        {
            LastName= lastName;
            FirstName= firstName;
            Phone= "N/A";
            Address= string.Empty;
        }
        public Person(string lastName, string firstName, string phone)
        {
            LastName= lastName;
            FirstName= firstName;
            Phone= phone;
            Address= string.Empty;

        }
        public Person(string lastName, string firstName, string address)
        {
            LastName= lastName;
            FirstName= firstName;
            Phone = string.Empty;
            Address= address;
        }
        public Person(string lastName, string firstName, string phone,
            string address)
        {
            LastName= lastName;
            FirstName= firstName;
            Phone = phone;
            Address= address;
        }
    }

 그리고 이런식으로 호출을 한다.
Person person= new Person(“우”, ”정환”);
Person person= new Person(“우”, ”정환”, "01023456789");
Person person= new Person(“우”, ”정환”, "서울시 서초구 서초동");
Person person= new Person(“우”, ”정환”, "01023456789", "서울시 서초구 서초동");

 이런 경우 C# 4.0 의 경우는 생성자를 아래와 같이 표현할 수 있다.
public Person(string lastName, string firstName,
            string phone = "N/A", string address = "")
{
    LastName= lastName;
    FirstName= firstName;
    Phone = phone;
    Address = address ;
}

간단하지 않은가? 이것이 바로 Optional Feature 이다.
그럼 어떻게 호출하는 지 볼까?
Person person= new Person(“우”,”정환”);
Person person= new Person(“우”,”정환”, "01023456789");
Person person= new Person(“우”,”정환”, "01023456789", "서울시 서초구 서초동");

똑같은가? 똑같지... ㅋㅋ 하지만 생성자는 하나라는 것...
이것이 Optional 기능의 Overloads 인 것이다.
그럼 이때... 떠올려 봐야할 것이 있다. parameter  중 Phone  을 사용하고 싶지 않을때는 어떻게 할 것인가 말이다.
Person person= new Person(“우”, ”정환”,  address: "서울시 서초구 서초동");
Person person= new Person(“우”, ”정환”,  phone: "01023456789");

이렇게 한다...

이것이 Named Argument 이다.

이런것쯤은 VB 개발자들은 기본적으로 알고 있는 것인데... C# 4.0 에 포함했다고 대대적으로 선전하고 있으니 우습지 않은가?

C# 이 이것밖에 안되었나? 캬캬캬

이것이 대세인 것이다.
VB 가 대세라는 것이지...

따라쟁이 C# 도 VB 처럼 생산성이 좋은 언어로 거듭태어나고 있다.

따라쟁이라고 제목은 붙였지만 따라쟁이라고 말하고 싶지는 않다.

이것이 대세이고 모든 언어들은 대세를 향해 진화하고 있을뿐...
그것이 사용자에 대한 기본적인 예의인 것인 것이리라...


행복한 고수되셔요...




'.NET > C#' 카테고리의 다른 글

[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
[C#] 요것 한번 보시죠... VB.NET 에는 없어요. ^^'  (0) 2009.03.06
[C#] Yield  (0) 2009.03.06
Posted by woojja

MSDN 의 내용입니다.

VB.NET 과 함께 C# 도 오류 사항을 올려놓았네요...

한번 보시죠...



C# 컴파일러 오류




행복한 고수되세요...


woojja ))*
\\\\\\\\\\\\\\\\\\\




'.NET > C#' 카테고리의 다른 글

[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
[C#] 요것 한번 보시죠... VB.NET 에는 없어요. ^^'  (0) 2009.03.06
[C#] Yield  (0) 2009.03.06
Posted by woojja
현재 C# 으로 프로젝트를 하니라고 맨땅에 열심히 헤딩하고 있다.
그러다가 
이런 문장을 봤다. ㅡㅡ'

    public woojja1(string str)
      :this()

woojja1(string str) 은 Constructor 다.
그런데...

:this()는 뭐냐? VB.NET 개발자들에게는 생소하리라 생각된다...
이게 어떤 버젼부터 튀어나왔는지도 모르겠다.(아시는 분 알려주셔요. 1.1 부터인가?)

보니. Default Constructor 를 호출하는 문장이다.

woojja1(string str)보다 woojja1() 을 먼저 실행하게끔 한다.
그렇기 때문에  woojja1() Default Constructor 를 주석처리하게되면 에러가 발생하게된다.
기본적으로 Default Constructor를 호출해야하는데 명시적으로 존재하지 않기 때문에 에러가 발생하는 것이다.

하지만...

reference type 이 아닌 value type 이라면 이야기가 달라진다.
아래 woojja2 가 그 예인데...
일단 아래의 woojja2 structure 의 주석을 풀고 Code를 컴파일 또는 실행하게 되면  structure 는 Parameter 가 없는 Constructor는 명시적으로 포함할 수 없다는 에러메시지가 발생하며 주석있는 대로 컴파일 혹은 실행을 시켜도 에러가 발생하지 않는 것을 알 수 있다.

이런 부분은 단순히 parameter 가 있는 Constructure 내부에서 Default Constructure를 호출할 수있지만
이런 식으로 Default Constructure 를 호출하게 되면 코드 실행순서에 대한 예기치 않은? 에러를 방지할 수 있으리라 생각된다.

VB.NET 에도 포함되어있다면 조금은 편리할 수 있으리라 생각된다. 
(있는데 내가 못찾는 건가? ^^'  그렇다면 알려주셔요... )


아래는 작성해 본 코드입니다.
디버깅을 걸어놓고 코드진행을 눈으로 살펴보시면 이해하기가 훨 나으리라 생각됩니다.
^^ 

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      woojja1 w1 = new woojja1("woojja");
      woojja2 w2 = new woojja2("woojja");
      Console.ReadLine();
    }
  }


  class woojja1
  {
    public woojja1()
    {
      Console.WriteLine("woojja 1 Default");
    }
    public woojja1(string str)
      :this()
    {
      Console.WriteLine("woojja 1");
    }
  }

  struct woojja2
  {
    //public woojja2()
    //{
    //  Console.WriteLine("woojja 2 Default");
    //}
    public woojja2(string str)
      : this()
    {
      Console.WriteLine("woojja 2");
    }
  }
}



행복한 고수되세요...


woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\



'.NET > C#' 카테고리의 다른 글

[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
[C#] 요것 한번 보시죠... VB.NET 에는 없어요. ^^'  (0) 2009.03.06
[C#] Yield  (0) 2009.03.06
Posted by woojja
TAG this()
2009.03.06 01:48

MSDN 의 내용을 발췌했습니다.

ㅡㅡ'


iterator
블록에서열거자개체에값을제공하거나반복이끝났음을알리기위해사용됩니다. 다음과같은형식중하나를사용합니다.
yield return expression;
yield break;
매개변수
expression
열거자개체에대한값으로계산되어반환됩니다. expression은반복기의 yield 형식으로암시적으로변환될수있어야합니다.
설명
yield문은 iterator 블록내에만포함될수있으며메서드, 연산자또는접근자의본문으로사용할수있습니다. 이러한메서드, 연산자또는접근자의본문에는다음제한사항이적용됩니다.
·         안전하지않은블록은사용할수없습니다.
·         메서드, 연산자또는접근자에대한매개변수는 ref 또는 out일수없습니다.
무명메서드에는 yield 문을사용할수없습니다. 자세한내용은 무명메서드(C# 프로그래밍가이드)를참조하십시오.
expression과함께사용할경우, catch 블록이나 catch 절이하나이상포함된 try 블록에는 yield return 문을포함할수없습니다. 자세한내용은 예외처리문(C# 참조)을참조하십시오.
예제
다음예제에서 yield 문은반복기블록인Power(int number, int power)메서드내에서사용됩니다. Power 메서드가호출되면숫자의거듭제곱이들어있는열거가능한개체가반환됩니다. Power 메서드의반환형식은반복기인터페이스형식인 IEnumerable입니다.
// yield-example.cs
using System;
using System.Collections;
public class List
{
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
        {
            result = result * number;
            yield return result;
        }
    }
 
    static void Main()
    {
        // Display powers of 2 up to the exponent 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }
}
출력
2 4 8 16 32 64 128 256



행복한 고수되십시요...



woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\



'.NET > C#' 카테고리의 다른 글

[C#] How do you check if a file is in use?  (0) 2017.07.27
[C#] 단일 Process 실행  (2) 2010.11.08
[C#] C# 은 VB.NET 따라쟁이...  (3) 2009.05.07
[C#] C# 컴파일러 오류  (0) 2009.03.06
[C#] 요것 한번 보시죠... VB.NET 에는 없어요. ^^'  (0) 2009.03.06
[C#] Yield  (0) 2009.03.06
Posted by woojja
TAG yield
이전버튼 1 이전버튼