Compare commits

...

8 Commits

Author SHA1 Message Date
gloriasub
3d75d1192d remove binary file 2025-08-11 16:19:50 +09:00
a13306115b WebView2 Fixed Version 호환성 문제 해결 - NuGet 패키지 버전 업데이트 및 환경 설정 개선 2025-08-11 14:42:57 +09:00
SeungHo Yang
5949e3e7a1 프로그램 아이콘 적용.
프로그램 시작시 clientexe 교체 오류로 인해, 바로 종료되는 현상 수정.
복본조사 화면을  old 와 new 로 분리 함.
2025-07-28 22:26:57 +09:00
SeungHo Yang
6cd5ab6f1c 복본검사 화면 분리. - 등록된 부서의 사용자만 보이도록 함. 2025-07-27 21:05:54 +09:00
SeungHo Yang
9be6834d9f 웹페이지가 화면요소가 없는 경웁checkbox 클릭오류 수정 2025-07-09 23:25:42 +09:00
SeungHo Yang
12d6c2dbfb 검색결과 수량부분이 자세히 표시됨
오류 메세지 표현 방식 변경
2025-07-09 22:52:54 +09:00
SeungHo Yang
8b63566684 2025-07-07 22:00~23:00
* 복본검사
	검색대상(도서관) : 기본입력을 한글로
	검색시 검색윈도우 최소화 기능 일시 중지
	검색옵션추가 (전체, 오류+없음, 오류, 없음)
2025-07-07 23:28:22 +09:00
SeungHo Yang
b7c6e530dd 2025-07-06 19:30~ 21:35, 10:30 ~
Chrome Web Driver 추가(신규 복본검사 로직용)
도서관 검색버튼 추가
도서관 선택없이 검색시작을 누르면 오류 표시
도서관 DB 정보에 신규로직용 식별 키(SearcherNo:int) 추가
  - 광주광역시 남구 (문화, 청소년, 스마트, 푸른길)
2025-07-06 23:49:08 +09:00
213 changed files with 5686 additions and 53243 deletions

3
.gitignore vendored
View File

@@ -3,6 +3,7 @@
## 다음과 같은 확장자는 전체 무시
.vs
bin
debug
obj
packages
*.pub
@@ -34,3 +35,5 @@ GolfTicketing/
/unimarc/UniMarc/obj
/unimarc/UniMarc/.vs
/unimarc/UniMarc/bin
obj
bin

View File

@@ -0,0 +1,19 @@
{
"hooks": {
"conversation-start": "새로운 대화를 시작할 때 항상 CLAUDE.md 파일을 자동으로 읽고 프로젝트 컨텍스트를 파악하세요",
"user-prompt-submit": "작업을 시작하기 전에 항상 CLAUDE.md 파일을 읽고 참조하세요"
},
"rules": [
"대화 시작 시 반드시 CLAUDE.md 파일을 읽어서 프로젝트 컨텍스트를 파악할 것",
"모든 답변은 한국어로 작성할 것",
"UniMarc 프로젝트는 C# WinForms 기반의 도서관 관리 시스템임"
],
"context_files": [
"CLAUDE.md"
],
"project_info": {
"name": "UniMarc",
"type": "도서관 자료 관리 시스템",
"tech_stack": "C# WinForms, .NET Framework 4.7.2, MySQL"
}
}

View File

@@ -0,0 +1,6 @@
{
"hooks": {
"conversation-start": "새로운 대화를 시작할 때 항상 CLAUDE.md 파일을 자동으로 읽고 프로젝트 컨텍스트를 파악하세요",
"user-prompt-submit": "작업을 시작하기 전에 항상 CLAUDE.md 파일을 읽고 참조하세요"
}
}

9
unimarc/.cursorignore Normal file
View File

@@ -0,0 +1,9 @@
# 이 파일들은 항상 컨텍스트에 포함
!CLAUDE.md
!.claude/settings.local.json
# 제외할 파일들
bin/
obj/
*.dll
*.pdb

1
unimarc/.cursorrules Normal file
View File

@@ -0,0 +1 @@
CLAUDE.md 파일을 참조하여 답변하세요

48
unimarc/CLAUDE.md Normal file
View File

@@ -0,0 +1,48 @@
# ⚠️ 중요: 대화 시작시 이 파일을 반드시 읽으세요!
# 답변은 가급적이면 한글로!
# UniMarc 프로젝트 - Claude 작업 가이드
> **Claude에게**: 대화를 시작할 때마다 이 파일을 먼저 읽어서 프로젝트 컨텍스트를 파악하세요.
## 프로젝트 개요
- **프로젝트명**: UniMarc (도서관 자료 관리 시스템)
- **기술스택**: C# WinForms, .NET Framework 4.7.2
- **데이터베이스**: MySQL
- **주요기능**: 마크 작성, 복본조사, DLS 연동, 도서 정보 관리
## 코딩 컨벤션
- 파일명: PascalCase (예: DLS_Copy.cs)
- 클래스명: PascalCase
- 메서드명: PascalCase
- 변수명: camelCase
- 상수명: UPPER_CASE
## 주요 디렉토리 구조
- `/마크/`: 마크 관련 폼들
- `/납품관리/`: 납품 관리 관련 폼들
- `/마스터/`: 마스터 데이터 관리 폼들
- `/홈/`: 메인 화면 관련 폼들
- `/회계/`: 회계 관련 폼들
## 개발 시 주의사항
1. WebView2 사용 시 async/await 패턴 적용
2. 데이터베이스 연결은 Helper_DB 클래스 사용
3. 에러 처리는 try-catch 블록으로 처리
4. 한글 주석 사용
## 빌드 및 배포
- Visual Studio 2019 이상 필요
- NuGet 패키지 복원 후 빌드
- WebView2 런타임 필요
- NetFX 프로젝트이므로 dotnet 명령은 사용 불가
## MsBuild 실행파일 위치 (경로에 공백이 있으니 쌍따옴표로 감싸야 함)
## 매개변수 입력할때 platform 은 제거하고 그냥 프로젝트명만 입력
F:\(VHD) Program Files\Microsoft Visual Studio\2022\MSBuild\Current\Bin\msbuild.exe
## 프로젝트 파일명
UniMarc.csproj
## Webview2 Fixed Version 다운로드 주소
https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/759b508a-00bb-4724-9b87-2703c8417737/Microsoft.WebView2.FixedVersionRuntime.139.0.3405.86.x86.cab

51
unimarc/README.md Normal file
View File

@@ -0,0 +1,51 @@
# UniMarc - 도서관 자료 관리 시스템
## 📋 프로젝트 개요
- **프로젝트명**: UniMarc
- **목적**: 도서관 자료 관리 시스템
- **기술스택**: C# WinForms, .NET Framework 4.7.2
- **데이터베이스**: MySQL
- **주요기능**: 마크 작성, 복본조사, DLS 연동, 도서 정보 관리
## 🛠️ 개발 환경
- Visual Studio 2019 이상
- .NET Framework 4.7.2
- WebView2 Runtime
- MySQL 데이터베이스
## 📁 디렉토리 구조
```
unimarc/
├── 마크/ # 마크 관련 폼들
├── 납품관리/ # 납품 관리 관련 폼들
├── 마스터/ # 마스터 데이터 관리 폼들
├── 홈/ # 메인 화면 관련 폼들
├── 회계/ # 회계 관련 폼들
├── 편의기능/ # 편의 기능들
└── 작업일지/ # 작업 일지 관련
```
## 🔧 빌드 방법
```cmd
# MSBuild 사용
"F:\(VHD) Program Files\Microsoft Visual Studio\2022\MSBuild\Current\Bin\MSBuild.exe" UniMarc.csproj
```
## ⚠️ 중요 주의사항
1. **MSBuild 경로**: 공백이 포함되어 있어 쌍따옴표 필수
2. **WebView2**: async/await 패턴 적용 필요
3. **데이터베이스**: Helper_DB 클래스 사용
4. **에러 처리**: try-catch 블록 필수
5. **한글 주석** 사용
## 📝 코딩 컨벤션
- 파일명: PascalCase
- 클래스명: PascalCase
- 메서드명: PascalCase
- 변수명: camelCase
- 상수명: UPPER_CASE
## 🔄 최근 주요 변경사항
- DLS_Copy.cs: webBrowser1 → WebView2로 교체
- NuGet.Config: HTTPS 소스로 변경
- System.Runtime.CompilerServices.Unsafe 버전 충돌 해결

View File

@@ -9,6 +9,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Factory_Client", "Factory_C
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "UniMarcSetup", "UniMarcSetup\UniMarcSetup.vdproj", "{B0A88F76-DC68-44F9-90B4-CD94625CC1F4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "솔루션 항목", "솔루션 항목", "{2A3A057F-5D22-31FD-628C-DF5EF75AEF1E}"
ProjectSection(SolutionItems) = preProject
CLAUDE.md = CLAUDE.md
.claude\settings.local.json = .claude\settings.local.json
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU

View File

@@ -0,0 +1,10 @@
{
"permissions": {
"allow": [
"Bash(\"F:\\(VHD) Program Files\\Microsoft Visual Studio\\2022\\MSBuild\\Current\\Bin\\msbuild.exe\" \"UniMarc.csproj\")",
"Bash(\"F:\\(VHD) Program Files\\Microsoft Visual Studio\\2022\\MSBuild\\Current\\Bin\\msbuild.exe\" \"UniMarc.csproj\")",
"Bash(\"F:\\(VHD) Program Files\\Microsoft Visual Studio\\2022\\MSBuild\\Current\\Bin\\msbuild.exe\" \"UniMarc.csproj\")"
],
"deny": []
}
}

23
unimarc/unimarc/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,23 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "UniMarc Debug (.NET Framework)",
"type": "clr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/bin/Debug/UniMarc.exe",
"args": [],
"cwd": "${workspaceFolder}",
"console": "internalConsole",
"stopAtEntry": false,
"enableStepFiltering": false
},
{
"name": "UniMarc Attach (.NET Framework)",
"type": "clr",
"request": "attach",
"processName": "UniMarc.exe"
}
]
}

3
unimarc/unimarc/.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"dotnet.preferCSharpExtension": true
}

50
unimarc/unimarc/.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,50 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "\"F:\\(VHD) Program Files\\Microsoft Visual Studio\\2022\\MSBuild\\Current\\Bin\\msbuild.exe\"",
"type": "process",
"args": [
"UniMarc.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"group": "build",
"presentation": {
"reveal": "always"
},
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "msbuild",
"type": "process",
"args": [
"UniMarc.csproj",
"/p:Configuration=Release",
"/p:PublishProfile=FolderProfile"
],
"group": "build",
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "msbuild",
"type": "process",
"args": [
"UniMarc.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"group": "build",
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
}
]
}

View File

@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="UniMarc.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /></startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
@@ -18,19 +18,31 @@
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://testws.baroservice.com/FAX.asmx" binding="basicHttpBinding"
bindingConfiguration="BaroService_FAXSoap" contract="BaroService_API.BaroService_FAXSoap"
name="BaroService_FAXSoap" />
<endpoint address="https://testws.baroservice.com/TI.asmx" binding="basicHttpBinding"
bindingConfiguration="BaroService_TISoap" contract="BaroService_TI.BaroService_TISoap"
name="BaroService_TISoap" />
<endpoint address="http://testws.baroservice.com/FAX.asmx" binding="basicHttpBinding" bindingConfiguration="BaroService_FAXSoap" contract="BaroService_API.BaroService_FAXSoap" name="BaroService_FAXSoap" />
<endpoint address="https://testws.baroservice.com/TI.asmx" binding="basicHttpBinding" bindingConfiguration="BaroService_TISoap" contract="BaroService_TI.BaroService_TISoap" name="BaroService_TISoap" />
</client>
</system.serviceModel>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Renci.SshNet" publicKeyToken="1cee9f8bde3db106" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2020.0.1.0" newVersion="2020.0.1.0"/>
<assemblyIdentity name="Renci.SshNet" publicKeyToken="1cee9f8bde3db106" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2020.0.1.0" newVersion="2020.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>

View File

@@ -131,7 +131,9 @@
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.IPText = new System.Windows.Forms.ToolStripLabel();
this.lblStatus = new System.Windows.Forms.ToolStripLabel();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.2 = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout();
this.panel1.SuspendLayout();
this.toolStrip1.SuspendLayout();
@@ -170,28 +172,28 @@
// 사업체정보
//
this..Name = "사업체정보";
this..Size = new System.Drawing.Size(175, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "사업체 정보";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 사용자관리
//
this..Name = "사용자관리";
this..Size = new System.Drawing.Size(175, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "사용자 관리";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 납품거래처관리
//
this..Name = "납품거래처관리";
this..Size = new System.Drawing.Size(175, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "납품 / 거래처 관리";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 주문처관리
//
this..Name = "주문처관리";
this..Size = new System.Drawing.Size(175, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "주문처 관리";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -199,14 +201,14 @@
//
this..Enabled = false;
this..Name = "비밀번호변경";
this..Size = new System.Drawing.Size(175, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "비밀번호 변경";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 도서정보관리
//
this..Name = "도서정보관리";
this..Size = new System.Drawing.Size(175, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "도서정보 관리";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -214,7 +216,7 @@
//
this..Enabled = false;
this..Name = "사용대장";
this..Size = new System.Drawing.Size(175, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "사용대장";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -235,49 +237,49 @@
// 목록등록
//
this..Name = "목록등록";
this..Size = new System.Drawing.Size(166, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "물품등록";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 목록조회
//
this..Name = "목록조회";
this..Size = new System.Drawing.Size(166, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "목록조회";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 목록집계
//
this..Name = "목록집계";
this..Size = new System.Drawing.Size(166, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "목록집계";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 주문입력
//
this..Name = "주문입력";
this..Size = new System.Drawing.Size(166, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "주문입력";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 입고작업
//
this..Name = "입고작업";
this..Size = new System.Drawing.Size(166, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "입고작업";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 재고입력및조회
//
this..Name = "재고입력및조회";
this..Size = new System.Drawing.Size(166, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "재고입력 및 조회";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 반품처리
//
this..Name = "반품처리";
this..Size = new System.Drawing.Size(166, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "반품처리";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -296,14 +298,14 @@
// 송금내역조회
//
this..Name = "송금내역조회";
this..Size = new System.Drawing.Size(154, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "송금 내역 조회";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 송금등록
//
this..Name = "송금등록";
this..Size = new System.Drawing.Size(154, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "송금 등록";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -314,7 +316,7 @@
this.,
this.ToolStripMenuItem});
this..Name = "매입";
this..Size = new System.Drawing.Size(154, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "매입";
//
// 매입집계
@@ -347,7 +349,7 @@
this.,
this.});
this..Name = "매출";
this..Size = new System.Drawing.Size(154, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "매출";
//
// 매출입력
@@ -381,7 +383,7 @@
// 파트타임관리
//
this..Name = "파트타임관리";
this..Size = new System.Drawing.Size(154, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "파트타임 관리";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -407,13 +409,13 @@
this.,
this.});
this..Name = "마크설정";
this..Size = new System.Drawing.Size(156, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "설정";
//
// 단축키설정
//
this..Name = "단축키설정";
this..Size = new System.Drawing.Size(138, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "단축키";
this..Visible = false;
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
@@ -421,14 +423,14 @@
// 매크로문구
//
this..Name = "매크로문구";
this..Size = new System.Drawing.Size(138, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "매크로 문구";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 불용어
//
this..Name = "불용어";
this..Size = new System.Drawing.Size(138, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "불용어";
this..Visible = false;
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
@@ -436,7 +438,7 @@
// 작업지시서
//
this..Name = "작업지시서";
this..Size = new System.Drawing.Size(138, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "작업지시서";
this..Visible = false;
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
@@ -449,50 +451,51 @@
this.,
this.,
this.1,
this.2,
this.iSBN조회});
this..Name = "마크작업";
this..Size = new System.Drawing.Size(156, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "마크 작업";
//
// 마크작성
//
this..Name = "마크작성";
this..Size = new System.Drawing.Size(146, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "마크 작성";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 마크목록
//
this..Name = "마크목록";
this..Size = new System.Drawing.Size(146, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "마크 목록";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 소장자료검색
//
this..Name = "소장자료검색";
this..Size = new System.Drawing.Size(146, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "소장자료검색";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 마크정리
//
this..Name = "마크정리";
this..Size = new System.Drawing.Size(146, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "마크 정리";
this..Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 복본조사1
//
this.1.Name = "복본조사1";
this.1.Size = new System.Drawing.Size(146, 22);
this.1.Size = new System.Drawing.Size(180, 22);
this.1.Text = "복본조사";
this.1.Click += new System.EventHandler(this.ToolStripMenuItem1_Click);
//
// iSBN조회
//
this.iSBN조회.Name = "iSBN조회";
this.iSBN조회.Size = new System.Drawing.Size(146, 22);
this.iSBN조회.Size = new System.Drawing.Size(180, 22);
this.iSBN조회.Text = "ISBN 조회";
this.iSBN조회.Click += new System.EventHandler(this.iSBN조회ToolStripMenuItem_Click);
//
@@ -502,7 +505,7 @@
this.,
this.});
this.dVDCDLPToolStripMenuItem.Name = "dVDCDLPToolStripMenuItem";
this.dVDCDLPToolStripMenuItem.Size = new System.Drawing.Size(156, 22);
this.dVDCDLPToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.dVDCDLPToolStripMenuItem.Text = "DVD / CD / LP";
//
// 목록
@@ -526,7 +529,7 @@
this.,
this.});
this..Name = "반입및반출";
this..Size = new System.Drawing.Size(156, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "반입 및 반출";
//
// 마크반입
@@ -551,7 +554,7 @@
this.,
this.});
this..Name = "부가기능";
this..Size = new System.Drawing.Size(156, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "부가기능";
//
// 마크수집
@@ -592,7 +595,7 @@
this.DLS조회,
this.dLS복본조사});
this.DLS.Name = "DLS";
this.DLS.Size = new System.Drawing.Size(156, 22);
this.DLS.Size = new System.Drawing.Size(180, 22);
this.DLS.Text = "DLS";
//
// DLS조회
@@ -616,7 +619,7 @@
this.,
this.});
this..Name = "마크기타";
this..Size = new System.Drawing.Size(156, 22);
this..Size = new System.Drawing.Size(180, 22);
this..Text = "기타";
//
// 서류작성
@@ -761,48 +764,48 @@
this.ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripMenuItem});
this.ToolStripMenuItem.Name = "이용자관리ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.ToolStripMenuItem.Text = "이용자 관리";
//
// 신규사업자등록ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "신규사업자등록ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.ToolStripMenuItem.Text = "사업자 관리";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 공지발송ToolStripMenuItem1
//
this.ToolStripMenuItem1.Name = "공지발송ToolStripMenuItem1";
this.ToolStripMenuItem1.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItem1.Size = new System.Drawing.Size(178, 22);
this.ToolStripMenuItem1.Text = "공지 발송";
this.ToolStripMenuItem1.Click += new System.EventHandler(this.ToolStripMenuItem1_Click);
//
// 매출내역ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "매출내역ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.ToolStripMenuItem.Text = "매출내역";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 이용자거래처조회ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "이용자거래처조회ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.ToolStripMenuItem.Text = "이용자 거래처 조회";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 마크설정ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "마크설정ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.ToolStripMenuItem.Text = "마크설정";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 일괄처리관리ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "일괄처리관리ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
this.ToolStripMenuItem.Text = "일괄처리 관리";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -1008,7 +1011,8 @@
this.botUserLabel,
this.toolStripSeparator2,
this.toolStripSeparator3,
this.IPText});
this.IPText,
this.lblStatus});
this.toolStrip1.Location = new System.Drawing.Point(0, 681);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(1259, 25);
@@ -1057,6 +1061,19 @@
this.IPText.Size = new System.Drawing.Size(154, 22);
this.IPText.Text = "접속 아이피 : 0.000.00.000";
//
// lblStatus
//
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(27, 22);
this.lblStatus.Text = "WD";
//
// 복본조사2
//
this.2.Name = "복본조사2";
this.2.Size = new System.Drawing.Size(180, 22);
this.2.Text = "복본조사(New)";
this.2.Click += new System.EventHandler(this.2_Click);
//
// Main
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
@@ -1188,5 +1205,7 @@
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
public System.Windows.Forms.ToolStripLabel IPText;
private System.Windows.Forms.ToolStripLabel lblStatus;
private System.Windows.Forms.ToolStripMenuItem 2;
}
}

View File

@@ -27,6 +27,7 @@ using UniMarc.마크;
using UniMarc.Properties;
using UniMarc;
namespace WindowsFormsApp1
{
public partial class Main : Form
@@ -36,18 +37,23 @@ namespace WindowsFormsApp1
public string DB_User_Data;
public string User;
public string com_idx;
public Main()
{
InitializeComponent();
}
public string User_Name { get; internal set; }
private void Main_Load(object sender, EventArgs e)
{
this.Visible = false; // 메인폼을 먼저 숨김
#region "Log setting"
var logsubdir = "{yyyy|MM|dd}";
string tPath = string.Format("{0}\\LOG", AppDomain.CurrentDomain.BaseDirectory).Replace("\\\\", "\\"); ;
@@ -58,10 +64,12 @@ namespace WindowsFormsApp1
login login = new login();
VersionText.Text = string.Format("UniMarc Ver.{0}", ip.VersionInfo());
if (DialogResult.OK == login.ShowDialog(this)) {
if (DialogResult.OK == login.ShowDialog(this))
{
this.Visible = true;
}
else {
else
{
this.Close();
}
@@ -99,13 +107,48 @@ namespace WindowsFormsApp1
SetBtnName();
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
UpdaterCheck();
}
/// <summary>
/// factory client update checkd
/// </summary>
static void UpdaterCheck()
{
var fi = new System.IO.FileInfo("_Factory_Client.exe");
var fio = new System.IO.FileInfo("Factory_Client.exe");
if (fi.Exists)
{
if (fio.Exists == false)
{
fi.CopyTo(fio.FullName);
fio.LastWriteTime = fi.LastWriteTime;
fio.LastAccessTime = fi.LastAccessTime;
}
else
{
//check size
if (fi.Length != fio.Length || fi.LastWriteTime != fio.LastWriteTime)
{
fi.CopyTo(fio.FullName, true);
fio.LastWriteTime = fi.LastWriteTime;
fio.LastAccessTime = fi.LastAccessTime;
}
}
Console.WriteLine("updater patch");
}
}
#region
public void SetBtnName()
{
string Area =
string Area =
"`ShortCut1`, `ShortCut2`, `ShortCut3`, `ShortCut4`, `ShortCut5`, " +
"`ShortCut6`, `ShortCut7`, `ShortCut8`, `ShortCut9`, `ShortCut10`, " +
"`ShortCut11`, `ShortCut12`";
@@ -200,7 +243,7 @@ namespace WindowsFormsApp1
"송금내역조회", "송금등록", "매입 집계", "매입 장부", "매출 입력",
"매출 입금", "매출 조회", "매출 집계", "파트타임 관리" };
ToolStripMenuItem[] AccT = {
, , , , ,
, , , , ,
, , ,
};
ToolStripMenuItem[] TempAcc = {
@@ -216,7 +259,7 @@ namespace WindowsFormsApp1
"마크통계", "장비관리" };
ToolStripMenuItem[] MarcT = {
, , , , iSBN조회, , , ,
, 1, dLS복본조사, , ,
, 1, 2, dLS복본조사, , ,
, , DLS조회, ,
,
};
@@ -244,15 +287,17 @@ namespace WindowsFormsApp1
for (int a = 0; a < MenuTotal.Length; a++)
{
bool IsText = false;
for(int b = 0; b < MenuTotal[a].Length; b++)
for (int b = 0; b < MenuTotal[a].Length; b++)
{
if (MenuTotal[a][b] == btnText) {
if (MenuTotal[a][b] == btnText)
{
IsText = true;
count[1] = b;
break;
}
}
if (IsText) {
if (IsText)
{
count[0] = a;
break;
}
@@ -264,7 +309,8 @@ namespace WindowsFormsApp1
return;
// 권한설정으로 인한 리턴
if (!MenuCheckT[count[0]][count[1]].Enabled) {
if (!MenuCheckT[count[0]][count[1]].Enabled)
{
MessageBox.Show("권한이 설정되지 않았습니다!");
return;
}
@@ -684,7 +730,7 @@ namespace WindowsFormsApp1
Acc_purchase_Aggregation.Show();
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (Acc_purchase_Not_Pay != null)
@@ -700,7 +746,7 @@ namespace WindowsFormsApp1
Acc_purchase_Not_Pay.Show();
}
}
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
if (Acc_sales_Input != null)
@@ -942,11 +988,11 @@ namespace WindowsFormsApp1
//}
//else
//{
Mac_check_Copy = new Check_copy(this);
Mac_check_Copy.MdiParent = this;
Mac_check_Copy.WindowState = FormWindowState.Normal;
Mac_check_Copy.FormClosed += (o, ea) => Mac_check_Copy = null;
Mac_check_Copy.Show();
Mac_check_Copy = new Check_copy(this);
Mac_check_Copy.MdiParent = this;
Mac_check_Copy.WindowState = FormWindowState.Normal;
Mac_check_Copy.FormClosed += (o, ea) => Mac_check_Copy = null;
Mac_check_Copy.Show();
//}
//foreach (Form frm in Application.OpenForms)
@@ -1151,7 +1197,7 @@ namespace WindowsFormsApp1
DLS_school_Lookup.Show();
}
}
private void dLS복본조사ToolStripMenuItem_Click(object sender, EventArgs e)
async private void dLS복본조사ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (Mac_dLS_Copy != null)
{
@@ -1159,6 +1205,8 @@ namespace WindowsFormsApp1
}
else
{
var environment = await WebView2Installer.GetWebView2EnvironmentAsync();
Mac_dLS_Copy = new DLS_Copy(this);
Mac_dLS_Copy.MdiParent = this;
Mac_dLS_Copy.WindowState = FormWindowState.Maximized;
@@ -1502,5 +1550,14 @@ namespace WindowsFormsApp1
}
}
#endregion
private void 2_Click(object sender, EventArgs e)
{
var Mac_check_Copy = new Check_copyWD(this);
Mac_check_Copy.MdiParent = this;
Mac_check_Copy.WindowState = FormWindowState.Normal;
Mac_check_Copy.FormClosed += (o, ea) => Mac_check_Copy = null;
Mac_check_Copy.Show();
}
}
}

View File

@@ -16,39 +16,25 @@ namespace WindowsFormsApp1
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
DB_InitSetting();
UpdaterCheck();
//AR.UTIL.MsgE("unitmarc");
try
{
DB_InitSetting();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Application.Run(new Main());
}
/// <summary>
/// factory client update checkd
/// </summary>
static void UpdaterCheck()
{
var fi = new System.IO.FileInfo("_Factory_Client.exe");
var fio = new System.IO.FileInfo("Factory_Client.exe");
if (fi.Exists)
{
if (fio.Exists == false)
{
fi.CopyTo(fio.FullName);
fio.LastWriteTime = fi.LastWriteTime;
fio.LastAccessTime = fi.LastAccessTime;
}
else
{
//check size
if(fi.Length != fio.Length || fi.LastWriteTime != fio.LastWriteTime)
{
fi.CopyTo(fio.FullName,true);
fio.LastWriteTime = fi.LastWriteTime;
fio.LastAccessTime = fi.LastAccessTime;
}
}
Console.WriteLine("updater patch");
}
}
static void DB_InitSetting()
{
UniMarc.Properties.Settings.Default.IP = ConvertIP(UniMarc.Properties.Settings.Default.IP);

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
// 기본값으로 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.185")]
[assembly: AssemblyFileVersion("1.0.0.185")]
[assembly: AssemblyVersion("1.0.187.3")]
[assembly: AssemblyFileVersion("1.0.187.3")]

View File

@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
namespace BokBonCheck
{
public class BookSearchResult
{
public string SiteName { get; set; }
public int BookCount { get; set; }
public string SearchTerm { get; set; }
public DateTime SearchTime { get; set; }
public string ErrorMessage { get; set; }
public bool IsSuccess { get; set; }
}
public class BookSearchService
{
private readonly List<ILibrarySearcher> _searchers;
public BookSearchService()
{
_searchers = new List<ILibrarySearcher>
{
};
}
public async Task<List<BookSearchResult>> SearchBooksAsync(string searchTerm)
{
var results = new List<BookSearchResult>();
foreach (var searcher in _searchers)
{
searcher.StartDriver();
var result = await searcher.SearchAsync(searchTerm);
results.Add(result);
//searcher.StopDriver();
}
return results;
}
/// <summary>
/// Return Searcher
/// </summary>
/// <param name="no"></param>
/// <returns></returns>
public ILibrarySearcher Get(int no)
{
return _searchers.Where(t => t.No == no).FirstOrDefault();
}
public void AddSearcher(ILibrarySearcher searcher)
{
if (!_searchers.Any(s => s.SiteName == searcher.SiteName))
{
_searchers.Add(searcher);
}
}
public void RemoveSearcher(string siteName)
{
var searcher = _searchers.FirstOrDefault(s => s.SiteName == siteName);
if (searcher != null)
{
_searchers.Remove(searcher);
}
}
public List<string> GetAvailableSites()
{
return _searchers.Select(s => s.SiteName).ToList();
}
public void ClearSearchers()
{
_searchers.Clear();
}
}
}

View File

@@ -0,0 +1,378 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using WebDriverManager;
using WebDriverManager.DriverConfigs.Impl;
using System.Reflection;
using System.Net.Http;
using System.Threading;
using System.IO.Compression;
namespace BokBonCheck
{
public static class ChromeDriverManager
{
private static string _driverPath = null;
public static async Task<string> SetupChromeDriverAsync(DownloadProgressForm progressForm = null)
{
try
{
// Chrome 버전 확인
var chromeVersion = GetChromeVersion();
Console.WriteLine($"설치된 Chrome 버전: {chromeVersion}");
if (progressForm != null)
{
progressForm.UpdateProgress(10, $"Chrome 버전 확인 중... ({chromeVersion})");
}
// 기존 드라이버 경로 확인
var existingDriverPath = GetExistingDriverPath();
if (!string.IsNullOrEmpty(existingDriverPath) && File.Exists(existingDriverPath))
{
Console.WriteLine($"기존 드라이버 발견: {existingDriverPath}");
// 기존 드라이버 테스트
if (await TestExistingDriver(existingDriverPath))
{
if (progressForm != null)
{
progressForm.UpdateProgress(100, "기존 드라이버 사용");
progressForm.SetCompleted("기존 드라이버를 사용합니다.");
}
_driverPath = existingDriverPath;
Environment.SetEnvironmentVariable("webdriver.chrome.driver", existingDriverPath);
return existingDriverPath;
}
else
{
Console.WriteLine("기존 드라이버 테스트 실패 - 새로 다운로드");
// 기존 드라이버가 작동하지 않으면 삭제
try
{
File.Delete(existingDriverPath);
Console.WriteLine("기존 드라이버 삭제됨");
}
catch (Exception ex)
{
Console.WriteLine($"기존 드라이버 삭제 실패: {ex.Message}");
}
}
}
if (progressForm != null)
{
progressForm.UpdateProgress(30, "Chrome 버전에 맞는 드라이버 다운로드 중...");
}
// WebDriverManager를 사용하여 설치된 Chrome 버전에 맞는 드라이버 다운로드
var driverManager = new DriverManager();
var driverPath = driverManager.SetUpDriver(new ChromeConfig(), "MatchingBrowser");
// 다운로드된 드라이버 경로 저장
_driverPath = driverPath;
// 환경 변수 설정
Environment.SetEnvironmentVariable("webdriver.chrome.driver", driverPath);
if (progressForm != null)
{
progressForm.UpdateProgress(100, "드라이버 다운로드 완료");
progressForm.SetCompleted("드라이버 다운로드 완료!");
}
Console.WriteLine($"ChromeDriver 경로: {driverPath}");
Console.WriteLine($"환경 변수 설정: webdriver.chrome.driver = {driverPath}");
return driverPath;
}
catch (Exception ex)
{
Console.WriteLine($"ChromeDriver 설정 오류: {ex.Message}");
if (progressForm != null)
{
progressForm.SetError($"설정 오류: {ex.Message}");
}
throw;
}
}
private static string GetExistingDriverPath()
{
try
{
// 환경 변수에서 확인
var envPath = Environment.GetEnvironmentVariable("webdriver.chrome.driver");
if (!string.IsNullOrEmpty(envPath) && File.Exists(envPath))
{
return envPath;
}
// WebDriverManager 캐시 폴더에서 확인
var cachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
".cache", "selenium");
if (Directory.Exists(cachePath))
{
var chromeDriverFiles = Directory.GetFiles(cachePath, "chromedriver*", SearchOption.AllDirectories);
foreach (var file in chromeDriverFiles)
{
if (file.EndsWith(".exe") || !Path.HasExtension(file))
{
return file;
}
}
}
return null;
}
catch
{
return null;
}
}
public static string GetDriverPath()
{
return _driverPath;
}
private static string GetChromeVersion()
{
try
{
// Windows에서 Chrome 설치 경로 확인
var chromePaths = new[]
{
@"C:\Program Files\Google\Chrome\Application\chrome.exe",
@"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
@"Google\Chrome\Application\chrome.exe")
};
foreach (var path in chromePaths)
{
if (File.Exists(path))
{
var versionInfo = FileVersionInfo.GetVersionInfo(path);
var version = versionInfo.FileVersion;
Console.WriteLine($"Chrome 버전 감지: {version} (경로: {path})");
return version;
}
}
return "알 수 없음";
}
catch (Exception ex)
{
Console.WriteLine($"Chrome 버전 감지 실패: {ex.Message}");
return "확인 실패";
}
}
public static bool IsChromeInstalled()
{
try
{
var chromePaths = new[]
{
@"C:\Program Files\Google\Chrome\Application\chrome.exe",
@"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
@"Google\Chrome\Application\chrome.exe")
};
foreach (var path in chromePaths)
{
if (File.Exists(path))
{
return true;
}
}
return false;
}
catch
{
return false;
}
}
public static async Task<bool> TestChromeDriverAsync(DownloadProgressForm progressForm = null)
{
try
{
var driverPath = await SetupChromeDriverAsync(progressForm);
if (progressForm != null)
{
progressForm.UpdateProgress(50, "드라이버 테스트 중...");
}
// ChromeDriver 서비스 설정
var service = OpenQA.Selenium.Chrome.ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath));
service.HideCommandPromptWindow = true;
// 간단한 테스트 실행
var options = new OpenQA.Selenium.Chrome.ChromeOptions();
options.AddArgument("--headless");
options.AddArgument("--no-sandbox");
options.AddArgument("--disable-dev-shm-usage");
options.AddArgument("--disable-gpu");
options.AddArgument("--remote-debugging-port=0");
using (var driver = new OpenQA.Selenium.Chrome.ChromeDriver(service, options))
{
driver.Navigate().GoToUrl("https://www.google.com");
var title = driver.Title;
Console.WriteLine($"드라이버 테스트 성공: {title}");
if (progressForm != null)
{
progressForm.UpdateProgress(100, "드라이버 테스트 성공!");
progressForm.SetCompleted("드라이버 테스트 성공!");
}
return !string.IsNullOrEmpty(title);
}
}
catch (Exception ex)
{
Console.WriteLine($"ChromeDriver 테스트 실패: {ex.Message}");
if (progressForm != null)
{
progressForm.SetError($"테스트 실패: {ex.Message}");
}
return false;
}
}
public static void ClearDriverCache()
{
try
{
Console.WriteLine("Chrome 드라이버 캐시 정리 시작...");
// WebDriverManager 캐시 폴더 정리
var cachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
".cache", "selenium");
if (Directory.Exists(cachePath))
{
Directory.Delete(cachePath, true);
Console.WriteLine($"WebDriverManager 캐시 정리됨: {cachePath}");
}
// 환경 변수에서 설정된 드라이버 경로도 정리
var envDriverPath = Environment.GetEnvironmentVariable("webdriver.chrome.driver");
if (!string.IsNullOrEmpty(envDriverPath) && File.Exists(envDriverPath))
{
try
{
File.Delete(envDriverPath);
Console.WriteLine($"환경 변수 드라이버 삭제됨: {envDriverPath}");
}
catch (Exception ex)
{
Console.WriteLine($"환경 변수 드라이버 삭제 실패: {ex.Message}");
}
}
// 저장된 드라이버 경로도 정리
if (!string.IsNullOrEmpty(_driverPath) && File.Exists(_driverPath))
{
try
{
File.Delete(_driverPath);
Console.WriteLine($"저장된 드라이버 삭제됨: {_driverPath}");
}
catch (Exception ex)
{
Console.WriteLine($"저장된 드라이버 삭제 실패: {ex.Message}");
}
}
_driverPath = null;
Environment.SetEnvironmentVariable("webdriver.chrome.driver", null);
Console.WriteLine("Chrome 드라이버 캐시 정리 완료");
}
catch (Exception ex)
{
Console.WriteLine($"캐시 정리 실패: {ex.Message}");
}
}
public static bool IsDriverReady()
{
try
{
var driverPath = GetExistingDriverPath();
if (string.IsNullOrEmpty(driverPath) || !File.Exists(driverPath))
{
Console.WriteLine("기존 드라이버가 없습니다.");
return false;
}
Console.WriteLine($"드라이버 준비 상태 확인: {driverPath}");
// 간단한 테스트 실행
var service = OpenQA.Selenium.Chrome.ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath));
service.HideCommandPromptWindow = true;
var options = new OpenQA.Selenium.Chrome.ChromeOptions();
options.AddArgument("--headless");
options.AddArgument("--no-sandbox");
options.AddArgument("--disable-dev-shm-usage");
options.AddArgument("--disable-gpu");
options.AddArgument("--remote-debugging-port=0");
using (var driver = new OpenQA.Selenium.Chrome.ChromeDriver(service, options))
{
driver.Navigate().GoToUrl("https://www.google.com");
var result = !string.IsNullOrEmpty(driver.Title);
Console.WriteLine($"드라이버 준비 상태: {(result ? "" : "")}");
return result;
}
}
catch (Exception ex)
{
Console.WriteLine($"드라이버 준비 상태 확인 실패: {ex.Message}");
return false;
}
}
private static async Task<bool> TestExistingDriver(string driverPath)
{
try
{
Console.WriteLine($"기존 드라이버 테스트: {driverPath}");
// ChromeDriver 서비스 설정
var service = OpenQA.Selenium.Chrome.ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath));
service.HideCommandPromptWindow = true;
// 간단한 테스트 실행
var options = new OpenQA.Selenium.Chrome.ChromeOptions();
options.AddArgument("--headless");
options.AddArgument("--no-sandbox");
options.AddArgument("--disable-dev-shm-usage");
options.AddArgument("--disable-gpu");
options.AddArgument("--remote-debugging-port=0");
using (var driver = new OpenQA.Selenium.Chrome.ChromeDriver(service, options))
{
driver.Navigate().GoToUrl("https://www.google.com");
var title = driver.Title;
Console.WriteLine($"드라이버 테스트 성공: {title}");
return !string.IsNullOrEmpty(title);
}
}
catch (Exception ex)
{
Console.WriteLine($"기존 드라이버 테스트 실패: {ex.Message}");
return false;
}
}
}
}

View File

@@ -0,0 +1,142 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading.Tasks;
namespace BokBonCheck
{
public partial class DownloadProgressForm : Form
{
private ProgressBar progressBar;
private Label lblStatus;
private Label lblProgress;
private Button btnCancel;
private bool isCancelled = false;
public DownloadProgressForm()
{
InitializeComponent();
this.StartPosition = FormStartPosition.CenterScreen;
}
private void InitializeComponent()
{
this.Text = "Chrome 드라이버 다운로드";
this.Size = new Size(400, 150);
this.StartPosition = FormStartPosition.CenterParent;
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.ControlBox = false;
this.TopMost = true;
// 상태 라벨
lblStatus = new Label
{
Text = "Chrome 드라이버를 확인하고 있습니다...",
Location = new Point(20, 20),
Size = new Size(360, 20),
Font = new Font("맑은 고딕", 9),
TextAlign = ContentAlignment.MiddleCenter
};
// 진행률 라벨
lblProgress = new Label
{
Text = "0%",
Location = new Point(20, 50),
Size = new Size(360, 20),
Font = new Font("맑은 고딕", 10, FontStyle.Bold),
TextAlign = ContentAlignment.MiddleCenter,
ForeColor = Color.Blue
};
// 프로그레스 바
progressBar = new ProgressBar
{
Location = new Point(20, 80),
Size = new Size(360, 25),
Style = ProgressBarStyle.Continuous,
Minimum = 0,
Maximum = 100,
Value = 0
};
// 취소 버튼
btnCancel = new Button
{
Text = "취소",
Location = new Point(150, 115),
Size = new Size(100, 30),
Font = new Font("맑은 고딕", 9),
BackColor = Color.LightCoral
};
btnCancel.Click += BtnCancel_Click;
// 컨트롤 추가
this.Controls.AddRange(new Control[]
{
lblStatus, lblProgress, progressBar, btnCancel
});
}
private void BtnCancel_Click(object sender, EventArgs e)
{
isCancelled = true;
btnCancel.Enabled = false;
lblStatus.Text = "취소 중...";
}
public bool IsCancelled => isCancelled;
public void UpdateProgress(int percentage, string status = null)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<int, string>(UpdateProgress), percentage, status);
return;
}
progressBar.Value = Math.Min(percentage, 100);
lblProgress.Text = $"{percentage}%";
if (!string.IsNullOrEmpty(status))
{
lblStatus.Text = status;
}
}
public void SetCompleted(string message = "다운로드 완료!")
{
if (this.InvokeRequired)
{
this.Invoke(new Action<string>(SetCompleted), message);
return;
}
progressBar.Value = 100;
lblProgress.Text = "100%";
lblStatus.Text = message;
btnCancel.Text = "확인";
btnCancel.BackColor = Color.LightGreen;
btnCancel.Enabled = true;
}
public void SetError(string errorMessage)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<string>(SetError), errorMessage);
return;
}
lblStatus.Text = "오류 발생";
lblProgress.Text = "실패";
lblProgress.ForeColor = Color.Red;
btnCancel.Text = "확인";
btnCancel.BackColor = Color.LightCoral;
btnCancel.Enabled = true;
}
}
}

View File

@@ -0,0 +1,17 @@
using OpenQA.Selenium.Support.UI;
using System.Threading.Tasks;
namespace BokBonCheck
{
public interface ILibrarySearcher
{
int No { get; set; }
string SiteName { get; }
string SiteUrl { get; }
Task<BookSearchResult> SearchAsync(string searchTerm);
void StartDriver();
void StopDriver();
Task WaitForPageChange(WebDriverWait wait);
}
}

View File

@@ -0,0 +1,322 @@
using System;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System.Text.RegularExpressions;
using WebDriverManager;
using WebDriverManager.DriverConfigs.Impl;
using System.IO;
using System.Runtime.InteropServices;
namespace BokBonCheck
{
public class KwangjuCityLibrarySearcher_choisangjun : KwangjuCityLibrarySearcher
{
public KwangjuCityLibrarySearcher_choisangjun(int no) : base(no)
{
SelectorValue = "MF";
SiteName = "광주시교육청통합도서관(분관최상준도서관)";
}
}
public class KwangjuCityLibrarySearcher_dagachi : KwangjuCityLibrarySearcher
{
public KwangjuCityLibrarySearcher_dagachi(int no) : base(no)
{
SelectorValue = "ME";
SiteName = "광주시교육청통합도서관(송정다가치문화도서관)";
}
}
public class KwangjuCityLibrarySearcher_central : KwangjuCityLibrarySearcher
{
public KwangjuCityLibrarySearcher_central(int no) : base(no)
{
SelectorValue = "MD";
SiteName = "광주시교육청통합도서관(중앙도서관)";
}
}
public class KwangjuCityLibrarySearcher_Student : KwangjuCityLibrarySearcher
{
public KwangjuCityLibrarySearcher_Student(int no) : base(no)
{
SelectorValue = "MC";
SiteName = "광주시교육청통합도서관(학생교육문화회관)";
}
}
public class KwangjuCityLibrarySearcher_Kumho : KwangjuCityLibrarySearcher
{
public KwangjuCityLibrarySearcher_Kumho(int no) : base(no)
{
SelectorValue = "MB";
SiteName = "광주시교육청통합도서관(금호평생교육관)";
}
}
public class KwangjuCityLibrarySearcher_Indi : KwangjuCityLibrarySearcher
{
public KwangjuCityLibrarySearcher_Indi(int no) : base(no)
{
SelectorValue = "MA";
SiteName = "광주시교육청통합도서관(학생독립운동기념회관)";
}
}
public abstract class KwangjuCityLibrarySearcher : ILibrarySearcher
{
public int No { get; set; }
public string SiteName { get; protected set; } = "광주시교육청통합도서관";
public string SiteUrl => "https://lib.gen.go.kr/main/site/search/bookSearch.do#simple";
protected string SelectorValue = "";
private ChromeDriver _driver;
private ChromeDriverService _service;
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_MINIMIZE = 6;
public KwangjuCityLibrarySearcher(int no)
{
this.No = no;
}
public void StartDriver()
{
if (_driver == null)
{
var driverPath = ChromeDriverManager.GetDriverPath();
if (string.IsNullOrEmpty(driverPath) || !File.Exists(driverPath))
{
driverPath = ChromeDriverManager.SetupChromeDriverAsync().GetAwaiter().GetResult();
}
_service = ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath), Path.GetFileName(driverPath));
_service.HideCommandPromptWindow = true;
var options = new ChromeOptions();
options.AddArgument("--no-sandbox");
options.AddArgument("--disable-dev-shm-usage");
options.AddArgument("--disable-gpu");
options.AddArgument("--window-size=640,700");
options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
options.AddArgument("--disable-blink-features=AutomationControlled");
options.AddExcludedArgument("enable-automation");
options.AddAdditionalOption("useAutomationExtension", false);
_driver = new ChromeDriver(_service, options);
((IJavaScriptExecutor)_driver).ExecuteScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
}
}
public void StopDriver()
{
if (_driver != null)
{
_driver.Quit();
_driver.Dispose();
_driver = null;
}
if (_service != null)
{
_service.Dispose();
_service = null;
}
}
virtual protected void SelectLibrary(WebDriverWait wait)
{
try
{
// 콤보박스(select) 요소 찾기
var selectElement = wait.Until(d => d.FindElement(By.CssSelector("#manage_code")));
var select = new OpenQA.Selenium.Support.UI.SelectElement(selectElement);
// value가 "MA"인 옵션 선택
select.SelectByValue(SelectorValue);
}
catch
{
// 예외 처리 (필요시 로깅 등)
}
}
public async Task<BookSearchResult> SearchAsync(string searchTerm)
{
var result = new BookSearchResult
{
SiteName = SiteName,
SearchTerm = searchTerm,
SearchTime = DateTime.Now
};
try
{
if (_driver == null)
throw new InvalidOperationException("드라이버가 시작되지 않았습니다. StartDriver()를 먼저 호출하세요.");
_driver.Navigate().GoToUrl(SiteUrl);
// 페이지 로딩 대기
var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15));
// 모든 감지 방법이 끝나면 크롬창 최소화
// whale 브라우저가 최소화되어 우선해제
//IntPtr chromeWindow = FindWindow("Chrome_WidgetWin_1", null);
//if (chromeWindow != IntPtr.Zero)
//{
// ShowWindow(chromeWindow, SW_MINIMIZE);
//}
//대상도서관 선택
SelectLibrary(wait);
// 검색창 찾기
IWebElement searchBox = null;
try
{
// 여러 가능한 선택자 시도
var selectors = new[]
{
"input[id='search_txt']",
"input[type='text']",
};
foreach (var selector in selectors)
{
try
{
searchBox = wait.Until(d =>
{
var el = d.FindElement(By.CssSelector(selector));
return (el != null && el.Displayed && el.Enabled) ? el : null;
});
break;
}
catch
{
continue;
}
}
if (searchBox == null)
{
throw new Exception("검색창을 찾을 수 없습니다.");
}
}
catch (Exception ex)
{
throw new Exception($"검색창 찾기 실패: {ex.Message}");
}
// 혹시 readonly라면 속성 제거
((IJavaScriptExecutor)_driver).ExecuteScript("arguments[0].removeAttribute('readonly')", searchBox);
// 입력 전 clear
searchBox.Clear();
searchBox.SendKeys(searchTerm);
// 검색 버튼 클릭
IWebElement searchButton = null;
try
{
var buttonSelectors = new[]
{
"input[type='submit']",
};
foreach (var selector in buttonSelectors)
{
try
{
searchButton = _driver.FindElement(By.CssSelector(selector));
break;
}
catch
{
continue;
}
}
if (searchButton == null)
{
// Enter 키로 검색 시도
searchBox.SendKeys(Keys.Enter);
}
else
{
searchButton.Click();
}
}
catch (Exception ex)
{
// Enter 키로 검색 시도
searchBox.SendKeys(Keys.Enter);
}
// 페이지 변경을 감지하는 메서드
await WaitForPageChange(new WebDriverWait(_driver, TimeSpan.FromSeconds(15)));
// 검색 결과 수 추출
var resultCount = ExtractBookCount(_driver);
result.BookCount = resultCount;
result.IsSuccess = true;
}
catch (Exception ex)
{
result.IsSuccess = false;
result.ErrorMessage = ex.Message;
result.BookCount = 0;
}
return result;
}
private int ExtractBookCount(IWebDriver driver)
{
try
{
// div.search-result 내부의 span에서 '전체 N' 텍스트 추출
var resultDiv = driver.FindElement(By.CssSelector("div.ndls_result"));
var span = resultDiv.FindElement(By.XPath(".//span[contains(text(),'전체')]"));
string text = span.Text; // 예: "전체 5 "
var match = System.Text.RegularExpressions.Regex.Match(text, @"전체\s*(\d+)");
if (match.Success)
{
return int.Parse(match.Groups[1].Value);
}
return 0;
}
catch
{
return 0;
}
}
// 페이지 변경을 감지하는 메서드
public async Task WaitForPageChange(WebDriverWait wait)
{
try
{
// 방법 4: 페이지 로딩 상태 확인
wait.Until(d =>
{
var readyState = ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState");
return readyState.Equals("complete");
});
// 방법 5: 특정 텍스트가 페이지에 나타날 때까지 대기
wait.Until(d =>
{
var elm = d.FindElement(By.TagName("body"));
if (elm == null) return false;
var pageText = elm.Text;
return pageText.Contains("전체") || pageText.Contains("건") || pageText.Contains("검색결과");
});
}
catch (Exception ex)
{
// 모든 감지 방법이 실패하면 최소한의 대기 시간 적용
await Task.Delay(2000);
throw new Exception($"페이지 변경 감지 실패: {ex.Message}");
}
}
}
}

View File

@@ -0,0 +1,557 @@
using System;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System.Text.RegularExpressions;
using WebDriverManager;
using WebDriverManager.DriverConfigs.Impl;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
namespace BokBonCheck
{
public class NamguLibrarySearcher_Munhwa : NamguLibrarySearcher
{
public NamguLibrarySearcher_Munhwa(int no) : base(no)
{
SiteName = "남구통합도서관(문화정보도서관)"; // 문화관 검색기
}
protected override bool SelectLibrary(WebDriverWait wait)
{
IWebElement searchBox = null;
try
{
var selector = "#clickAll";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == true)
{
SafeClick(searchBox);
}
selector = "#libMA";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == false)
{
SafeClick(searchBox);
}
return true;
}
catch
{
return false;
}
}
}
public class NamguLibrarySearcher_Purungil : NamguLibrarySearcher
{
public NamguLibrarySearcher_Purungil(int no) : base(no)
{
SiteName = "남구통합도서관(푸른길도서관)";
}
protected override bool SelectLibrary(WebDriverWait wait)
{
IWebElement searchBox = null;
try
{
var selector = "#clickAll";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == true)
{
SafeClick(searchBox);
}
selector = "#libMB";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == false)
{
SafeClick(searchBox);
}
return true;
}
catch
{
return false;
}
}
}
public class NamguLibrarySearcher_Children : NamguLibrarySearcher
{
public NamguLibrarySearcher_Children(int no) : base(no)
{
SiteName = "남구통합도서관(청소년도서관)";
}
protected override bool SelectLibrary(WebDriverWait wait)
{
IWebElement searchBox = null;
try
{
var selector = "#clickAll";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == true)
{
SafeClick(searchBox);
}
selector = "#libMC";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == false)
{
//searchBox.Click(); // 체크박스 선택
SafeClick(searchBox);
}
return true;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
}
public class NamguLibrarySearcher_Hyocheon : NamguLibrarySearcher
{
public NamguLibrarySearcher_Hyocheon(int no) : base(no)
{
SiteName = "남구통합도서관(효천어울림도서관)";
}
protected override bool SelectLibrary(WebDriverWait wait)
{
IWebElement searchBox = null;
try
{
var selector = "#clickAll";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == true)
{
SafeClick(searchBox);
}
selector = "#libSW";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == false)
{
SafeClick(searchBox);
}
return true;
}
catch
{
return false;
}
}
}
public class NamguLibrarySearcher_Smart : NamguLibrarySearcher
{
public NamguLibrarySearcher_Smart(int no) : base(no)
{
SiteName = "남구통합도서관(스마트도서관)";
}
protected override bool SelectLibrary(WebDriverWait wait)
{
IWebElement searchBox = null;
try
{
var selector = "#clickAll";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if ( searchBox.Selected == true)
{
SafeClick(searchBox);
}
selector = "#libSQ";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == false)
{
SafeClick(searchBox);
}
return true;
}
catch
{
return false;
}
}
}
public class NamguLibrarySearcher : ILibrarySearcher
{
public string SiteName { get; protected set; } = "남구통합도서관(전체)";
public string SiteUrl => "https://lib.namgu.gwangju.kr/main/bookSearch";
public int No { get; set; }
private ChromeDriver _driver;
private ChromeDriverService _service;
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_MINIMIZE = 6;
public NamguLibrarySearcher(int no)
{
this.No = no;
}
public void StartDriver()
{
if (_driver == null)
{
var driverPath = ChromeDriverManager.GetDriverPath();
if (string.IsNullOrEmpty(driverPath) || !File.Exists(driverPath))
{
driverPath = ChromeDriverManager.SetupChromeDriverAsync().GetAwaiter().GetResult();
}
_service = ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath), Path.GetFileName(driverPath));
_service.HideCommandPromptWindow = true;
var options = new ChromeOptions();
options.AddArgument("--no-sandbox");
options.AddArgument("--disable-dev-shm-usage");
options.AddArgument("--disable-gpu");
options.AddArgument("--window-size=640,700");
options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
options.AddArgument("--disable-blink-features=AutomationControlled");
options.AddExcludedArgument("enable-automation");
options.AddAdditionalOption("useAutomationExtension", false);
_driver = new ChromeDriver(_service, options);
((IJavaScriptExecutor)_driver).ExecuteScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
}
}
public void StopDriver()
{
if (_driver != null)
{
_driver.Quit();
_driver.Dispose();
_driver = null;
}
if (_service != null)
{
_service.Dispose();
_service = null;
}
}
virtual protected bool SelectLibrary(WebDriverWait wait)
{
IWebElement searchBox = null;
try
{
var selector = "#clickAll";
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
if (searchBox == null) return false;
if (searchBox.Selected == false)
{
SafeClick(searchBox);
}
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
protected void SafeClick(IWebElement searchBox)
{
// 안정적인 클릭을 위한 여러 방법 시도
try
{
// 1. JavaScript로 클릭 시도
var driver = ((IWrapsDriver)searchBox).WrappedDriver;
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", searchBox);
}
catch
{
try
{
// 2. 요소가 보이도록 스크롤 후 클릭
var driver = ((IWrapsDriver)searchBox).WrappedDriver;
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", searchBox);
Thread.Sleep(500);
searchBox.Click();
}
catch
{
try
{
// 3. Actions 클래스 사용
var driver = ((IWrapsDriver)searchBox).WrappedDriver;
var actions = new OpenQA.Selenium.Interactions.Actions(driver);
actions.MoveToElement(searchBox).Click().Perform();
}
catch
{
// 4. 마지막 방법: JavaScript로 직접 체크 해제
var driver = ((IWrapsDriver)searchBox).WrappedDriver;
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].checked = false;", searchBox);
}
}
}
}
public async Task<BookSearchResult> SearchAsync(string searchTerm)
{
var result = new BookSearchResult
{
SiteName = SiteName,
SearchTerm = searchTerm,
SearchTime = DateTime.Now
};
try
{
if (_driver == null)
throw new InvalidOperationException("드라이버가 시작되지 않았습니다. StartDriver()를 먼저 호출하세요.");
_driver.Navigate().GoToUrl(SiteUrl);
// 페이지 로딩 대기
var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15));
// 모든 감지 방법이 끝나면 크롬창 최소화
// whale 브라우저가 최소화되어 우선해제
//IntPtr chromeWindow = FindWindow("Chrome_WidgetWin_1", null);
//if (chromeWindow != IntPtr.Zero)
//{
// ShowWindow(chromeWindow, SW_MINIMIZE);
//}
//대상도서관 선택
if(SelectLibrary(wait)==false)
{
result.ErrorMessage = "도서관선택실패";
result.BookCount = -1;
result.IsSuccess = false;
return result;
}
// 검색창 찾기 (남구통합도서관 사이트의 특정 선택자 사용)
IWebElement searchBox = null;
try
{
// 여러 가능한 선택자 시도
var selectors = new[]
{
"input[name='query']",
"input[id='query']",
"input[type='text']",
};
foreach (var selector in selectors)
{
try
{
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
break;
}
catch
{
continue;
}
}
if (searchBox == null)
{
throw new Exception("검색창을 찾을 수 없습니다.");
}
}
catch (Exception ex)
{
throw new Exception($"검색창 찾기 실패: {ex.Message}");
}
// 검색어 입력
searchBox.Clear();
searchBox.SendKeys(searchTerm);
// 검색 버튼 클릭
IWebElement searchButton = null;
try
{
var buttonSelectors = new[]
{
"button[type='submit']",
"input[type='submit']",
".search-btn",
".btn-search",
"button:contains('검색')",
"input[value*='검색']",
"button[class*='search']",
"input[class*='search']"
};
foreach (var selector in buttonSelectors)
{
try
{
searchButton = _driver.FindElement(By.CssSelector(selector));
break;
}
catch
{
continue;
}
}
if (searchButton == null)
{
// Enter 키로 검색 시도
searchBox.SendKeys(Keys.Enter);
}
else
{
searchButton.Click();
}
}
catch (Exception ex)
{
// Enter 키로 검색 시도
searchBox.SendKeys(Keys.Enter);
}
// 페이지 변경을 감지하는 메서드
await WaitForPageChange(new WebDriverWait(_driver, TimeSpan.FromSeconds(15)));
// 검색 결과 수 추출
var resultCount = ExtractBookCount(_driver, searchTerm, out string ermsg);
if (resultCount == -1)
{
result.BookCount = 0;
result.IsSuccess = false;
result.ErrorMessage = ermsg;
}
else
{
result.BookCount = resultCount;
result.IsSuccess = true;
result.ErrorMessage = ermsg;
}
}
catch (Exception ex)
{
result.IsSuccess = false;
result.ErrorMessage = ex.Message;
result.BookCount = 0;
}
return result;
}
private int ExtractBookCount(IWebDriver driver, string searchTerm, out string errmessage)
{
errmessage = string.Empty;
try
{
// div.search-result 내부의 span에서 '전체 N' 텍스트 추출
var resultDiv = driver.FindElement(By.CssSelector("div.search-result"));
var bodytext = resultDiv.Text;
if (bodytext.Contains("검색결과가 없습니다"))
{
errmessage = "검색결과없음";
return 0;
}
var searchkey = resultDiv.FindElement(By.XPath("//*[@id=\"sub\"]/section[3]/div/div/div/div/div[2]/div[1]/p/b"));
var searchtitle = searchkey.Text;
if (searchTerm.Contains(searchtitle) == false)
{
errmessage = $"검색어불일치({searchtitle}/{searchTerm})";
return -1;
}
var span = resultDiv.FindElement(By.XPath(".//span[contains(text(),'전체')]"));
string text = span.Text; // 예: "전체 5 "
var match = System.Text.RegularExpressions.Regex.Match(text, @"전체\s*(\d+)");
if (match.Success)
{
if(int.TryParse(match.Groups[1].Value,out int vqty)==false)
{
errmessage = $"수량값오류({match.Groups[1].Value})";
return -1;
}
else
{
searchTerm = string.Empty;
return vqty;
}
}
else
{
errmessage = "수량항목없음";
return -1;
}
}
catch (Exception ex)
{
errmessage = ex.Message;
return -1;
}
}
// 페이지 변경을 감지하는 메서드
public async Task WaitForPageChange(WebDriverWait wait)
{
try
{
await Task.Delay(500);
// 방법 4: 페이지 로딩 상태 확인
wait.Until(d =>
{
var readyState = ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState");
return readyState.Equals("complete");
});
// 방법 5: 특정 텍스트가 페이지에 나타날 때까지 대기
wait.Until(d =>
{
var pageText = d.FindElement(By.ClassName("search-result")).Text;
if (pageText.Contains("검색결과가 없습니다")) return true;
return pageText.Contains("에 대하여") && pageText.Contains("검색되었습니다");
});
}
catch (Exception ex)
{
// 모든 감지 방법이 실패하면 최소한의 대기 시간 적용
await Task.Delay(2000);
throw new Exception($"페이지 변경 감지 실패: {ex.Message}");
}
}
}
}

View File

@@ -63,7 +63,7 @@ namespace WindowsFormsApp1
else
dataGridView.Sort(dataGridView.Columns[col], System.ComponentModel.ListSortDirection.Ascending);
}
/// <summary>
/// * Row헤더에 체크박스를 넣는 기능*
@@ -99,7 +99,7 @@ namespace WindowsFormsApp1
}
private void datagridview_checkBox_Click(object sender, EventArgs e)
{
foreach(DataGridViewRow r in ((DataGridView)sender).Rows)
foreach (DataGridViewRow r in ((DataGridView)sender).Rows)
{
r.Cells["colCheck"].Value = ((CheckBox)sender).Checked;
}
@@ -127,8 +127,8 @@ namespace WindowsFormsApp1
//텝 공백 문자열 동시에 사용하여 분류
// stringInClipboard= stringInClipboard.Replace("\r", "");
if (stringInClipboard == null) return;
List<string>rowsInClipboard = stringInClipboard.Split(rowSpliteter, StringSplitOptions.None).ToList();
rowsInClipboard.RemoveAt(rowsInClipboard.Count-1);
List<string> rowsInClipboard = stringInClipboard.Split(rowSpliteter, StringSplitOptions.None).ToList();
rowsInClipboard.RemoveAt(rowsInClipboard.Count - 1);
//get the row and column of selected cell in dataGridView1
int r = ((DataGridView)sender).SelectedCells[0].RowIndex;
int c = ((DataGridView)sender).SelectedCells[0].ColumnIndex;
@@ -209,7 +209,7 @@ namespace WindowsFormsApp1
private Rectangle dragBoxFromMouseDown;
private int rowIndexFromMouseDown;
private int rowIndexOfItemUnderMouseToDrop;
public void MouseMove(object sender, MouseEventArgs e)
{
DataGridView dataGridView = sender as DataGridView;
@@ -292,7 +292,8 @@ namespace WindowsFormsApp1
string[] db_data = db_res1.Split('|');
string[] db_pur = db_res2.Split('|');
if (db_res1.Length < 3) {
if (db_res1.Length < 3)
{
MessageBox.Show("DB호출 에러!", "Error");
return "False";
}
@@ -300,20 +301,26 @@ namespace WindowsFormsApp1
string fax = string.Empty;
string emchk = string.Empty;
if (db_pur.Length > 3) {
for(int a= 0; a < db_pur.Length; a++)
if (db_pur.Length > 3)
{
for (int a = 0; a < db_pur.Length; a++)
{
if (a % 3 == 0) { // 전화번호
if (db_pur[a] != "") {
if (a % 3 == 0)
{ // 전화번호
if (db_pur[a] != "")
{
tel = db_pur[a];
}
}
if (a % 3 == 1) { // 팩스
if (db_pur[a] != "") {
if (a % 3 == 1)
{ // 팩스
if (db_pur[a] != "")
{
fax = db_pur[a];
}
}
if (a % 3 == 2) { // 팩스 이메일 체크
if (a % 3 == 2)
{ // 팩스 이메일 체크
emchk = db_pur[a];
}
}
@@ -401,7 +408,7 @@ namespace WindowsFormsApp1
#region / (4)
rng = ws.Range["A4", "C4"];
rng.MergeCells = true;
rng.Value2 = "주문일자 : "+DateTime.Now.ToString("yyyy-MM-dd H:m:ss");
rng.Value2 = "주문일자 : " + DateTime.Now.ToString("yyyy-MM-dd H:m:ss");
rng.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
rng.Font.Bold = true;
@@ -495,7 +502,7 @@ namespace WindowsFormsApp1
#region
endcount++;
string = "D"+endcount.ToString();
string = "D" + endcount.ToString();
rng = ws.Range["A" + endcount, "C" + endcount];
rng.MergeCells = true;
@@ -551,7 +558,7 @@ namespace WindowsFormsApp1
rng2.Font.Bold = true;
////////
rng = ws.Range[, "D"+endcount];
rng = ws.Range[, "D" + endcount];
rng.MergeCells = true;
rng.Value2 = "발 송 처";
rng.Font.Bold = true;
@@ -580,10 +587,10 @@ namespace WindowsFormsApp1
application.Interactive = true;
application.Quit();
return FileName;
}
catch(Exception e)
catch (Exception e)
{
MessageBox.Show(e.ToString());
return "False";
@@ -630,9 +637,9 @@ namespace WindowsFormsApp1
private string Excel_Sub(string[] data)
{
string[] length = {
"1", "2", "3", "4", "5",
"6", "7", "8", "9", "10",
"11", "12", "13", "14", "15",
"1", "2", "3", "4", "5",
"6", "7", "8", "9", "10",
"11", "12", "13", "14", "15",
"16", "17", "18", "19", "20",
"21", "22", "23", "24", "25", "26"
};
@@ -646,8 +653,8 @@ namespace WindowsFormsApp1
string count = data.Length.ToString();
string res = string.Empty;
for(int a = 0; a < length.Length; a++)
for (int a = 0; a < length.Length; a++)
{
if (length[a] == count)
{
@@ -658,7 +665,7 @@ namespace WindowsFormsApp1
}
#endregion
}
public class Helper_Print
public class Helper_Print
{
/// <summary>
/// 행의 갯수
@@ -788,7 +795,7 @@ namespace WindowsFormsApp1
/// <param name="file_name"></param>
/// <param name="fax_param">[0] 발신번호 / [1] 수신번호
/// / [2] 수신자 회사명 / [3 ]수신자명 </param>
public string Send_BaroFax(string file_name, string[] fax_param )
public string Send_BaroFax(string file_name, string[] fax_param)
{
BaroService_FAXSoapClient fAXSoapClient = new BaroService_FAXSoapClient();
@@ -824,7 +831,7 @@ namespace WindowsFormsApp1
BaroService_FAXSoapClient fAXSoapClient = new BaroService_FAXSoapClient();
// 수신자회사명, 수신번호, 전송일시, 전송결과, 전송페이지수, 성공페이지수, 전송파일명
string[] MsgBox_Array = {
string[] MsgBox_Array = {
fAXSoapClient.GetFaxMessage(CERTKEY, CorpNum, sendkey).ReceiveCorp,
fAXSoapClient.GetFaxMessage(CERTKEY, CorpNum, sendkey).ReceiverNum,
fAXSoapClient.GetFaxMessage(CERTKEY, CorpNum, sendkey).SendDT,
@@ -1190,9 +1197,9 @@ namespace WindowsFormsApp1
public bool IsConnected { get; set; }
private string ipAddr = string.Empty;
private string Port = string.Empty;
private string Port = string.Empty;
private string userId = string.Empty;
private string Pwd = string.Empty;
private string Pwd = string.Empty;
public FTP() { }
@@ -1219,7 +1226,7 @@ namespace WindowsFormsApp1
using (ftpRequest.GetResponse()) { }
this.IsConnected = true;
}
catch(Exception ex)
catch (Exception ex)
{
this.LastException = ex;
System.Reflection.MemberInfo info = System.Reflection.MethodInfo.GetCurrentMethod();
@@ -1288,7 +1295,7 @@ namespace WindowsFormsApp1
buff = null;
}
}
catch(Exception ex)
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
this.LastException = ex;
@@ -1392,14 +1399,14 @@ namespace WindowsFormsApp1
if (reader != null) reader.Close();
foreach(string file in result.ToString().Split('\n'))
foreach (string file in result.ToString().Split('\n'))
{
resultList.Add(file);
}
}
return resultList;
}
catch(Exception ex)
catch (Exception ex)
{
this.LastException = ex;
@@ -1420,12 +1427,12 @@ namespace WindowsFormsApp1
try
{
foreach(string tmpFolder in arrDir)
foreach (string tmpFolder in arrDir)
{
try
{
if (tmpFolder == string.Empty) continue;
currentDir += @"/" + tmpFolder;
string url = string.Format(@"FTP://{0}:{1}/{2}", this.ipAddr, this.Port, currentDir);
@@ -1453,9 +1460,11 @@ namespace WindowsFormsApp1
private void checkDir(string localFullPathFile)
{
FileInfo finfo = new FileInfo(localFullPathFile);
if (!finfo.Exists) {
if (!finfo.Exists)
{
DirectoryInfo dInfo = new DirectoryInfo(finfo.DirectoryName);
if (!dInfo.Exists) {
if (!dInfo.Exists)
{
dInfo.Create();
}
}
@@ -1552,30 +1561,35 @@ namespace WindowsFormsApp1
int tDown = 0;
for (int a = 0; a < array_text.Count; a++)
{
// if (array_text[a] == "") continue;
// if (array_text[a] == "") continue;
num.Add(array_text[a].Substring(0, 3));
if (array_text[a][5] == '▼') {
if (array_text[a][5] == '▼')
{
array_text[a] = array_text[a].Remove(0, 3);
}
else {
else
{
array_text[a] = array_text[a].Remove(0, 5);
}
+= array_text[a] + "\n";
int textLength = 0;
if (EncodingType == "UTF-8") {
if (EncodingType == "UTF-8")
{
textLength = Encoding.UTF8.GetBytes(array_text[a]).Length
- WordCheck(array_text[a], "▲")
- WordCheck(array_text[a], "▼");
}
else if (EncodingType == "UniCode") {
else if (EncodingType == "UniCode")
{
textLength = Encoding.Unicode.GetBytes(array_text[a]).Length
- WordCheck(array_text[a], "▲")
- WordCheck(array_text[a], "▼");
}
else { // ANSI
else
{ // ANSI
textLength = Encoding.Default.GetBytes(array_text[a]).Length
- WordCheck(array_text[a], "▲")
- WordCheck(array_text[a], "▼");
@@ -1587,12 +1601,13 @@ namespace WindowsFormsApp1
for (int a = 0; a < array_text.Count; a++)
{
if (a == 0) { //total.Add("0");
if (a == 0)
{ //total.Add("0");
tTotal.Add(0);
}
else
{
// total.Add(total[a - 1] + count[a - 1]);
// total.Add(total[a - 1] + count[a - 1]);
tTotal.Add(tTotal[a - 1] + tCount[a - 1]);
}
//else if (a == 1)
@@ -1609,7 +1624,7 @@ namespace WindowsFormsApp1
// else c = Convert.ToInt32(Encoding.Default.GetBytes(array_text[a - 2]).Length.ToString()) - WordCheck(array_text[a - 2], "▲") - WordCheck(array_text[a - 2], "▼");
// int res = b + c;
// total.Add(res.ToString());
}
string[] str_num = num.ToArray();
@@ -1626,7 +1641,7 @@ namespace WindowsFormsApp1
// else if (total[a].Length == 2) { total[a] = total[a].Insert(0, "000"); }
// else if (total[a].Length == 1) { total[a] = total[a].Insert(0, "0000"); }
// 디렉토리 += str_num[a] + count[a] + total[a] + "\n";
+= str_num[a] + tCount[a].ToString().PadLeft(4, '0') + tTotal[a].ToString().PadLeft(5, '0');
+= str_num[a] + tCount[a].ToString().PadLeft(4, '0') + tTotal[a].ToString().PadLeft(5, '0');
}
string[] = { "00000","n", "a", "m", " ",
@@ -1642,11 +1657,11 @@ namespace WindowsFormsApp1
string dp = + ;
int recode = 0;
if (EncodingType == "UTF-8") recode = Encoding.UTF8.GetBytes(dp).Length- WordCheck(dp, "▲") - WordCheck(dp, "▼") - WordCheck(dp, "↔");
if (EncodingType == "UTF-8") recode = Encoding.UTF8.GetBytes(dp).Length - WordCheck(dp, "▲") - WordCheck(dp, "▼") - WordCheck(dp, "↔");
else if (EncodingType == "UniCode") recode = Encoding.Unicode.GetBytes(dp).Length - WordCheck(dp, "▲") - WordCheck(dp, "▼") - WordCheck(dp, "↔");
else recode = Encoding.Default.GetBytes(dp).Length- WordCheck(dp, "▲") - WordCheck(dp, "▼") - WordCheck(dp, "↔");
else recode = Encoding.Default.GetBytes(dp).Length - WordCheck(dp, "▲") - WordCheck(dp, "▼") - WordCheck(dp, "↔");
[0] = insert_Zero(recode + 24, 5);
int data_addr = 24 + Encoding.Default.GetBytes().Length - WordCheck(, "▲");
@@ -1693,7 +1708,7 @@ namespace WindowsFormsApp1
return result;
}
#endregion
/// <summary>
/// 추가하고 싶은 태그를 뷰형태의 마크에 추가하는 함수.
@@ -1706,7 +1721,7 @@ namespace WindowsFormsApp1
if (Tag.Length < 3) return "";
int TargetTagNum = Convert.ToInt32(Tag.Substring(0, 3));
string[] SplitView = TypeView.Split('\n');
List<string> View = new List<string>(SplitView);
@@ -1731,9 +1746,9 @@ namespace WindowsFormsApp1
/// <param name="pAddTag">추가할 태그 (태그명\t지시기호\t태그내용)</param>
/// <param name="pTargetData">뷰형태의 마크</param>
/// <returns></returns>
public string AddTagInMarc(int pTargetTagNum,string pAddTag, string pTargetData)//TagTarget Num 을 찾아서 있을경우는 해당 Tag 데이터를 전송, 없을경우는 신규로 해야함.
public string AddTagInMarc(int pTargetTagNum, string pAddTag, string pTargetData)//TagTarget Num 을 찾아서 있을경우는 해당 Tag 데이터를 전송, 없을경우는 신규로 해야함.
{
if (pAddTag.Length < 3) return "";
string tRet = pTargetData;
// ex ) 020 : ~~~ 에 XXXX 내용줄 뒤에 추가
@@ -1827,7 +1842,7 @@ namespace WindowsFormsApp1
}
}
}
}
}
else
{// 기존 태그 변경
int endIdx = SplitView[a].IndexOf("▼", startIdx + 1);
@@ -1906,7 +1921,7 @@ namespace WindowsFormsApp1
/// <param name="marc">마크 데이터</param>
/// <param name="search">추출할 함수(배열)</param>
/// <returns></returns>
public string[] Take_Tag(string marc, string[] search,bool pSearchTag = false)
public string[] Take_Tag(string marc, string[] search, bool pSearchTag = false)
{
string[] ary = marc.Split('');
string[] tag = res_dir(ary[0].Substring(24));
@@ -1958,7 +1973,7 @@ namespace WindowsFormsApp1
//memo = result[b];
start += 2;
int end = -1;
if (tmp.Length > 1) end=tmp.IndexOf("", start);
if (tmp.Length > 1) end = tmp.IndexOf("", start);
if (memo == result[b])
break;
@@ -2188,7 +2203,8 @@ namespace WindowsFormsApp1
/// <param name="e">EventArgs</param>
public void Int_Comma(object sender, EventArgs e)
{
if (((TextBox)sender).Text != "") {
if (((TextBox)sender).Text != "")
{
string text;
text = ((TextBox)sender).Text.Replace(",", "");
((TextBox)sender).Text = String.Format("{0:#,###}", Convert.ToInt32(text));
@@ -2204,7 +2220,7 @@ namespace WindowsFormsApp1
public bool isContainHangul(string value)
{
char[] charArr = value.ToCharArray();
foreach(char c in charArr)
foreach (char c in charArr)
{
if (char.GetUnicodeCategory(c) == System.Globalization.UnicodeCategory.OtherLetter)
return true;
@@ -2221,7 +2237,7 @@ namespace WindowsFormsApp1
public bool CheckString(string value, string chkString)
{
int index = value.IndexOf(chkString);
if (index < 0)
if (index < 0)
return false;
return true;
@@ -2264,10 +2280,10 @@ namespace WindowsFormsApp1
public class API
{
public string CheckString(string pText,string pStr)
public string CheckString(string pText, string pStr)
{
string tRet = pText;
Regex reg = new Regex(@"([\"+pStr+"]+)" + @"[가-힣]+");//+ @"([\>]+)");//new Regex(@"([\<]+)"+ @"[ㄱ-ㅎ가-힣]+"+@"([\>]+)");
Regex reg = new Regex(@"([\" + pStr + "]+)" + @"[가-힣]+");//+ @"([\>]+)");//new Regex(@"([\<]+)"+ @"[ㄱ-ㅎ가-힣]+"+@"([\>]+)");
MatchCollection tMatch = reg.Matches(tRet);
for (int i = 0; i < tMatch.Count; i++)
{
@@ -2326,8 +2342,9 @@ namespace WindowsFormsApp1
xml = CheckString(xml, "〈");
doc.LoadXml(xml);
}
catch (Exception ex){
return "";
catch (Exception ex)
{
return "";
}
var json = JsonConvert.SerializeXmlNode(doc);
@@ -2520,19 +2537,23 @@ namespace WindowsFormsApp1
{
if (length == 1)
{
try {
try
{
tmp_data.Add(docs[Param[b]]["#text"]);
}
catch (KeyNotFoundException e) {
catch (KeyNotFoundException e)
{
tmp_data.Add("");
}
}
else
{
try {
try
{
tmp_data.Add(docs[a][Param[b]]["#text"]);
}
catch (KeyNotFoundException e) {
catch (KeyNotFoundException e)
{
tmp_data.Add("");
}
}
@@ -2649,8 +2670,8 @@ namespace WindowsFormsApp1
return dialogResult;
}
}
public class PrintLine
{
public class PrintLine
{
string num { get; set; }
string count { get; set; }
string list_name { get; set; }
@@ -2962,16 +2983,21 @@ namespace WindowsFormsApp1
public string VersionInfo()
{
string version = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\update.inf");
while (!sr.EndOfStream)
var updatefile = $"{Application.StartupPath}\\update.inf";
if (System.IO.File.Exists(updatefile))
{
string line = sr.ReadLine();
if (line.IndexOf("count=", 0) != -1)
StreamReader sr = new StreamReader(updatefile);
while (!sr.EndOfStream)
{
version = line.Replace("count=", "");
break;
string line = sr.ReadLine();
if (line.IndexOf("count=", 0) != -1)
{
version = line.Replace("count=", "");
break;
}
}
}
else version = "0";
return version;
}
}

View File

@@ -36,7 +36,7 @@
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
@@ -74,7 +74,13 @@
<PropertyGroup>
<ManifestKeyFile>UniMarc_TemporaryKey.pfx</ManifestKeyFile>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>UniMarc.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="AngleSharp, Version=1.0.4.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL">
<HintPath>..\packages\AngleSharp.1.0.4\lib\net472\AngleSharp.dll</HintPath>
</Reference>
<Reference Include="arCommUtil">
<HintPath>..\dll\arCommUtil.dll</HintPath>
</Reference>
@@ -87,19 +93,71 @@
<Reference Include="CarlosAg.ExcelXmlWriter">
<HintPath>..\dll\CarlosAg.ExcelXmlWriter.dll</HintPath>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib, Version=1.4.2.13, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
<HintPath>..\packages\SharpZipLib.1.4.2\lib\netstandard2.0\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualBasic" />
<Reference Include="Microsoft.Web.WebView2.Core, Version=1.0.3351.48, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3351.48\lib\net462\Microsoft.Web.WebView2.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.WebView2.WinForms, Version=1.0.3351.48, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3351.48\lib\net462\Microsoft.Web.WebView2.WinForms.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.WebView2.Wpf, Version=1.0.3351.48, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3351.48\lib\net462\Microsoft.Web.WebView2.Wpf.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Win32.Registry, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Registry.5.0.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
</Reference>
<Reference Include="MySql.Data, Version=8.0.21.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" />
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Renci.SshNet, Version=2020.0.1.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
<HintPath>..\packages\SSH.NET.2020.0.1\lib\net40\Renci.SshNet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.DirectoryServices" />
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Security.AccessControl, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.AccessControl.5.0.0\lib\net461\System.Security.AccessControl.dll</HintPath>
</Reference>
<Reference Include="System.Security.Principal.Windows, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel" />
<Reference Include="System.Text.Encoding.CodePages, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encoding.CodePages.6.0.0\lib\net461\System.Text.Encoding.CodePages.dll</HintPath>
</Reference>
<Reference Include="System.Text.Encodings.Web, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encodings.Web.7.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
</Reference>
<Reference Include="System.Text.Json, Version=7.0.0.3, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Json.7.0.3\lib\net462\System.Text.Json.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
@@ -111,6 +169,15 @@
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="WebDriver, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Selenium.WebDriver.4.16.2\lib\netstandard2.0\WebDriver.dll</HintPath>
</Reference>
<Reference Include="WebDriver.Support, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Selenium.Support.4.16.2\lib\netstandard2.0\WebDriver.Support.dll</HintPath>
</Reference>
<Reference Include="WebDriverManager, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\WebDriverManager.2.17.1\lib\net462\WebDriverManager.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="CExt.cs" />
@@ -125,6 +192,15 @@
<DependentUpon>Reference.svcmap</DependentUpon>
</Compile>
<Compile Include="CUtill.cs" />
<Compile Include="SearchModel\BookSearchService.cs" />
<Compile Include="SearchModel\ChromeDriverManager.cs" />
<Compile Include="SearchModel\DownloadProgressForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SearchModel\ILibrarySearcher.cs" />
<Compile Include="SearchModel\KwangjuCityLibrarySearcher.cs" />
<Compile Include="SearchModel\NamguLibrarySearcher.cs" />
<Compile Include="WebView2Installer.cs" />
<Compile Include="마스터\From_User_manage_List.cs">
<SubType>Form</SubType>
</Compile>
@@ -173,6 +249,12 @@
<Compile Include="마크\CD_LP_Sub.Designer.cs">
<DependentUpon>CD_LP_Sub.cs</DependentUpon>
</Compile>
<Compile Include="마크\Check_copyWD.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="마크\Check_copyWD.Designer.cs">
<DependentUpon>Check_copyWD.cs</DependentUpon>
</Compile>
<Compile Include="마크\Check_Copy_Login.cs">
<SubType>Form</SubType>
</Compile>
@@ -867,6 +949,9 @@
<EmbeddedResource Include="마크\CD_LP_Sub.resx">
<DependentUpon>CD_LP_Sub.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="마크\Check_copyWD.resx">
<DependentUpon>Check_copyWD.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="마크\Check_Copy_Login.resx">
<DependentUpon>Check_Copy_Login.cs</DependentUpon>
</EmbeddedResource>
@@ -1848,6 +1933,7 @@
<None Include="Resources\0_Empty.png" />
</ItemGroup>
<ItemGroup>
<Content Include="UniMarc.ico" />
<None Include="Connected Services\BaroService_TI\configuration91.svcinfo" />
<None Include="Connected Services\BaroService_TI\configuration.svcinfo" />
<None Include="Connected Services\BaroService_TI\Reference.svcmap">
@@ -1868,4 +1954,13 @@
<Content Include="Resources\3_2_2_편목.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Selenium.WebDriver.4.16.2\build\Selenium.WebDriver.targets" Condition="Exists('..\packages\Selenium.WebDriver.4.16.2\build\Selenium.WebDriver.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Selenium.WebDriver.4.16.2\build\Selenium.WebDriver.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Selenium.WebDriver.4.16.2\build\Selenium.WebDriver.targets'))" />
<Error Condition="!Exists('..\packages\Microsoft.Web.WebView2.1.0.3351.48\build\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Web.WebView2.1.0.3351.48\build\Microsoft.Web.WebView2.targets'))" />
</Target>
<Import Project="..\packages\Microsoft.Web.WebView2.1.0.3351.48\build\Microsoft.Web.WebView2.targets" Condition="Exists('..\packages\Microsoft.Web.WebView2.1.0.3351.48\build\Microsoft.Web.WebView2.targets')" />
</Project>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishUrlHistory>E:\UniMarcApplicationUpdateFiles\|ftp://ftpgloria%401.215.250.130/|ftp://ftpgloria%401.215.250.130:50005/|sftp://ftpgloria%401.215.250.130/|ftp://ftpgloria%401.215.250.130/unimarc/</PublishUrlHistory>
@@ -9,6 +9,7 @@
<ErrorReportUrlHistory />
<FallbackCulture>ko-KR</FallbackCulture>
<VerifyUploadedFiles>false</VerifyUploadedFiles>
<ProjectView>ProjectFiles</ProjectView>
</PropertyGroup>
<PropertyGroup>
<EnableSecurityDebugging>false</EnableSecurityDebugging>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -0,0 +1,510 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Web.WebView2.Core;
namespace WindowsFormsApp1
{
public static class WebView2Installer
{
// Fixed Version 다운로드 URL (CAB 파일 사용)
private const string WEBVIEW2_FIXED_VERSION_URL = "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/759b508a-00bb-4724-9b87-2703c8417737/Microsoft.WebView2.FixedVersionRuntime.139.0.3405.86.x86.cab";
private const string INSTALLER_FILENAME = "Microsoft.WebView2.FixedVersionRuntime.139.0.3405.86.x86.cab";
// Fixed Version 런타임을 애플리케이션 폴더에 배치할 경로
private const string FIXED_VERSION_FOLDER = "WebView2Runtime";
/// <summary>
/// WebView2 Fixed Version 환경을 준비 (항상 Fixed Version 사용)
/// </summary>
public static async Task<CoreWebView2Environment> GetWebView2EnvironmentAsync()
{
try
{
// 일관성을 위해 항상 Fixed Version 사용
string fixedVersionPath = GetFixedVersionPath();
// Fixed Version 런타임이 이미 있는지 확인
string actualRuntimePath = FindActualRuntimePath(fixedVersionPath);
if (!string.IsNullOrEmpty(actualRuntimePath))
{
try
{
// Fixed Version 사용 시 환경 옵션 명시적 지정
string userDataFolder = Path.Combine(Application.StartupPath, "WebView2UserData");
// 사용자 데이터 폴더 생성
if (!Directory.Exists(userDataFolder))
{
Directory.CreateDirectory(userDataFolder);
}
// 런타임 버전 정보 확인
try
{
string version = CoreWebView2Environment.GetAvailableBrowserVersionString(actualRuntimePath);
}
catch (Exception verEx)
{
MessageBox.Show(
$"런타임 버전 확인 실패:\n\n" +
$"경로: {actualRuntimePath}\n" +
$"오류: {verEx.Message}",
"버전 확인 오류",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
}
return await CoreWebView2Environment.CreateAsync(actualRuntimePath, userDataFolder);
}
catch (WebView2RuntimeNotFoundException ex)
{
MessageBox.Show(
$"WebView2 환경 생성 실패!\n\n" +
$"런타임 경로: {actualRuntimePath}\n" +
$"오류: {ex.Message}\n\n" +
$"런타임을 다시 다운로드합니다.",
"WebView2 환경 오류",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
// 기존 런타임 폴더 삭제 후 재다운로드
try
{
Directory.Delete(fixedVersionPath, true);
}
catch { }
}
}
// Fixed Version 런타임 다운로드 및 배치
bool success = await DownloadFixedVersionRuntime();
if (success)
{
actualRuntimePath = FindActualRuntimePath(fixedVersionPath);
if (!string.IsNullOrEmpty(actualRuntimePath))
{
try
{
// 다운로드 후 환경 생성 시도 (Fixed Version)
string userDataFolder = Path.Combine(Application.StartupPath, "WebView2UserData");
// 사용자 데이터 폴더 생성
if (!Directory.Exists(userDataFolder))
{
Directory.CreateDirectory(userDataFolder);
}
var environment = await CoreWebView2Environment.CreateAsync(actualRuntimePath, userDataFolder);
return environment;
}
catch (WebView2RuntimeNotFoundException ex)
{
MessageBox.Show(
$"다운로드 후에도 WebView2 환경 생성 실패!\n\n" +
$"런타임 경로: {actualRuntimePath}\n" +
$"오류: {ex.Message}\n\n" +
$"해당 경로의 파일들을 확인해주세요.",
"WebView2 환경 생성 최종 실패",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
throw;
}
}
else
{
MessageBox.Show(
$"다운로드는 완료되었지만 유효한 런타임 경로를 찾을 수 없습니다.\n\n" +
$"기본 경로: {fixedVersionPath}",
"런타임 경로 탐색 실패",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
}
throw new Exception("WebView2 Fixed Version 런타임을 사용할 수 없습니다.");
}
catch (Exception ex)
{
MessageBox.Show(
$"WebView2 Fixed Version 환경 준비 중 오류가 발생했습니다: {ex.Message}",
"오류",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
throw;
}
}
/// <summary>
/// Fixed Version 런타임 경로 반환
/// </summary>
private static string GetFixedVersionPath()
{
string appPath = Application.StartupPath;
return Path.Combine(appPath, FIXED_VERSION_FOLDER);
}
/// <summary>
/// 실제 WebView2 런타임 폴더 경로를 찾는 메서드
/// </summary>
private static string FindActualRuntimePath(string basePath)
{
try
{
if (!Directory.Exists(basePath))
return null;
// WebView2 런타임의 주요 파일들 (우선순위대로)
string targetFiles = "msedgewebview2.exe";
var targetfi = new System.IO.FileInfo(System.IO.Path.Combine(basePath, targetFiles));
if(targetfi.Exists) return targetfi.Directory.FullName;
//루트에 없었으니 서브폴더에서 찾는다
foreach(var subdir in targetfi.Directory.GetDirectories())
{
var fi = new System.IO.FileInfo(System.IO.Path.Combine(subdir.FullName, targetFiles));
if (fi.Exists) return fi.Directory.FullName;
}
return null;
}
catch (Exception ex)
{
// 디버깅을 위한 예외 정보 출력
MessageBox.Show(
$"FindActualRuntimePath 오류:\n{ex.Message}\n\n기본 경로: {basePath}",
"런타임 경로 탐색 오류",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
return null;
}
}
/// <summary>
/// 서브디렉토리에서 WebView2 런타임 파일 검색
/// </summary>
private static string SearchInSubDirectories(string currentPath, string[] targetFiles, int currentDepth, int maxDepth)
{
if (currentDepth >= maxDepth || !Directory.Exists(currentPath))
return null;
try
{
// 현재 경로의 모든 서브디렉토리 검색
foreach (string subDir in Directory.GetDirectories(currentPath))
{
// 각 대상 파일을 해당 서브디렉토리에서 확인
foreach (string targetFile in targetFiles)
{
string fullPath = Path.Combine(subDir, targetFile);
if (File.Exists(fullPath))
{
string candidatePath;
// EBWebView 하위 파일인 경우 해당 디렉토리 반환
if (targetFile.Contains("\\"))
{
candidatePath = Path.Combine(subDir, Path.GetDirectoryName(targetFile));
}
else
{
candidatePath = subDir;
}
// 런타임 유효성 검증
if (ValidateWebView2Runtime(candidatePath))
{
return candidatePath;
}
}
}
// 재귀적으로 더 깊은 폴더 검색
string result = SearchInSubDirectories(subDir, targetFiles, currentDepth + 1, maxDepth);
if (!string.IsNullOrEmpty(result))
return result;
}
return null;
}
catch
{
return null;
}
}
/// <summary>
/// WebView2 런타임이 유효한지 검증
/// </summary>
private static bool ValidateWebView2Runtime(string runtimePath)
{
try
{
if (string.IsNullOrEmpty(runtimePath) || !Directory.Exists(runtimePath))
return false;
// 필수 파일들 체크
string[] requiredFiles = {
"msedgewebview2.exe",
"WebView2Loader.dll"
};
foreach (string file in requiredFiles)
{
if (!File.Exists(Path.Combine(runtimePath, file)))
{
return false;
}
}
return true;
}
catch
{
return false;
}
}
/// <summary>
/// Fixed Version WebView2 런타임 다운로드 및 배치
/// </summary>
private static async Task<bool> DownloadFixedVersionRuntime()
{
try
{
var fi = new System.IO.FileInfo(Path.Combine(".\\Temp", INSTALLER_FILENAME));
if (fi.Directory.Exists == false) fi.Directory.Create();
string extractPath = GetFixedVersionPath();
// 진행상황 표시 폼
var progressForm = new Form()
{
Text = "WebView2 런타임 다운로드",
Size = new System.Drawing.Size(400, 120),
FormBorderStyle = FormBorderStyle.FixedDialog,
StartPosition = FormStartPosition.CenterScreen,
MaximizeBox = false,
MinimizeBox = false,
//TopMost = true,
};
var progressBar = new ProgressBar()
{
Location = new System.Drawing.Point(20, 20),
Size = new System.Drawing.Size(340, 23),
Style = ProgressBarStyle.Continuous
};
var statusLabel = new Label()
{
Location = new System.Drawing.Point(20, 50),
Size = new System.Drawing.Size(340, 20),
Text = "다운로드 준비 중..."
};
progressForm.Controls.Add(progressBar);
progressForm.Controls.Add(statusLabel);
progressForm.Show();
if (System.IO.File.Exists(fi.FullName) == false)
{
// 다운로드
using (var client = new WebClient())
{
client.DownloadProgressChanged += (s, e) =>
{
progressBar.Value = e.ProgressPercentage;
statusLabel.Text = $"다운로드 중... {e.ProgressPercentage}%";
Application.DoEvents();
};
await client.DownloadFileTaskAsync(WEBVIEW2_FIXED_VERSION_URL, fi.FullName);
}
}
statusLabel.Text = "CAB 파일 압축 해제 중...";
progressBar.Style = ProgressBarStyle.Marquee;
Application.DoEvents();
// CAB 파일 압축 해제를 위한 경로 생성
if (!Directory.Exists(extractPath))
{
Directory.CreateDirectory(extractPath);
}
// Windows expand 명령어를 사용하여 CAB 파일 압축 해제
bool extractSuccess = await ExtractCabFileAsync(fi.FullName, extractPath);
statusLabel.Text = "런타임 경로 확인 중...";
Application.DoEvents();
if (!extractSuccess)
{
progressForm.Close();
throw new Exception("CAB 파일 압축 해제에 실패했습니다.");
}
// 실제 런타임 경로 확인
string actualPath = FindActualRuntimePath(extractPath);
if (string.IsNullOrEmpty(actualPath))
{
progressForm.Close();
throw new Exception("압축 해제는 완료되었지만 WebView2 런타임을 찾을 수 없습니다.");
}
statusLabel.Text = "설정 완료 중...";
Application.DoEvents();
// 잠시 대기 후 폼 닫기
await Task.Delay(500);
progressForm.Close();
return Directory.Exists(extractPath);
}
catch (Exception ex)
{
MessageBox.Show(
$"WebView2 런타임 준비 중 오류가 발생했습니다: {ex.Message}",
"오류",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
return false;
}
}
/// <summary>
/// CAB 파일을 압축 해제하는 메서드
/// </summary>
private static async Task<bool> ExtractCabFileAsync(string cabFilePath, string extractPath)
{
try
{
//// 디버깅 정보 표시
//MessageBox.Show(
// $"CAB 압축 해제 시작\n\n" +
// $"CAB 파일: {cabFilePath}\n" +
// $"압축 해제 경로: {extractPath}\n" +
// $"CAB 파일 존재: {File.Exists(cabFilePath)}\n" +
// $"CAB 파일 크기: {(File.Exists(cabFilePath) ? new FileInfo(cabFilePath).Length.ToString("N0") + " bytes" : "파일 없음")}",
// "디버깅 정보",
// MessageBoxButtons.OK,
// MessageBoxIcon.Information
//);
// Windows expand 명령어를 사용하여 CAB 파일 압축 해제
var startInfo = new ProcessStartInfo("expand.exe")
{
Arguments = $"\"{cabFilePath}\" -F:* \"{extractPath}\"",
UseShellExecute = false,
CreateNoWindow = true, // 콘솔 창 보이게 설정
RedirectStandardOutput = false, // 출력 리다이렉션 해제
RedirectStandardError = false // 에러 리다이렉션 해제
};
using (var process = Process.Start(startInfo))
{
// 최대 30초 대기
bool exited = await Task.Run(() => process.WaitForExit(30000));
if (!exited)
{
// 프로세스가 30초 내에 완료되지 않으면 강제 종료
try
{
process.Kill();
}
catch { }
return false;
}
// 압축 해제 성공 여부 확인
bool success = process.ExitCode == 0;
if (success == false)
{
try
{
System.IO.File.Delete(cabFilePath);
}
catch (Exception ex)
{
Console.WriteLine("remove cab file : " + ex.Message);
}
}
// 실제 런타임 파일이 있는지 확인
if (success)
{
string actualPath = FindActualRuntimePath(extractPath);
success = !string.IsNullOrEmpty(actualPath);
// 런타임을 찾지 못한 경우 디버깅 정보 표시
if (!success)
{
string[] extractedFiles = Directory.Exists(extractPath) ? Directory.GetFiles(extractPath, "*", SearchOption.AllDirectories) : new string[0];
string[] extractedDirs = Directory.Exists(extractPath) ? Directory.GetDirectories(extractPath, "*", SearchOption.AllDirectories) : new string[0];
MessageBox.Show(
$"WebView2 런타임 파일을 찾을 수 없습니다!\n\n" +
$"압축 해제 경로: {extractPath}\n" +
$"압축 해제된 파일 수: {extractedFiles.Length}\n" +
$"압축 해제된 폴더 수: {extractedDirs.Length}\n\n" +
$"상위 5개 파일:\n{string.Join("\n", extractedFiles.Take(5))}\n\n" +
$"모든 폴더:\n{string.Join("\n", extractedDirs)}",
"런타임 파일 탐색 실패",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
}
}
return success;
}
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// WebView2 Fixed Version 런타임 상태 정보 반환
/// </summary>
public static string GetWebView2Status()
{
try
{
string fixedVersionPath = GetFixedVersionPath();
string actualRuntimePath = FindActualRuntimePath(fixedVersionPath);
if (!string.IsNullOrEmpty(actualRuntimePath))
{
return $"WebView2 Fixed Version 런타임이 준비되어 있습니다.\n경로: {actualRuntimePath}\n버전: 139.0.3405.86";
}
else
{
return "WebView2 Fixed Version 런타임이 준비되어 있지 않습니다.";
}
}
catch (Exception ex)
{
return $"WebView2 Fixed Version 런타임 확인 실패: {ex.Message}";
}
}
}
}

View File

@@ -1,2 +0,0 @@
ID=sh
PW=123

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +0,0 @@
idx,등록일,마감일,작업목록명,연동목록명,분류,전체,편목,미편목,상태,등급,비고,담당자,V,
DataGridViewTextBoxCell { ColumnIndex=0, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=1, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=2, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=3, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=4, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=5, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=6, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=7, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=8, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=9, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=10, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=11, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=12, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=13, RowIndex=0 },

View File

@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="UniMarc.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BaroService_FAXSoap" />
<binding name="BaroService_TISoap">
<security mode="Transport" />
</binding>
<binding name="BaroService_TISoap1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://testws.baroservice.com/FAX.asmx" binding="basicHttpBinding"
bindingConfiguration="BaroService_FAXSoap" contract="BaroService_API.BaroService_FAXSoap"
name="BaroService_FAXSoap" />
<endpoint address="https://testws.baroservice.com/TI.asmx" binding="basicHttpBinding"
bindingConfiguration="BaroService_TISoap" contract="BaroService_TI.BaroService_TISoap"
name="BaroService_TISoap" />
</client>
</system.serviceModel>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Renci.SshNet" publicKeyToken="1cee9f8bde3db106" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2020.0.1.0" newVersion="2020.0.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<userSettings>
<UniMarc.Properties.Settings>
<setting name="compidx" serializeAs="String">
<value />
</setting>
<setting name="User" serializeAs="String">
<value />
</setting>
<setting name="IP" serializeAs="String">
<value>1.11010111.11111010.10000010</value>
</setting>
<setting name="Port" serializeAs="String">
<value>1100101111</value>
</setting>
<setting name="Uid" serializeAs="String">
<value>103.108.111.114.105.97.98.111.111.107</value>
</setting>
<setting name="pwd" serializeAs="String">
<value>97.100.109.105.110.64.33.64.35.36</value>
</setting>
<setting name="dbPort" serializeAs="String">
<value>110011101010</value>
</setting>
<setting name="dbUid" serializeAs="String">
<value>114.111.111.116</value>
</setting>
<setting name="dbPwd" serializeAs="String">
<value>65.100.109.105.110.50.49.50.51.52</value>
</setting>
</UniMarc.Properties.Settings>
</userSettings>
</configuration>

View File

@@ -1,4 +0,0 @@
9788969524102 1 간호사를 간호하는 간호사 경향BP 오성훈 13500 60 8100 [(주)글로리아북]납품 2021-07-14 오후 1:44 머리 10
9791195010073 1 감정조절자(희망) : 나를 힘겹게 하는 나와 작별하기 프로젝트 헥소미아 김인자 16000 60 9600 [(주)글로리아북]납품 2021-07-14 오후 1:44 머리 11
9788932320625 1 개는 우리를 어떻게 사랑하는가 : 개의 특별한 애정에 대한 과학적 탐구 현암사 클라이브 D. L. 윈 ; 전행선 17000 60 10200 [(주)글로리아북]납품 2021-07-14 오후 1:44 머리 12
9791158491307 1 걷다 느끼다 쓰다 : 전문성과 대중성을 겸비한 글쓰기 수업 모아북스 이해사 15000 60 9000 [(주)글로리아북]납품 2021-07-14 오후 1:44 머리 13

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]

View File

@@ -1 +0,0 @@
a980cc54cfee34721f8734aaae513dd71cd3d934

View File

@@ -1,154 +0,0 @@
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\MySql.Data.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Newtonsoft.Json.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Renci.SshNet.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Google.Protobuf.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Zstandard.Net.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\K4os.Compression.LZ4.Streams.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\BouncyCastle.Crypto.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Ubiety.Dns.Core.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\System.Buffers.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\K4os.Compression.LZ4.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\K4os.Hash.xxHash.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\System.Runtime.CompilerServices.Unsafe.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\MySql.Data.xml
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Newtonsoft.Json.xml
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Renci.SshNet.xml
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.ResolveComReference.cache
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.납품관리.Bring_Back.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.납품관리.Order_Send_Chk.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Check_ISBN_Sub.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\ExcelTest.findNchange.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\ExcelTest.Helper008.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Job_Order.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Mac_Chack_Up.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Mac_List_Merge.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Make_Document.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\ExcelTest.Marc.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Search_Infor_Sub.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Bill_manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Purchase_Aggregation.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Purchase_Book.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Purchase_Input.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Remit_reg2.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.회계.Sales_Book.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Sales_Lookup.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Sales_Deposit.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.회계.Sales_Detail.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Sales_Input.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Purchase_not_pay.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Remit_reg.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.회계.Sales_In_Pay.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Sales_Not_Pay.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Board.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Calendar.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Quick_menu.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Sale_End.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Sale_Member_Manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Sale_Sale.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Sale_Settlement.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Send_Notice.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Talk.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Book_Lookup.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Commodity_Edit.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Commodity_Morge.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Commodity_registration.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Commodity_Search.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Input_Lookup_Stock.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.List_aggregation.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.List_Chk_Work.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.List_Lookup.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Order_input.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Order_input_Search.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Purchase.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.DLS.Input_DLS.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.DLS.School_Lookup.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Book_infor_manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.ledger_of_use.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.memo.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Order_manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.pw_change.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Transaction_manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Home_User_manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.User_Infor.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home._Sub_Search_Form.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.All_Book_manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Check_copy.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Check_ISBN.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Collect_Mac.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.DLS_Copy.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Mac_Output.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Equip_manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Mac_Stat.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Mac_Input.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Mac_List.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Nonverbal.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Search_Infor.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Set_Macro.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Setup_Shortcut.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Symbol_Add.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Batch_processing.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac_Setting.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Notice_Send.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Sales_Details.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.User_account_inquiry.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.User_manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.login.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Main.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Work_log.Work_Log.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Home_User_manage.ko.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.GenerateResource.cache
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.CoreCompileInputs.cache
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.CopyComplete
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.Properties.Resources.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\UniMarc.exe.config
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\UniMarc.exe
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\UniMarc.pdb
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\ko\UniMarc.resources.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\ko\UniMarc.resources.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.exe
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.pdb
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_memo.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Zoom_Picture.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_ISBN_Yes24.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.회계.Part_time.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.All_Book_manage_Add.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.All_Book_manage_Edit.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.All_Book_Detail.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Preview.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_ISBN_Split.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Mac_Stat_Stat.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Marc_Plan.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_Sub_SelectList.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_mkList.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_Sub_SelectList_Edit.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_Sub_MarcEdit.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_Copy_Sub_Search.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_Copy_Sub_List.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\Interop.SHDocVw.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.DLS_Manage.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.Marc_FillBlank.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_Sub_SelectList_Morge.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.MarcCopySelect.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Mac_List_Add.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_PrintLabel.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.ShowDeleteMarc.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_Copy_Login.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.AddMarc.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP_Sub.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP_SelectList.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Help_007.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Help_008.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP_List.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.AddMarc_FillBlank.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_ClassSymbol.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_GearExcel.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP_AddList.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\ArLog.Net4.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.From_User_manage_List.resources
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\System.Memory.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\System.Numerics.Vectors.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\arControl.Net4.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\CarlosAg.ExcelXmlWriter.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\arCommUtil.dll
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.AssemblyReference.cache

Some files were not shown because too many files have changed in this diff Show More