出版
This commit is contained in:
		
						commit
						71dbaa1812
					
				
							
								
								
									
										17
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					BasedOnStyle: LLVM
 | 
				
			||||||
 | 
					IndentWidth: 4
 | 
				
			||||||
 | 
					PointerAlignment: Left
 | 
				
			||||||
 | 
					AccessModifierOffset: -4
 | 
				
			||||||
 | 
					BreakBeforeBraces: Custom
 | 
				
			||||||
 | 
					BraceWrapping:
 | 
				
			||||||
 | 
					    AfterFunction: true
 | 
				
			||||||
 | 
					    AfterClass: true
 | 
				
			||||||
 | 
					Cpp11BracedListStyle: true
 | 
				
			||||||
 | 
					ReflowComments: true
 | 
				
			||||||
 | 
					SpacesBeforeTrailingComments: 3
 | 
				
			||||||
 | 
					TabWidth: 4
 | 
				
			||||||
 | 
					ConstructorInitializerAllOnOneLineOrOnePerLine: true
 | 
				
			||||||
 | 
					ColumnLimit: 80
 | 
				
			||||||
 | 
					AllowShortBlocksOnASingleLine: Never
 | 
				
			||||||
 | 
					AllowShortFunctionsOnASingleLine: None
 | 
				
			||||||
 | 
					AllowShortEnumsOnASingleLine: false
 | 
				
			||||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					build
 | 
				
			||||||
 | 
					.vs
 | 
				
			||||||
 | 
					.cache
 | 
				
			||||||
 | 
					cmake-*
 | 
				
			||||||
							
								
								
									
										40
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "files.autoSave": "onFocusChange",
 | 
				
			||||||
 | 
					    "editor.fontSize": 14,
 | 
				
			||||||
 | 
					    "editor.fontFamily": "'FiraCode Nerd Font Mono', 'FiraCode Nerd Font Mono', 'FiraCode Nerd Font Mono'",
 | 
				
			||||||
 | 
					    "cmake.configureOnOpen": true,
 | 
				
			||||||
 | 
					    "cmake.debugConfig": {
 | 
				
			||||||
 | 
					        "console": "integratedTerminal",
 | 
				
			||||||
 | 
					        "setupCommands": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "description": "-gdb-set charset utf-8",
 | 
				
			||||||
 | 
					                "text": "-gdb-set charset UTF-8"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "description": "Enable gdb pretty-printing",
 | 
				
			||||||
 | 
					                "text": "-enable-pretty-printing",
 | 
				
			||||||
 | 
					                "ignoreFailures": true
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        "args": [
 | 
				
			||||||
 | 
					            "SemiWorkCode", "From"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "cmake.environment": {
 | 
				
			||||||
 | 
					        "PATH": "${env::PATH};D:/library/wxWidgets/lib/vc_x64_dll"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    // "cmake.configureSettings": {
 | 
				
			||||||
 | 
						//     "CMAKE_TOOLCHAIN_FILE": "${env:VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
 | 
				
			||||||
 | 
					    // },
 | 
				
			||||||
 | 
					    "cmake.options.statusBarVisibility": "visible",
 | 
				
			||||||
 | 
					    "cmake.generator": "Ninja",
 | 
				
			||||||
 | 
					    "C_Cpp.default.compileCommands": "${workspaceRoot}/build/compile_commands.json",
 | 
				
			||||||
 | 
					    "C_Cpp.default.cppStandard": "c++17",
 | 
				
			||||||
 | 
					    "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
 | 
				
			||||||
 | 
					    "editor.inlayHints.enabled": "off",
 | 
				
			||||||
 | 
					    "editor.unicodeHighlight.allowedLocales": {
 | 
				
			||||||
 | 
					        "ja": true,
 | 
				
			||||||
 | 
					        "zh-hant": true,
 | 
				
			||||||
 | 
					        "zh-hans": true
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					cmake_minimum_required(VERSION 3.16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					project(msync LANGUAGES CXX)
 | 
				
			||||||
 | 
					set(CMAKE_CXX_STANDARD 17)
 | 
				
			||||||
 | 
					set(CMAKE_CXX_STANDARD_REQUIRED ON)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					list(APPEND CMAKE_PREFIX_PATH "D:/library/wxWidgets/lib/cmake")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (MSVC)
 | 
				
			||||||
 | 
					    add_compile_options(/source-charset:utf-8)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					find_package(wxWidgets REQUIRED COMPONENTS core base xml)
 | 
				
			||||||
 | 
					include(${wxWidgets_USE_FILE})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					message(STATUS "System: ${CMAKE_SYSTEM_NAME}")
 | 
				
			||||||
 | 
					message(STATUS "Compiler CXX ID: ${CMAKE_CXX_COMPILER_ID}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_executable(msync main.cpp)
 | 
				
			||||||
 | 
					target_link_libraries(msync PRIVATE ${wxWidgets_LIBRARIES})
 | 
				
			||||||
 | 
					set_target_properties(msync PROPERTIES WIN32_EXECUTABLE FALSE)
 | 
				
			||||||
							
								
								
									
										7
									
								
								config/msync.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								config/msync.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<Root>
 | 
				
			||||||
 | 
					    <Item Name="SemiWorkCode" WinWorkPath="D:/work" UnixWorkPath="/home/lebo/mwork">
 | 
				
			||||||
 | 
					        <Exclude>.git</Exclude>
 | 
				
			||||||
 | 
					        <Exclude>build</Exclude>
 | 
				
			||||||
 | 
					    </Item>
 | 
				
			||||||
 | 
					</Root>
 | 
				
			||||||
							
								
								
									
										173
									
								
								main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								main.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,173 @@
 | 
				
			|||||||
 | 
					#include <filesystem>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <wx/app.h>
 | 
				
			||||||
 | 
					#include <wx/arrstr.h>
 | 
				
			||||||
 | 
					#include <wx/filename.h>
 | 
				
			||||||
 | 
					#include <wx/log.h>
 | 
				
			||||||
 | 
					#include <wx/stdpaths.h>
 | 
				
			||||||
 | 
					#include <wx/utils.h>
 | 
				
			||||||
 | 
					#include <wx/xml/xml.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace fs = std::filesystem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Configure {
 | 
				
			||||||
 | 
					    wxString name;
 | 
				
			||||||
 | 
					    wxString work_dir;
 | 
				
			||||||
 | 
					    wxArrayString exclude;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static wxString work_path;
 | 
				
			||||||
 | 
					static wxString cw_work_path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool parse_xml(const wxString& filepath, const wxString& name,
 | 
				
			||||||
 | 
					               Configure& config)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    wxXmlDocument xmlDoc;
 | 
				
			||||||
 | 
					    if (!xmlDoc.Load(filepath)) {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wxXmlNode* root = xmlDoc.GetRoot();
 | 
				
			||||||
 | 
					    auto c = root->GetChildren();
 | 
				
			||||||
 | 
					    if (!c) {
 | 
				
			||||||
 | 
					        wxLogMessage("解析Xml失败。");
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    bool find = false;
 | 
				
			||||||
 | 
					    while (c) {
 | 
				
			||||||
 | 
					        if (c->GetName() != "Item") {
 | 
				
			||||||
 | 
					            c = c->GetNext();
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (c->GetAttribute("Name") != name) {
 | 
				
			||||||
 | 
					            c = c->GetNext();
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        find = true;
 | 
				
			||||||
 | 
					        config.name = name;
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					        config.work_dir = c->GetAttribute("WinWorkPath");
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        config.work_dir = c->GetAttribute("UnixWorkPath");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        auto p = c->GetChildren();
 | 
				
			||||||
 | 
					        while (p) {
 | 
				
			||||||
 | 
					            config.exclude.push_back(p->GetNodeContent());
 | 
				
			||||||
 | 
					            p = p->GetNext();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!find) {
 | 
				
			||||||
 | 
					        wxLogMessage("未找到%s的配置。", name);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        wxLogMessage("找到%s的配置。", name);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxString ConvertToCygwinPath(const wxString& path)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					    // 提取驱动器字母
 | 
				
			||||||
 | 
					    wxString drive = path.BeforeFirst('\\').Upper();
 | 
				
			||||||
 | 
					    drive.erase(1, 1);
 | 
				
			||||||
 | 
					    wxString restPath = path.AfterFirst('\\');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 替换为 Cygwin 格式
 | 
				
			||||||
 | 
					    wxString cygwinPath = "/cygdrive/" + drive.Lower();
 | 
				
			||||||
 | 
					    if (!restPath.empty()) {
 | 
				
			||||||
 | 
					        cygwinPath.append("/" + restPath);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    cygwinPath.Replace("\\", "/");
 | 
				
			||||||
 | 
					    return cygwinPath;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    return path;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxString get_cmd(Configure& config, bool to_cur)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    wxString cmd_str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if _WIN32
 | 
				
			||||||
 | 
					    wxString cmd = work_path + "cwrsync\\bin\\rsync.exe ";
 | 
				
			||||||
 | 
					    cmd_str.append(cmd);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    cmd_str.append("rsync ");
 | 
				
			||||||
 | 
					    dest_str = work_path + config.name;
 | 
				
			||||||
 | 
					    source_str = config.work_dir + config.name;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cmd_str.append("-av");
 | 
				
			||||||
 | 
					    wxString dir_str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (to_cur) {
 | 
				
			||||||
 | 
					        fs::path path(config.work_dir.ToStdString());
 | 
				
			||||||
 | 
					        path.append(config.name.ToStdString());
 | 
				
			||||||
 | 
					        dir_str.append(ConvertToCygwinPath(wxString(path.string())));
 | 
				
			||||||
 | 
					        dir_str.append(" " + cw_work_path);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        fs::path path(cw_work_path.ToStdString());
 | 
				
			||||||
 | 
					        path.append(config.name.ToStdString());
 | 
				
			||||||
 | 
					        dir_str.append(wxString(path.string()));
 | 
				
			||||||
 | 
					        dir_str.append(" " + ConvertToCygwinPath(config.work_dir));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const auto& data : config.exclude) {
 | 
				
			||||||
 | 
					        cmd_str.append(" --exclude=" + data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    cmd_str.append(" ");
 | 
				
			||||||
 | 
					    cmd_str.append(dir_str);
 | 
				
			||||||
 | 
					    wxLogMessage(cmd_str);
 | 
				
			||||||
 | 
					    return cmd_str;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char* argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // 确保当前程序能够与所使用的 wxWidgets 库兼容
 | 
				
			||||||
 | 
					    wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "program");
 | 
				
			||||||
 | 
					    wxInitializer initializer;
 | 
				
			||||||
 | 
					    if (!initializer) {
 | 
				
			||||||
 | 
					        std::cout << "初始化失败。" << std::endl;
 | 
				
			||||||
 | 
					        return -2;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (argc < 3) {
 | 
				
			||||||
 | 
					        std::cout << "需要传入文件夹名称[XXX]及方向[From/To]。" << std::endl;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wxString oper_dir(argv[1]);
 | 
				
			||||||
 | 
					    wxString direct(argv[2]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (direct != "From" && direct != "To") {
 | 
				
			||||||
 | 
					        std::cout << "方向不合法,必须是[From/To]。";
 | 
				
			||||||
 | 
					        return -3;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 读取配置文件 msync.xml
 | 
				
			||||||
 | 
					    const wxStandardPaths& stdpath = wxStandardPaths::Get();
 | 
				
			||||||
 | 
					    wxString exe_path = stdpath.GetExecutablePath();
 | 
				
			||||||
 | 
					    wxFileName file_name(exe_path);
 | 
				
			||||||
 | 
					    work_path = file_name.GetPathWithSep();
 | 
				
			||||||
 | 
					    cw_work_path = ConvertToCygwinPath(work_path);
 | 
				
			||||||
 | 
					    wxString config_path = work_path + "msync.xml";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Configure config;
 | 
				
			||||||
 | 
					    if (!parse_xml(config_path, oper_dir, config)) {
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    auto command = get_cmd(config, direct == "From");
 | 
				
			||||||
 | 
					    wxArrayString output;
 | 
				
			||||||
 | 
					    // 使用 wxExecute 执行命令
 | 
				
			||||||
 | 
					    long result = wxExecute(command, output, wxEXEC_SYNC);
 | 
				
			||||||
 | 
					    wxLogMessage("命令执行结果:%d", result);
 | 
				
			||||||
 | 
					    wxString out_str;
 | 
				
			||||||
 | 
					    for (const auto& data : output) {
 | 
				
			||||||
 | 
					        out_str.append(data + "\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    wxLogMessage("命令输出:%s", out_str);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user