
- •Цель работы
- •Задание кафедры
- •Краткие теоретические сведения
- •Описание экспериментальной установки и методики эксперимента
- •Экспериментальные результаты
- •Листинг программы
- •Анализ полученных результатов
- •Список источников
- •Харт, Джонсон, м. Системное программирование в среде Windows, 3-е издание. : Пер. С англ. – м. : Издательский дом «Вильямс», 2005. – 592с. Ил.
-
Экспериментальные результаты
Результатом выполнения лабораторной работы является программа на языке С/C++, которая представляет собой полноценный интерпретатор командной строки с возможностью перенаправления стандартного ввода/вывода. Программный текст разделен на две функции: функцию main, выполняющую основную работу по получению команды пользователя и ее обработке, и функцию DeleteFiles, которая выполняет поиск заданного пользователем слова в заданных им же файлах и удаляет по его требованию те из них, где это слово встретилось больше заданного количества раз. (функция реализована согласно варианту).
-
Листинг программы
#include "stdafx.h"
#include <windows.h>
#include <locale.h>
#include <conio.h>
#include <io.h>
#include <fcntl.h>
void DeleteFiles(int argc, WCHAR **params);
int _tmain()
{
setlocale(LC_ALL,"Russian");
WCHAR Start_String[256], **parsed_string;
HANDLE console, file;
int oldDescr,newDescr;
bool output_file = false;
DWORD fact, argc;
STARTUPINFO si;
PROCESS_INFORMATION pi;
for(;;)
{
argc = 1;
printf("\n$");
fflush(stdout);
console = GetStdHandle(STD_INPUT_HANDLE);
ReadConsole(console,Start_String,256,&fact,NULL);
Start_String[fact-2]='\0';
for(DWORD i=0;i<wcslen(Start_String);i++)
if(Start_String[i]==' ') argc++;
if(!wcscmp(Start_String,L"exit"))
{
CloseHandle(console);
return 0;
}
parsed_string = (WCHAR **)malloc(sizeof(WCHAR *)*argc);
for(DWORD i=0;i<argc;i++)
{
parsed_string[i] = (WCHAR *)malloc(sizeof(WCHAR)*64);
memset(parsed_string[i],'\0',64);
}
for(DWORD k=0,i=0,j=0;k<wcslen(Start_String);k++)
{
if(Start_String[k]!=' ')
{
parsed_string[i][j] = Start_String[k];
j++;
}
else
{
j=0; i++;
}
}
if(!wcscmp(parsed_string[argc-1],_T("-f")))
{
file = CreateFile(_T("output.txt"), GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
console = GetStdHandle(STD_OUTPUT_HANDLE);
SetStdHandle(STD_OUTPUT_HANDLE, file);
oldDescr = _dup(1);
newDescr = _open_osfhandle((intptr_t)file, _O_APPEND );
_dup2(newDescr, 1);
output_file = true;
}
if(!wcscmp(parsed_string[0],_T("delfiles")))
DeleteFiles(argc,parsed_string);
else
{
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
if(CreateProcess(NULL, Start_String, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, 200);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
else _tprintf(L"\"%s\" не является внутренней или внешней\nкомандой, исполнямой программой или пакетным файлом\n",parsed_string[0]);
}
fflush( stdout );
if(output_file)
{
CloseHandle(file);
SetStdHandle(STD_OUTPUT_HANDLE, console);
_dup2(oldDescr, 1 );
output_file = false;
}
memset(Start_String,'\0',256);
free(parsed_string);
}
}
void DeleteFiles(int argc, WCHAR **params)
{
HANDLE fp;
DWORD fact, count, kolvo_vh;
CHAR Buffer[256];
wint_t ch;
DWORD search_word_length;
if(argc < 5 || argc > 11){
printf("Неверное количество параметров. Попробуйте снова\n");
return;
}
search_word_length = wcslen(params[1]);
DWORD k = _wtoi(params[argc-2]);
for(int i=2;i<(argc-2);i++)
{
fp = CreateFile(params[i],GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if(fp == INVALID_HANDLE_VALUE) {
printf("Ошибка открытия файла %ws. Возможно, такой файл не существует в данной директории.\n",params[i]);
return;
}
memset(Buffer,'\0',256);
ReadFile(fp,Buffer,256,&fact,NULL);
kolvo_vh = count = 0;
for(unsigned int j=0;j<fact;j++)
{
if(Buffer[j]!=params[1][count])
{
count = 0;
continue;
}
count++;
if((count+1) == search_word_length)
{
count = 0;
kolvo_vh++;
}
}
if(kolvo_vh > k)
{
printf("Файл %ws содержит более %d вхождений слова %ws. Удалить его? (y/n)\n",params[i],k,params[1]);
do{
ch = getwchar();
switch(ch){
case 'y':
CloseHandle(fp);
DeleteFile(params[i]);
printf("Файл %ws успешно удален.\n",params[i]);
break;
case 'n':
printf("Файл %ws не будет удален по Вашему требованию.\n",params[i]);
CloseHandle(fp);
break;
default:
printf("Введите либо 'y', либо 'n' (без кавычек).\n");
}
}while(ch != 'y' && ch != 'n');
}
else
{
printf("Файл %ws содержит %d вхождений слова %ws. Он не требует удаления.\n",params[i],kolvo_vh,params[1]);
CloseHandle(fp);
}
}
}