Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX_LEN 255
- HANDLE fileHandle = NULL, mapHandle = NULL;
- LPVOID mapAddr = NULL;
- void createMappingFile() {
- printf("Введите путь к создаваемому файлу\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
- char filePath[MAX_LEN];
- if (fgets(filePath, MAX_LEN, stdin)){
- fflush(stdin);
- filePath[strlen(filePath) - 1] = '\0';
- SECURITY_ATTRIBUTES secAttr = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
- fileHandle = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE, 0, &secAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (fileHandle == INVALID_HANDLE_VALUE) {
- DWORD err = GetLastError();
- if (err == ERROR_FILE_NOT_FOUND)
- printf("Ошибка: файл не существует\n");
- else if (err == ERROR_PATH_NOT_FOUND)
- printf("Ошибка: путь к файлу не существует\n");
- else
- printf("Ошибка: код ошибки %ld\n", err);
- }
- else {
- PLARGE_INTEGER fileSize = (PLARGE_INTEGER)malloc(sizeof *fileSize);
- GetFileSizeEx(fileHandle, fileSize);
- printf("Размер открытого файла: %I64d\n", fileSize -> QuadPart);
- PLARGE_INTEGER mapSize = (PLARGE_INTEGER)malloc(sizeof *mapSize);
- printf("Введите размер проецируемого файла (0 значит, что он равен размеру открытого файла, но если он не 0): ");
- do {
- scanf("%I64d", &(mapSize -> QuadPart));
- fflush(stdin);
- } while ((fileSize -> QuadPart == 0) && (mapSize -> QuadPart == 0));
- char mapName[MAX_LEN];
- printf("Введите имя для проекции файла\n");
- fgets(mapName, MAX_LEN, stdin);
- fflush(stdin);
- mapName[strlen(mapName) - 1] = '\0';
- if (mapHandle)
- CloseHandle(mapHandle);
- mapHandle = CreateFileMappingA(fileHandle, &secAttr, PAGE_READWRITE, mapSize -> HighPart, mapSize -> LowPart, mapName);
- if (!mapHandle)
- printf("Ошибка: код ошибки %ld\n", GetLastError());
- else if (GetLastError() == ERROR_ALREADY_EXISTS)
- printf("Проецируемый файл уже существует");
- free(fileSize);
- free(mapSize);
- CloseHandle(fileHandle);
- }
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода\n");
- }
- }
- void mapView() {
- if (mapAddr)
- UnmapViewOfFile(mapAddr);
- mapAddr = MapViewOfFile(mapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
- if (!mapAddr)
- printf("Ошибка: код ошибки %ld\n", GetLastError());
- else
- printf("Файл успешно спроецирован по адресу %p\n", mapAddr);
- }
- void setData() {
- printf("Введите данные, которые хотите ввести в проецируемый файл: ");
- char buf[MAX_LEN];
- if (fgets(buf, MAX_LEN, stdin)) {
- fflush(stdin);
- buf[strlen(buf) - 1] = '\0';
- if (mapAddr) {
- memcpy(mapAddr, buf, strlen(buf));
- }
- else {
- printf("Ошибка при вводе данных\n");
- }
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода\n");
- }
- }
- int main()
- {
- int flag = 1;
- system("chcp 65001");
- do {
- printf("Добро пожаловать! Выберите действие:\n1 - Создание проецируемого файла\n2 - Проецирование фрагмента файла в память\n"
- "3 - Запись данных в проецируемый файл\n4 - Выход\n");
- char c = getchar();
- fflush(stdin);
- switch (c){
- case '1':
- createMappingFile();
- break;
- case '2':
- mapView();
- break;
- case '3':
- setData();
- break;
- case '4':
- printf("Выход из программы\n");
- if (mapHandle)
- CloseHandle(mapHandle);
- if (mapAddr)
- UnmapViewOfFile(mapAddr);
- flag = 0;
- break;
- default:
- printf("Неправильный ввод, попробуйте еще раз\n");
- }
- } while (flag);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement