出版
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