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
- typedef struct {
- OVERLAPPED overlap;
- LPVOID buf;
- } BUF, *LPBUF;
- VOID WINAPI CompletionWrite(DWORD, DWORD, LPOVERLAPPED);
- VOID WINAPI CompletionRead(DWORD, DWORD, LPOVERLAPPED);
- HANDLE exFile, newFile;
- DWORD cluster = 4096;
- int counter = 0;
- VOID WINAPI CompletionWrite(DWORD err, DWORD bytes, LPOVERLAPPED lpOverlap) {
- ++counter;
- LPBUF lpBuf;
- lpBuf = (LPBUF)lpOverlap;
- if (err == ERROR_SUCCESS) {
- LARGE_INTEGER temp;
- temp.LowPart = lpBuf -> overlap.Offset;
- temp.HighPart = lpBuf -> overlap.OffsetHigh;
- temp.QuadPart += cluster;
- lpBuf -> overlap.Offset = temp.LowPart;
- lpBuf -> overlap.OffsetHigh = temp.HighPart;
- ReadFileEx(exFile, lpBuf -> buf, cluster, (LPOVERLAPPED)lpBuf, (LPOVERLAPPED_COMPLETION_ROUTINE)CompletionRead);
- }
- }
- VOID WINAPI CompletionRead(DWORD err, DWORD bytes, LPOVERLAPPED lpOverlap) {
- ++counter;
- LPBUF lpBuf;
- lpBuf = (LPBUF)lpOverlap;
- if (err == ERROR_SUCCESS)
- WriteFileEx(newFile, lpBuf -> buf, cluster, (LPOVERLAPPED)lpBuf, (LPOVERLAPPED_COMPLETION_ROUTINE)CompletionWrite);
- }
- HANDLE fileCreate() {
- char filePath[MAX_LEN];
- HANDLE fileHandle = NULL;
- 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, 0, &secAttr,
- OPEN_ALWAYS, FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING | FILE_ATTRIBUTE_NORMAL, NULL);
- if (fileHandle == INVALID_HANDLE_VALUE) {
- DWORD err = GetLastError();
- if (err == ERROR_PATH_NOT_FOUND)
- printf("Ошибка: путь к файлу не существует\n");
- else
- printf("Ошибка: код ошибки %ld\n", err);
- }
- else if (GetLastError() == ERROR_ALREADY_EXISTS)
- printf("Файл открыт\n");
- else
- printf("Файл создан\n");
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- return fileHandle;
- }
- int main()
- {
- printf("Введите путь к копируемому файлу\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
- exFile = fileCreate();
- printf("Введите путь к новому файлу\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
- newFile = fileCreate();
- printf("Введите кратность размера блока (1 кластер, 2 кластера и т.п.): ");
- DWORD num;
- scanf("%ld", &num);
- fflush(stdin);
- cluster = cluster * num;
- printf("Введите число операций ввода-вывода: ");
- scanf("%ld", &num);
- fflush(stdin);
- LPBUF lpBuf = (LPBUF)malloc(sizeof *lpBuf);
- PLARGE_INTEGER fileSize = (PLARGE_INTEGER)malloc(sizeof *fileSize);
- if (!GetFileSizeEx(exFile, fileSize)) {
- DWORD err = GetLastError();
- printf ("Ошибка: код ошибки %ld\n", err);
- }
- else {
- int opnumber = 2*(fileSize->QuadPart/cluster + (fileSize->QuadPart % cluster != 0));
- LARGE_INTEGER temp;
- temp.QuadPart = 0;
- LARGE_INTEGER t1, t2, dt, freq;
- QueryPerformanceFrequency(&freq);
- QueryPerformanceCounter(&t1);
- for (int i = 0; i < num; ++i, temp.QuadPart += cluster) {
- lpBuf -> overlap.Offset = temp.LowPart;
- lpBuf -> overlap.OffsetHigh = temp.HighPart;
- lpBuf -> buf = (char *)malloc(cluster * sizeof * (lpBuf -> buf));
- ReadFileEx(exFile, lpBuf -> buf, cluster, (LPOVERLAPPED)lpBuf, (LPOVERLAPPED_COMPLETION_ROUTINE)CompletionRead);
- }
- while (counter < opnumber)
- SleepEx(INFINITE, TRUE);
- QueryPerformanceCounter(&t2);
- dt.QuadPart = t2.QuadPart - t1.QuadPart;
- dt.QuadPart *= 1000000;
- dt.QuadPart /= freq.QuadPart;
- printf("Время работы: %I64d мкс", dt.QuadPart);
- SetFilePointerEx(newFile, *fileSize, NULL, FILE_BEGIN);
- SetEndOfFile(newFile);
- }
- CloseHandle(exFile);
- CloseHandle(newFile);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement