[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);
}