Шаг 99.
Microsoft Visual C++ 2010. Начала.
Консольное приложение. Создание консольного приложения

    На этом шаге мы рассмотрим основные этапы создания такого приложения.

    Для того чтобы создать консольное приложение, надо в меню File (Файл) выбрать команду New Project (Создать | Проект), в появившемся окне New Project (Создать проект) выбрать CLR Console Application (Консольное приложение CLR), в поле Name (Имя) ввести имя проекта (рисунок 1) и нажать кнопку OK.


Рис.1. Начало работы над консольным приложением

    В результате этих действий станет доступным окно редактора кода, в котором можно набирать текст программы.

    В качестве примера ниже приведен текст консольного приложения — утилиты clear, которая удаляет из каталога, указанного при запуске утилиты, и всех его подкаталогов tmp-файлы. Также, если при запуске утилиты указан ключ –CLEARDEBUG, утилита удаляет все файлы из всех подкаталогов Debug. Так как операция удаления является потенциально опасной, то утилита запрашивает у пользователя подтверждение на выполнение. Причем, чтобы операция очистки была начата, необходимо ввести Y, ввод любого другого символа, в том числе y, отменяет операцию. Основную работу — удаление файлов выполняет рекурсивная функция сlear. Сначала она обрабатывает (удаляет tmp-файлы) текущий каталог, затем формирует список подкаталогов текущего каталога, делает текущим первый (по номеру элементов списка) подкаталог и вызывает себя (рекурсия) для обработки этого подкаталога.

// Clear.cpp: главный файл проекта.

#include "stdafx.h"

using namespace System;

using namespace System::IO;
int nDel = 0; // кол-во удаленных файлов
bool debug = true; // true - только сообщение о выполнении

// операции удаления
bool clearDebug = false; // очистка каталогов Debug
// Очистка текущего каталога и всех его подкаталогов.

// Рекурсивная функция
int Clear()
{
	array<System::String^> ^Directories; // подкаталоги текущего каталога
	array<System::String^> ^Files; // файлы, которые надо удалить
	int n;
	int i;

	if (debug)
		Console::WriteLine("Текущий каталог: " +
		System::IO::Directory::GetCurrentDirectory()->ToString());

	if (clearDebug)
	{
		int p = System::IO::Directory::GetCurrentDirectory()->
			ToString()->LastIndexOf('\\');
		String^ aFolder =
			System::IO::Directory::GetCurrentDirectory()->
			ToString()->Substring(p+1);

		if (aFolder == "Debug")
			// удалить все файлы из каталога Debug
			Files = Directory::GetFiles
			(System::IO::Directory::GetCurrentDirectory(),"*.*");
		else
			Files = Directory::GetFiles
			(System::IO::Directory::GetCurrentDirectory(),"*.tmp");
	}
	else
	{
		// удалить tmp-файлы из текущего каталога
		Files = Directory::GetFiles
			(System::IO::Directory::GetCurrentDirectory(),"*.tmp");
	}

	int nf = Files->Length;
	for (i = 0; i < nf; i++)
	{
		if (! debug)
			// УДАЛЕНИЕ ФАЙЛОВ
			System::IO::File::Delete(Files[i]);
		Console::WriteLine(Files[i] + " - удален");
		nDel = nDel +1;
	}
	
	// обработать подкаталоги
	if (debug)
		Console::WriteLine("Подкаталоги:");
	Directories =
		Directory::GetDirectories(Directory::GetCurrentDirectory());
	n = Directories->Length;
	for (i = 0; i < n; i++)
	{
		if (debug)
			Console::WriteLine(Directories[i]);
		Directory::SetCurrentDirectory(Directories[i]);
		Clear();
	}

	if (debug)
		Console::WriteLine("Обработан!");
	return 0;
}

int main(array<System::String ^> ^args)
{
	String^ path;
	char r; // ответ пользователя: Y или N

	Console::WriteLine("Очистка диска");
	// проверим, указано ли имя файла теста
	if (args->Length == 0)
	{
		Console::WriteLine("Ошибка: Надо задать каталог.");
		Console::WriteLine("Команда: clear <Каталог> [-CLEARDEBUG]");
		Console::WriteLine("-CLEARDEBUG - очистка каталогов Debug\n");
		Console::Write("Нажмите <Enter>");
		Console::ReadLine();
		return -1;
	}

	path = args[0];
	if ((args->Length >1) && (args[1] == "-CLEARDEBUG"))
		clearDebug = true;

	// проверим, существует ли указанный каталог
	try
	{
		Directory::SetCurrentDirectory(path);
	}
	catch (System::IO::DirectoryNotFoundException^ ex)
	{
		Console::WriteLine("Каталог " + path +" не найден");
		//Console.WriteLine(e.Message);
		Console::Write("Нажмите <Enter>");
		Console::ReadLine();
		return -1;
	}

	if (clearDebug)
	{
		Console::WriteLine
			("Программа удалит все файлы из подкаталогов Debug");
		Console::WriteLine("каталога "+ path+ " и всех его подкаталогов.");
	}
	else
	{
		Console::WriteLine("Программа удалит tmp-файлы");
		Console::WriteLine("из каталога "+ path+
			" и всех его подкаталогов.");
	}

	Console::Write("Выполнить? (Y/N) ");
	r = Console::Read();
	Console::ReadLine(); // дочитать из буфера ввода
	if (r != 'Y')
	{
		Console::Write("Отмена операции\nНажмите <Enter>");
		Console::ReadLine();
		return -1;
	}
	int res = Clear();
	Console::WriteLine("Удалено файлов: "+ nDel.ToString());
	Console::WriteLine("Работа выполнена!");
	Console::Write("Нажмите <Enter>");
	Console::ReadLine();
	return 0;
}
Архив проекта можно взять здесь.

    Построение консольного приложения выполняется обычным образом, т. е. выбором в меню Build (Построение) команды Build Solution (Построить решение).

    После успешной компиляции программу можно запустить. Для этого надо в меню Debug (Отладка) выбрать команду Start Debugging (Начать отладку) или Start Without Debugging (Запуск без отладки).

    Если программа должна получать параметры из командной строки, то при ее запуске из среды разработки параметры надо ввести в поле Command Arguments (Аргументы команды) раздела Configuration Properties (Свойства конфигурации) | Debugging (Отладка) окна Property Page (Страницы свойств) (рисунок 2), которое становится доступным в результате выбора в меню Project (Проект) команды Properties (Свойства проекта).


Рис.2. При запуске программы из среды разработки параметры командной строки надо ввести в поле Command Arguments (Аргументы команды)

    Следует обратить внимание: если в строке-параметре есть пробелы, то ее надо заключить в двойные кавычки.

    На следующем шаге мы рассмотрим запуск консольного приложения.




Предыдущий шаг Содержание Следующий шаг