© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
(«Радиомир. Ваш компьютер» 8/2004)
Непросто бывает отыскать в куче дискет именно ту, на которой записан нужный файл. В худшем случае для этого приходится просматривать каталоги и подкаталоги всех дискет, пока не найдёшь этот файл или не убедишься в его отсутствии.
Вроде бы на каждой дискете предусмотрена наклейка для записи сведений о
содержимом. Но даже если там записано всё, что надо, то всё равно придётся
перебирать дискеты в поисках нужной, пусть и не просматривая их каталоги. А
ведь ещё и не всегда удобно записывать имена файлов на наклейке: файлов может
быть очень много, к тому же с течением времени какие-то файлы могут быть
удалены,
Я предлагаю вашему вниманию простую программу, позволяющую быстро создать
файл с информацией о содержимом имеющихся у вас дискет (создаваемый файл я
буду далее называть
Программа также позволяет дополнять уже существующий
В создаваемом
Кстати, замечу, что описываемая программа может работать не только с
дискетами, но и с другими сменными носителями информации например,
с
/* =============================
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");
}
Здесь я расскажу о том, как работать с программой, и немного о том, как работает сама программа.
При запуске программы надо указать в командной строке дисковод, с которым
она будет работать (т.е. букву «a»«z» или
«A»«Z») и имя создаваемого
Ниже приведён пример командной строки для случая, когда работаем с
дисководом «a», а
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» для выхода. Как видите, работать с программой не просто, а очень просто. :)
В дальнейшем, когда надо узнать, на какой дискете находится нужный файл,
для этого достаточно отыскать имя этого файла в
Если после создания
Я уже обработал с помощью описанной программы свои дискеты и ощутил заметное облегчение при поиске файлов. Желаю и вам того же. :)