开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

123
返回列表 发新帖
楼主: xwwyt
收起左侧

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

[复制链接]
结帖率:83% (5/6)
 楼主| 发表于 2023-5-21 18:20:31 | 显示全部楼层   黑龙江省哈尔滨市

易语言中用可以啊 DLL调用在易语言中不看名称 不需要一致 但是C中要用英文名称
回复 支持 反对

使用道具 举报

结帖率:77% (53/69)

签到天数: 20 天

发表于 2023-5-21 18:11:55 | 显示全部楼层   湖北省武汉市
命令名能否用中文
回复 支持 反对

使用道具 举报

签到天数: 16 天

发表于 2023-5-21 17:38:18 | 显示全部楼层   广东省东莞市
谢谢分享
回复 支持 反对

使用道具 举报

结帖率:73% (8/11)

签到天数: 20 天

发表于 2023-5-21 16:51:10 | 显示全部楼层   河南省焦作市
好像很厉害的样子
回复 支持 反对

使用道具 举报

结帖率: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);
}

回复 支持 反对

使用道具 举报

结帖率:80% (4/5)

签到天数: 2 天

发表于 2023-5-21 13:53:23 | 显示全部楼层   山东省潍坊市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

结帖率:83% (5/6)
 楼主| 发表于 2023-5-21 13:39:07 | 显示全部楼层   黑龙江省哈尔滨市
福仔 发表于 2023-5-21 13:37
这种级别的文本会不会直接读入内存比较快?

圆周率那种的文本是可以的
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 14 天

发表于 2023-5-21 13:37:14 | 显示全部楼层   广西壮族自治区南宁市
这种级别的文本会不会直接读入内存比较快?
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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