• В программировании нет ничего сложного, если вы понимаете задачу и принципы её решения.

CF (Create File)

Необходимость написания этой простенькой программы возникла еще примерно в 1990 году, даже раньше. Задача была очень простая: при необходимости быстро и просто (программно) создавать новый пустой файл для последующей работы с ним.

Дело в том, что задача создания пустого файла с заданным именем в отрыве от какого-то приложения для работы с файлами хоть и не стоит столь остро, практически не решена ни в одной консольной оболочке DOS-Windows систем. Даже в файловом менеджере Far существует, как и везде, команда создания новой папки, но команды создания нового файла нет. (Функция создания новых пустых файлов из контекстного меню появилась только в проводнике Windows, да и то не сразу.)

Тогда же, в 1990 году наряду с многими мелкими утилитами (например, была создана утилита надежного стирания файлов с гарантированным уничтожением информации, существенно превосходившая по качеству удаления и скорости работы Nurton Utilities) была написана и эта простенькая программа. Написана она была на языке C с использованием популярной тогда IDE от фирмы Borland Turbo С 2.0 под операционную систему MS DOS. Вот её исходный текст:

#include <stdio.h>

FILE *f1;

int main(int narg, char *arg[])
{
	if(narg<2)
	{
		printf("Need filename!\r\nCommand line format: CF.COM <filename>\r\n");
		return 1;
	}

	if((f1=fopen(arg[1],"r"))!=NULL)
	{
		fclose(f1);
		printf("The file %s is allredy exists!\r\n",arg[1]);
		return 1;
	}

	if((f1=fopen(arg[1],"wa"))==NULL)
	{
		printf("Cannot create file %s\r\n",arg[1]);
		return 1;
	}

	fclose(f1);
	return 0;
}

Вплоть до настоящего времени она использовалась практически без изменений, за исключением того, что затем была переписана под MS Windows для 32-х, а затем и 64-х разрядных версий. Не так давно в качестве учебного примера мы переписали её под IDE Pelles C, очень удобную и легкую IDE для программирования на языке C.

#include <stdio.h>

FILE *f1;

int main(int narg, char *arg[])
{
	char cr[] = "Creating File utility (c) 1992-2021 DAE'S Software\r\n";
	char pk[] = "\r\nPress any key to continue...";

	if(narg<2)
	{
		printf("%sNeed filename for creation!\r\nCommand line format: CF.EXE <filename>%s",cr,pk);
		getchar();
		return 1;
	}

	if((f1=fopen(arg[1],"r"))!=NULL)
	{
		fclose(f1);
		printf("%sThe file %s is already exists!%s",cr,arg[1],pk);
		getchar();
		return 1;
	}

	if((f1=fopen(arg[1],"a"))==NULL)
	{
		fclose(f1);
		printf("%sCannot create file %s%s",cr,arg[1],pk);
		getchar();
		return 1;
	}

	fclose(f1);
	return 0;
}

Как видно из текста, функционально программа за это время никак не изменилась, добавились лишь некоторые «украшения».

Когда мы начали использовать для обучения детей MS Small Basic, в какой-то момент появилась мысль реализовать эту простую, и в то же время полезную с точки зрения понимания функций работы с файлами программу на языке Small Basic, что мы и сделали.

Кроме того, мы изменили в программе режим работы по умолчанию: теперь при вызове программы без параметров она обязательно создает текстовый файл с именем «newN.txt», где N — целое число 0, 1 и т.п. (в зависимости от того, какое имя файла на данный момент «свободно»). Таким образом, запустив программу в консоли несколько раз (несколько раз нажав на клавиатуре три клавиши: «C»,»F» и «Enter») мы получим несколько новых пустых файлов с расширением «txt» и последовательно пронумерованными именами. То же самое мы получим, запуская программу двойным кликом мышки из проводника Windows.

Эта версия программы имеет номер 2.

' Программа создания пустого файла с заданным именем из командной строки

Title = "Creating File utility v.2 (c) 1992-2021 DAE'S Software\r\n" ' название программы

Fname = "" ' имя файла
n = 0 ' счетчик для имени файла

if Program.ArgumentCount < 1 Then ' если в командной строке не указано имя файла  
    ' Старое поведение - работа без умолчания ***
    'TextWindow.WriteLine(Title) ' выводим название
    'TextWindow.WriteLine("") ' пропускаем строку
    'TextWindow.WriteLine("Need filename for creation!") ' пишем, что нужно имя файла
    'TextWindow.WriteLine("Command line format: CF.EXE <filename>") ' 
    'TextWindow.Pause() ' предлагаем нажать клавишу для завершения
    'Program.End() ' завершаем программу
    
   ' создаем имя файла "по умолчанию"
    While LDFile.Exists("new" + n + ".txt") ' ищем "свободное" имя файла
        n = n + 1 ' увеличиваем до тех пор, пока не встретим "свободное" имя файла
    EndWhile
    Fname = "new" + n + ".txt" ' создаем подошедшее имя файла "по умолчанию"
Else
    Fname = Program.GetArgument(1) ' иначе - берём то, что указано вкомандной строке
EndIf

If LDFile.Exists(Fname) Then ' если файл с указанным именем уже существует
    TextWindow.WriteLine(Title) ' выводим название
    TextWindow.WriteLine("") ' пропускаем строку
    TextWindow.WriteLine("The file " + Program.GetArgument(1) + " is already exists!") ' 
    TextWindow.Pause() ' предлагаем нажать клавишу для завершения
    Program.End() ' завершаем программу
EndIf

If File.WriteContents(Fname,"") = "FAILED" Then ' если файл с указанным именем не удается создать
    TextWindow.WriteLine(Title) ' выводим название
    TextWindow.WriteLine("") ' пропускаем строку
    TextWindow.WriteLine("Cannot create file " + Program.GetArgument(1)) ' сообщаем об ошибке
    TextWindow.Pause() ' предлагаем нажать клавишу для завершения
EndIf

Program.End() ' завершаем программу

Для упрощения кода мы воспользовались здесь функцией проверки существования файла по имени LDFile.Exists()из библиотеки расширения LitDev.

Программу можно скомпилировать самим или скачать на нашем сайте по ссылкам (Версия 1 и Версия 2) или на странице Ссылок для скачивания. Установки она не требует и может быть запущена откуда угодно. В версии 2 (последний вариант — программа написана на MS Small Basic) ей для работы кроме исполняемого файла (cf.exe) ей нужны еще два файла динамических библиотек: SmallBasicLibrary.dll и LitDev.dll, лежащие в той же папке, что и исполняемый файл. И конечно же, обязательно установить MS .NET Framework, без которого не будет работать ни одна программа, написанная на MS SmallBasic.

Поделиться: