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


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


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

아래의 내용을 봤습니다.

 

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
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
  1. Favicon of http://www.sysnet.pe.kr BlogIcon kevin 2010.11.08 16:27

    오~~~ 세상에, VB 는 프로젝트 속성에서 제공해주는 군요. ^^

+ Recent posts