LinuxForum.Fans
Тема

Программа удаления файлов и каталогов, заданных в argv

Автор: Makarova 9 сообщений 3567 просмотров 🔒 закрыта
#21329

Помогите пожалуйста! учусь на юриста, а задали программу для Linux написать!

Напишите программу удаления файлов и каталогов, заданных в argv. Делайте системный вызов stat, чтобы определить тип файла (файл/каталог). Программа должна отказываться удалять файлы устройств. Для удаления пустого каталога (не содержащего иных имен, кроме "." и "..") следует использовать системный вызов
rmdir(имя_каталога);
(если каталог не пуст - errno получит значение EEXIST); а для удаления обычных файлов (не каталогов)
unlink(имя_файла);
Программа должна запрашивать подтверждение на удаление каждого файла, выдавая его имя, тип, размер в килобайтах и вопрос "удалить ?".

Спасибо, я на связи!!

#21330

учусь на юриста, а задали программу для Linux написать!

и что же за такой предмет, что юристам под линукс кодить приходится? wink

#21336

ну а что, быстро и просто)))

факультет управления, права и информатики, предмет Сист.Програмн.Обеспечения..

#21338

Случаем не институт имени Жмента? :lol:

ну а что, быстро и просто)))

за такое "быстро и просто" предупреждения дают.

#21342

Не, Мфюа))

спасибо, я просто не знаю, как иначе))

#21347

Makarova,
До вечера терпит? Смогу написать только после семи по Москве. Сейчас занят.

#21351

Спасибо большое, я в личку вам отвечу. После 20-00 буду здесь.

#21536

Короче, вот Вам исходники, пробуйте. У меня в первом приближении все работает

text

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>

long FileSize(char *file) { long curpos, length; FILE *stream = fopen(file, "r");

curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); fseek(stream, curpos, SEEK_SET); return length; }

void deldir(char *dir, int depth) { DIR *dp; struct dirent *entry; struct stat statbuf; long filesize = 0; if((dp = opendir(dir)) == NULL) { fprintf(stderr, "Can not open directory: %s\n", dir); return; } chdir(dir); while((entry = readdir(dp)) != NULL) { lstat(entry->d_name, &statbuf); if(S_ISDIR(statbuf.st_mode)) { if(strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0) continue; deldir(entry->d_name, depth + 4); } else { if(S_ISBLK(statbuf.st_mode)||S_ISCHR(statbuf.st_mode)) continue; else { filesize = FileSize(entry->d_name); printf("\n File '%s' size: %d: Do you want to delete it (Y/N?)", entry->d_name, filesize); int ch = getchar(); if((ch == 'Y') || (ch == 'y')) { getchar(); unlink(entry->d_name); fflush(stdin); } else { chdir(".."); closedir(dp); return; } } } } chdir(".."); rmdir(dir); closedir(dp); }

int main (int argc, char **argv) { char topdir[] = "."; if(argc >= 2) { for(int i = 1; i < argc; i++) { deldir(argv[i], 0); } } return 0; }

#21570

Спасибо большое, Hvzh!!! Завтра после 11 вечера сразу попробую!! сообщите пожалуйста инфо, которое я попросила у Вас в ЛС!!!

Войдите или зарегистрируйтесь, чтобы ответить.