/// <summary> /// thread run 메인 /// </summary> /// <param name="fileWriter"></param> /// <param name="srcString"></param> /// <param name="delimiter"></param> /// <param name="fieldNumber"></param> private void RealStart(MyClass_Files_Writer fileWriter, string srcString, char delimiter, int fieldNumber) { MyClass_Strings strClass = new MyClass_Strings(); // convert and write to file string convertedStr = strClass.convertStringMsg(srcString, delimiter, fieldNumber); { // file.WriteLine(convertedStr); fileWriter.WriteToFile(convertedStr); // thread safty한 file writer... //System.IO.File.AppendAllText(filePath, convertedStr); } }
public void MyClass_Parse_And_Report4(string inputLog, string outputTxt) { // log 포맷 시간(19)#타입(2)#메시지코드(9) // 입력받은 text log 파일을 열어, #으로 split 한 후 각 type 별로 분리하고 카운팅한 결과를 output text에 저장 MyClass_Files_Reader srcFile = new MyClass_Files_Reader(inputLog); MyClass_Strings strClass = new MyClass_Strings(); string res = srcFile.readLine(); // 1 line read string[] line = srcFile.readLines(inputLog); // read all lines int num = line.Count(); // total count #if DEBUG_PRINT_ENABLE MyClass_Dprint.debugPrint("read lines:" + num); #endif int typeCount = strClass.countingAllTypes(line, delimiter, 1); string[] logTypes = strClass.getAllTypes(line, delimiter, 1); MyClass_Thread myThread = new MyClass_Thread(); // Example #4: Append new text to an existing file. // The using statement automatically flushes AND CLOSES the stream and calls // IDisposable.Dispose on the stream object. using (System.IO.StreamWriter outFile = new System.IO.StreamWriter(outputTxt, false)) { foreach (string s in logTypes) { //string[] data = strClass.StringSplit(s, delimiter); int cnt = strClass.getCountOfType(line, delimiter, 1, s); // 타입별 출력 파일 생성 MyClass_Files_Writer fileWriter = new MyClass_Files_Writer("TYPELOG_4_" + s + ".TXT"); // file writer 클래스에 thread safty하도록 lock 추가. (여러 thread에서 동시에 write의 경우 처리) string[] strResult = strClass.getLinesOfType(line, delimiter, 1, s);// 입력된 타입에 해당되는 로그 만 추출한다. foreach (string _line in strResult) { // 이부분 multi thread로 바꾼다. #if DEBUG_PRINT_ENABLE MyClass_Dprint.debugPrint("type: " + s); MyClass_Dprint.debugPrint("line: " + _line); #endif myThread.StartConvertAndWrite(fileWriter, _line, delimiter, 2); } #if DEBUG_PRINT_ENABLE MyClass_Dprint.debugPrint("type:" + s + " total num:" + cnt); #endif outFile.WriteLine(s + "#" + cnt); } } }
//private var semaphore = new System.Threading.Semaphore(this.max_thread, this.max_thread); public void StartConvertAndWrite(MyClass_Files_Writer fileWriter, string srcString, char delimiter, int fieldNumber) { System.Threading.ThreadPool.QueueUserWorkItem((state) => { semaphore.WaitOne(); // 세마포어 wait try { //DownloadItem(item); var t = new System.Threading.Thread(() => RealStart(fileWriter, srcString, delimiter, fieldNumber)); t.Start(); //return t; } finally { semaphore.Release(); // 세마포어 end } }); }
//@ 심벌을 문자열 앞에 사용하면, 해당 문자열 안의 Escape 문자를 무시하고 문자 그대로 인식하도록 한다. //예를 들어, 파일 패스를 지정할 때, Backslash를 한번 지정하면 이는 Escape문자로 인식되기 때문에 2개의 Backslash를를 사용하게 되는데, //@ 심벌을 문자열 시작 부호전에 사용하면, Backslash를를 그대로 Backslash를로 인식하게 한다. public void run_Test() { MyClass_Math.testClass(); Myclass_listData.testClass(); //MyClass_ScanDirs.testClass(); string path = Directory.GetCurrentDirectory(); StringBuilder sb = new StringBuilder(path); sb.Append("\\dll_test.dll"); MyClass_CallDll.testClass(sb.ToString()); #if false // 도서관리 sample MyClass_BookManager bm = new MyClass_BookManager(); bm.Run(); #endif #if false // 100의 bitcoins 전송 sample // List <MyClassBlockChain> blockchain = new List <MyClassBlockChain>(); // Genesis block string[] transactions = { "Jone Sent 100 Bitcoins to Bob." }; // 최초 노드 : genesisBlock myClassBlockChainHeader blockheader = new myClassBlockChainHeader(null, transactions); MyClassBlockChain genesisBlock = new MyClassBlockChain(blockheader, transactions); Console.WriteLine("Block Hash : {0}", genesisBlock.getBlockHash()); Stopwatch stopw = new Stopwatch();//시간 측정 클래스 MyClassBlockChain previousBlock = genesisBlock; for (int i = 0; i < 5; i++) { myClassBlockChainHeader secondBlockheader = new myClassBlockChainHeader(Encoding.UTF8.GetBytes(previousBlock.getBlockHash()), transactions); MyClassBlockChain nextBlock = new MyClassBlockChain(secondBlockheader, transactions); stopw.Start(); int count = secondBlockheader.ProofOfWorkCount(); stopw.Stop(); Console.WriteLine("{0} th Block Hash : {1}", i.ToString(), nextBlock.getBlockHash()); Console.WriteLine(" └ COUNT of Proof of Work : {0} th loop", count); Console.WriteLine(" └ Delay : {0} millisecond", stopw.ElapsedMilliseconds); previousBlock = nextBlock; stopw.Reset(); } #endif //중복되지 않는 첫번째 문자 구하기 // dictionary 사용 string s = "abcabdefe"; char ch = MyClass_Strings.GetFirstChar(s.ToCharArray()); Debug.WriteLine(ch); MyClass_Strings.testClass(); // recursive하게 sub folder에서 유일한 file 찾기 예 string fullPath = MyClass_Files.findFileFromSubFolder(".", "test.txt"); // 스트링내 캐릭터 조합 비교 예 string res = string.Empty; int ress = MyClass_Strings.checkCharsInString("coffee", "fofeefac", ref res); // 라인브레이크 사용자설정 예 // append mode on/off 예 MyClass_Files_Writer fileWriter = new MyClass_Files_Writer("fileWrite.TXT", false); fileWriter.customNewLine = "\r\n"; fileWriter.WriteToFile("asdfasdfasdfasdf"); fileWriter.WriteToFile("asdfasdfasdfasdf"); fileWriter.WriteToFile("asdfasdfasdfasdf"); // 소스의 라인브레이크 디텍션 예 MyClass_Files_Reader reader = new MyClass_Files_Reader("fileWrite.TXT"); string getNewLineChar = reader.getNewLine(); // newLine 형식 읽어와서 file writer의 customNewLine에도 맞춰주면 된다. // 암호화 예 string str_test = "3#ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string str_Enc = MyClass_Security.CaesarCipherEncrypt(str_test, 20); string str_test2 = "21#abcdefghijklmnopqrstuvwxyz"; string str_Enc2 = MyClass_Security.CaesarCipherEncrypt(str_test2, 20); // // 메서드로 바꿀것 // ABC 부품을 갖고 A7 B7 C7이 순서대로 오면 제품 조립 ok // 총 완성 제품 counting string str_Product_struct = "A2B3A7B7C7B2C7A9B4A9B8C7A2B7C9"; char[] array_Product_struct = str_Product_struct.ToCharArray(); int status = 0; //1:A ok, 2:B ok, 3:C ok int totalProductCount = 0; for (int i = 0; i < array_Product_struct.Length; i = i + 2) { string num = string.Empty; num += array_Product_struct[i + 1]; int part_count = Convert.ToInt32(num); //int level2 = Convert.ToInt32("-1024"); //int level = (int)Char.GetNumericValue(array_Product_struct[i + 1]);//Convert.ToInt32(array_Product_struct[i + 1]); if (array_Product_struct[i] == 'A') { if (part_count >= 7) { status = 1; } else { status = 0; } } if (array_Product_struct[i] == 'B' && status == 1) { if (part_count >= 7) { status = 2; } else { status = 0; } } if (array_Product_struct[i] == 'C' && status == 2) { if (part_count >= 7) { //status = 3; // count up status = 0; totalProductCount++; } else { status = 0; } } } Debug.WriteLine("totalProductCount: " + totalProductCount); // 구조체 타입 list의 정렬 예 //MyClass_list_sort<int> lSortTest = new MyClass_list_sort<int>(); MyClass_list_sort.test(); //MyClass_array_sort sortTest = new MyClass_array_sort(); MyClass_array_sort.test(); // 헤시맵을 이용한 정렬 TODO MyClass_hashMap hashTest = new MyClass_hashMap(); // TODO... hashTest.test(); // 링크드리스트 사용 예 //MyClass_linkedList list = new MyClass_linkedList(); MyClass_linkedList.test(); // 동전바꿈 예 MyClass_coinChangeCount cnt = new MyClass_coinChangeCount(); cnt.Test(); // MyClass_Parse_Log parse = new MyClass_Parse_Log('#'); // delimitor // 문제 sample // // parse.MyClass_Parse_And_Report1("LOGFILE_A.TXT", "REPORT_1.TXT"); // 문제 2 // parse.MyClass_Parse_And_Report2("LOGFILE_B.TXT", "REPORT_2.TXT"); //parse.MyClass_Parse_And_Report3("LOGFILE_B.TXT", "REPORT_3.TXT"); //parse.MyClass_Parse_And_Report4("LOGFILE_B.TXT", "REPORT_4.TXT"); // 암호/복호화 sample // String originalText = "plain text"; String key = "key"; String en = MyClass_Security.Encrypt(originalText, key); String de = MyClass_Security.Decrypt(en, key); Debug.WriteLine("Original Text is " + originalText); Debug.WriteLine("Encrypted Text is " + en); Debug.WriteLine("Decrypted Text is " + de); MyClass_Networks.StartServerWithThread(); //string testSend = MyClass_Networks.StartClientSync("1111111"); string testSend2 = MyClass_Networks.StartClientSync("send data 111111 ", false); //testSend2 = MyClass_Networks.StartClientSync("222222 ", false); testSend2 = MyClass_Networks.StartClientSync("test <EOF>", true); // Debug.WriteLine("start StartAsyncClient"); //MyClass_Networks.StartAsyncClient("test <EOF>"); //MyClass_Networks.StartAsyncClient("<EOF>"); Debug.WriteLine("abort socket server thread"); MyClass_Networks.StopServerWithThread(); // 폴더 스캔 샘플 // MyClass_Files.TreeScan(".\\.."); // 지정한 확장자를 가진 파일을 폴더내에서 찾아 list로 update string[] resultt = MyClass_Files.scanFolderAndUpdate_Filelists(".", "cs"); // 로그파일 쓰기 예 // MyClass_Logger log = new MyClass_Logger("restLog.txt"); log.WriteEntry("TTTTTTTTTTTTTTTTTTTTTTTTT"); // 링버퍼 샘플 // MyClass_RandomData rndData = new MyClass_RandomData(); rndData.rnd = new Random(); // random 초기화.. var data = rndData.GenerateRandomData(10); // 100개의 random 데이터 생성 // MyClass_CircularBuffer<타입>(갯수) var buffer = new MyClass_CircularBuffer <byte>(100); // 링버퍼 생성 buffer.Put(data); // 10 byte push data = rndData.GenerateRandomData(10); buffer.Put(data); //TestTools.UnitTesting.CollectionAssert.AreEqual(data, buffer.ToArray()); var ret = new byte[10]; //[buffer.Size]; buffer.Get(ret); buffer.Get(ret); // buffer size만큼 get //CollectionAssert.AreEqual(data, ret); //Assert.IsTrue(buffer.Size == 0); int test = 2; }