开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3484|回复: 27
收起左侧

[其它源码] 【原创】开源C++内存映射快速替换大文本指定行内容的DLL

[复制链接]
结帖率:83% (5/6)
发表于 2023-5-21 12:16:01 | 显示全部楼层 |阅读模式   黑龙江省哈尔滨市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
QQ图片20230521120754.png
QQ截图20230521120900.png
实测2MB左右的文本直接替换 没有卡顿
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <windows.h>

extern "C" __declspec(dllexport) void replace_Path(char* path, int line, char* content) {
    HANDLE hFile = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::cerr << "Could not open file" << std::endl;
        return;
    }
    HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
    if (hMapFile == NULL) {
        std::cerr << "Could not create file mapping" << std::endl;
        CloseHandle(hFile);
        return;
    }
    char* pBuf = (char*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if (pBuf == NULL) {
        std::cerr << "Could not map view of file" << std::endl;
        CloseHandle(hMapFile);
        CloseHandle(hFile);
        return;
    }
    int currentLine = 1;
    char* p = pBuf;
    char* lineStart = pBuf;
    while (*p != '\0') {
        if (currentLine == line) {
            char* lineEnd = p;
            while (*lineEnd != '\n' && *lineEnd != '\0') {
                lineEnd++;
            }
            size_t len = lineEnd - lineStart;
            std::string newContent(content);
            size_t newLen = newContent.length();
            if (newLen > len) {
                size_t diff = newLen - len;
                size_t fileSize = GetFileSize(hFile, NULL);
                char* newBuf = new char[fileSize + diff];
                memcpy(newBuf, pBuf, lineStart - pBuf);
                memcpy(newBuf + (lineStart - pBuf), newContent.c_str(), newLen);
                memcpy(newBuf + (lineStart - pBuf) + newLen, lineEnd, fileSize - (lineEnd - pBuf));
                UnmapViewOfFile(pBuf);
                CloseHandle(hMapFile);
                SetFilePointer(hFile, fileSize + diff, NULL, FILE_BEGIN);
                SetEndOfFile(hFile);
                hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
                if (hMapFile == NULL) {
                    std::cerr << "Could not create file mapping" << std::endl;
                    CloseHandle(hFile);
                    return;
                }
                pBuf = (char*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
                if (pBuf == NULL) {
                    std::cerr << "Could not map view of file" << std::endl;
                    CloseHandle(hMapFile);
                    CloseHandle(hFile);
                    return;
                }
                memcpy(pBuf, newBuf, fileSize + diff);
                delete[] newBuf;
            }
            else {
                memcpy(lineStart, newContent.c_str(), newLen);
                memmove(lineStart + newLen, lineEnd, strlen(lineEnd) + 1);
            }
            break;
        }
        if (*p == '\n') {
            currentLine++;
            lineStart = p + 1;
        }
        p++;
    }
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    CloseHandle(hFile);
}

DLL调用方法:
QQ截图20230521121048.png
快速替换文本行.zip (8.14 KB, 下载次数: 43)

评分

参与人数 4好评 +3 精币 +8 收起 理由
wa690602724 + 1 感谢分享,很给力!~
易语言资源网 + 1 + 3 开源精神必须支持~
默念、 + 1 + 1 开源精神必须支持~
冰点 + 1 + 3 开源精神必须支持~

查看全部评分


本帖被以下淘专辑推荐:

结帖率:83% (5/6)
 楼主| 发表于 2023-5-21 13:57:15 | 显示全部楼层   黑龙江省哈尔滨市
修复了一下在某些系统下内核不同文本的换行符不同的问题
自动找\r\n或者\n来替换
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <windows.h>

extern "C" __declspec(dllexport) void replace_Path(char* path, int line, char* content) {
    HANDLE hFile = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::cerr << "Could not open file" << std::endl;
        return;
    }
    HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
    if (hMapFile == NULL) {
        std::cerr << "Could not create file mapping" << std::endl;
        CloseHandle(hFile);
        return;
    }
    char* pBuf = (char*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if (pBuf == NULL) {
        std::cerr << "Could not map view of file" << std::endl;
        CloseHandle(hMapFile);
        CloseHandle(hFile);
        return;
    }

    // Check the newline character used in the file
    std::string fileContent(pBuf);
    bool useCRLF = fileContent.find("\r\n") != std::string::npos;

    int currentLine = 1;
    char* p = pBuf;
    char* lineStart = pBuf;
    while (*p != '\0') {
        if (currentLine == line) {
            char* lineEnd = p;
            while (*lineEnd != '\n' && *lineEnd != '\0') {
                lineEnd++;
            }
            size_t len = lineEnd - lineStart;
            std::string newContent(content);
            if (useCRLF) {
                newContent += "\r";
            }
            size_t newLen = newContent.length();
            if (newLen > len) {
                size_t diff = newLen - len;
                size_t fileSize = GetFileSize(hFile, NULL);
                char* newBuf = new char[fileSize + diff];
                memcpy(newBuf, pBuf, lineStart - pBuf);
                memcpy(newBuf + (lineStart - pBuf), newContent.c_str(), newLen);
                memcpy(newBuf + (lineStart - pBuf) + newLen, lineEnd, fileSize - (lineEnd - pBuf));
                UnmapViewOfFile(pBuf);
                CloseHandle(hMapFile);
                SetFilePointer(hFile, fileSize + diff, NULL, FILE_BEGIN);
                SetEndOfFile(hFile);
                hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
                if (hMapFile == NULL) {
                    std::cerr << "Could not create file mapping" << std::endl;
                    CloseHandle(hFile);
                    return;
                }
                pBuf = (char*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
                if (pBuf == NULL) {
                    std::cerr << "Could not map view of file" << std::endl;
                    CloseHandle(hMapFile);
                    CloseHandle(hFile);
                    return;
                }
                memcpy(pBuf, newBuf, fileSize + diff);
                delete[] newBuf;
            }
            else {
                memcpy(lineStart, newContent.c_str(), newLen);
                memmove(lineStart + newLen, lineEnd, strlen(lineEnd) + 1);
            }
            break;
        }
        if (*p == '\n') {
            currentLine++;
            lineStart = p + 1;
        }
        p++;
    }
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    CloseHandle(hFile);
}

回复 支持 反对

使用道具 举报

发表于 2023-8-3 11:26:08 高大上手机用户 | 显示全部楼层   广东省广州市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 20 天

发表于 2023-5-27 14:39:52 | 显示全部楼层   黑龙江省哈尔滨市

开源精神必须支持!
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 17 天

发表于 2023-5-27 08:48:54 | 显示全部楼层   广西壮族自治区玉林市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:83% (5/6)
 楼主| 发表于 2023-5-27 00:23:58 | 显示全部楼层   黑龙江省哈尔滨市
懒人工作室 发表于 2023-5-26 13:26
周末了  希望楼主更新取指定行 删指定行

好的 周末更
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 18 天

发表于 2023-5-26 13:26:00 | 显示全部楼层   陕西省西安市
周末了  希望楼主更新取指定行 删指定行
回复 支持 反对

使用道具 举报

签到天数: 2 天

发表于 2023-5-25 17:01:17 | 显示全部楼层   广东省深圳市
感谢分享
回复 支持 反对

使用道具 举报

发表于 2023-5-24 16:19:13 | 显示全部楼层   黑龙江省牡丹江市
开源精神必须支持~
回复 支持 反对

使用道具 举报

发表于 2023-5-24 10:46:23 | 显示全部楼层   广东省梅州市
努力赚精币。。。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2023-5-24 01:28:52 | 显示全部楼层   湖北省武汉市
非常感谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表