Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

Программа — каталогизатор дисков

Радиомир. Ваш компьютер» 8/2004)

Введение

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

Вроде бы на каждой дискете предусмотрена наклейка для записи сведений о содержимом. Но даже если там записано всё, что надо, то всё равно придётся перебирать дискеты в поисках нужной, пусть и не просматривая их каталоги. А ведь ещё и не всегда удобно записывать имена файлов на наклейке: файлов может быть очень много, к тому же с течением времени какие-то файлы могут быть удалены, какие-то новые файлы могут быть добавлены…

Я предлагаю вашему вниманию простую программу, позволяющую быстро создать файл с информацией о содержимом имеющихся у вас дискет (создаваемый файл я буду далее называть «файл-список»). Впоследствии с помощью этого файла-списка вы легко сможете узнать, на какой дискете находится нужный файл.

Программа также позволяет дополнять уже существующий файл-список (например, появилась у вас новая дискета — вы добавили информацию о ней). Можно создать и несколько файлов-списков: например, в одном будет информация о содержимом трёхдюймовых дискет, а в другом — о пятидюймовых дискетах.

В создаваемом файле-списке для каждой обработанной дискеты хранится введённый пользователем комментарий и список всех находящихся на этой дискете файлов — в таком же виде, как при просмотре каталога дискеты с помощью команды «dir». Эта информация хранится в виде обычного текста. Таким образом, вы можете работать с файлом-списком (производить просмотр, поиск, редактирование, печать информации), используя уже имеющиеся у вас программы для работы с текстовыми файлами.

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

Текст программы

/* =============================
     File: "disk_cat.c"
     Compiler: Turbo C 2.0
 ============================= */

#include <stdio.h>
#include <stdlib.h>

void main (int argc, char *argv[])
{
 FILE *f_tmp, *f_dst;
 int i,c,key;
 char *dir_str= "dir /s ?:\\ >disk_cat.tmp"; /* В dir_str[7] будет имя диска. */
 char *view_str="more disk_cat.tmp";
 char comment[68]={65};

 printf ("\nDisk_Cat by Ivan Roshin, 20.09.2003.");

 if (argc<3) {printf ("\nSyntax: disk_cat.exe drive destiny-file\n"); exit(0);}

 /* Проверяем правильность имени диска: должна быть одна буква a-z или A-Z. */
 if ((((argv[1][0]<'a')||(argv[1][0]>'z'))&&
      ((argv[1][0]<'A')||(argv[1][0]>'Z')))||(argv[1][1]!=0))
 {printf ("\nIncorrect drive!\n"); exit(0);}
 /* Подставляем имя диска в строку с командой DIR. */
 dir_str[7]=argv[1][0];

 f_dst=fopen(argv[2],"ab");
 if (f_dst==NULL) {printf ("\nCan't open destiny file!\n"); exit(0);}

m1: /* Главный цикл. */
 printf ("\n\nInsert new disk and press ENTER, or press ESC for exit.\n");
 do {
  key=getch();
  if (key==27) goto m2; /* Нажата ESC - выходим. */
 } while (key!=13);     /* Иначе ждём, пока не будет нажата ENTER. */

 /* Читаем каталог во временный файл. */
 printf ("Reading catalog... ");
 if (system(dir_str)!=0) {printf ("\nError with command 'DIR'!\n"); exit (0);}

 printf ("\nPress V for view catalog or press ENTER for continue.");
 do {
  key=getch();
 } while ((key!='v')&&(key!='V')&&(key!=13));

 if ((key=='v')||(key=='V'))
 { /* Просмотр каталога. */
  if (system(view_str)!=0)
  {printf ("\nError with command 'MORE'!\n"); exit (0);}
 }

 printf ("\nEnter comment: ");
 cgets (comment); /* Комментарий будет начинаться с comment+2. */

 /* Добавляем комментарий в формируемый текстовый файл. */
 if (fputs("\r\n***** ",f_dst)==EOF)    /* Символы перед комментарием. */
 {printf ("Can't write to destiny file!\n"); exit(0);}
 if (fputs(comment+2,f_dst)==EOF)       /* Сам комментарий. */
 {printf ("Can't write to destiny file!\n"); exit(0);}
 if (fputs("\r\n",f_dst)==EOF)          /* Перевод строки. */
 {printf ("Can't write to destiny file!\n"); exit(0);}

 /* Добавляем прочитанный каталог, который сейчас во временном файле,
    в формируемый текстовый файл. */
 f_tmp=fopen("disk_cat.tmp","rb");
 if (f_tmp==NULL) {printf ("Can't open temp file!\n"); exit(0);}
 while ((c=fgetc(f_tmp))!=EOF)
 {
  if (fputc(c,f_dst)==EOF)
  {printf ("Can't write to destiny file!\n"); exit(0);}
 }

 if ferror(f_tmp) {printf ("Can't read from temp file!\n"); exit(0);}
 if (fclose(f_tmp)==EOF) {printf ("Can't close temp file!\n"); exit(0);}
 if (unlink("disk_cat.tmp")!=0) {printf ("Can't delete temp file!\n"); exit(0);}

 goto m1; /* К началу главного цикла. */

m2: /* Завершение работы. */
 if (fclose(f_dst)==EOF) printf ("Can't close destiny file!\n");
}
Скачать исполняемый файл программы (для DOS) (9 КБ ZIP)
Скачать листинг программы в текстовом виде (1 КБ ZIP)

Руководство пользователя

Здесь я расскажу о том, как работать с программой, и немного о том, как работает сама программа.

При запуске программы надо указать в командной строке дисковод, с которым она будет работать (т.е. букву «a»—«z» или «A»—«Z») и имя создаваемого файла-списка (он создаётся в текущем каталоге). Если файл-список с таким именем уже существует, то информация будет дописана к нему.

Ниже приведён пример командной строки для случая, когда работаем с дисководом «a», а файл-список — «catalog.txt».

disk_cat.exe a catalog.txt

После запуска программы вы увидите следующие строки:

Disk_Cat by Ivan Roshin, 20.09.2003.

Insert new disk and press ENTER, or press ESC for exit.

Соответственно, для обработки очередной дискеты вставляйте её и нажимайте «Enter», а для завершения работы с программой нажимайте «Esc».

После нажатия «Enter» программа начнёт чтение каталога дискеты. Для этого вызывается стандартная команда «dir» с параметром «/s» (чтобы выводился список файлов не только из корневого каталога, но и из всех подкаталогов). Вывод этой команды перенаправляется во временный файл.

Далее программа предложит:

Press V for view catalog or press ENTER for continue.

Тут всё просто: если хотите просмотреть только что прочитанный каталог — нажимайте «V», в противном случае — «Enter».

Для просмотра каталога программа вызывает команду «more», передавая ей в качестве параметра имя временного файла, куда перед этим был перенаправлен вывод команды «dir». Если каталог длинный, он будет отображаться постранично (для перехода к следующей странице достаточно нажать любую клавишу).

Следующий этап — ввод комментария к дискете, каталог которой был прочитан. На экране появляется приглашение:

Enter comment:

Длина вводимого комментария ограничена 64 символами (но впоследствии, при редактировании файла-списка в текстовом редакторе, вы можете сделать комментарий любой длины).

Комментарий может содержать номер дискеты (если дискеты у вас пронумерованы) и краткое описание содержимого дискеты. Можно и ничего не вводить, просто нажав «Enter».

Введённый комментарий записывается в формируемый файл-список, предваряясь псевдографическими символами «*****», что позволяет впоследствии при просмотре этого файла быстро находить в нём комментарии. Следом за комментарием в файл-список копируется содержимое временного файла с каталогом дискеты.

После этого программа опять вернётся к началу главного цикла, т.е. предложит либо вставить очередную дискету и нажать «Enter», либо нажать «Esc» для выхода. Как видите, работать с программой не просто, а очень просто. :–)

В дальнейшем, когда надо узнать, на какой дискете находится нужный файл, для этого достаточно отыскать имя этого файла в файле-списке и посмотреть соответствующий комментарий. Если у вас дискеты пронумерованы и в комментарии вы указывали номер дискеты, то после этого остаётся лишь достать дискету с этим номером.

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

Я уже обработал с помощью описанной программы свои дискеты и ощутил заметное облегчение при поиске файлов. Желаю и вам того же. :–)

Страница Ивана Рощина > Статьи >