- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
int print_entry(const char* name, const char* dir,const struct stat* st)
{
if(!S_ISDIR(st->st_mode)){
if(S_ISREG(st->st_mode)){
printf("<file type=\"regular file\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
};
if(S_ISCHR(st->st_mode)){
printf("<file type=\"charcter device\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
}
if(S_ISBLK(st->st_mode)){
printf("<file type=\"block device\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
}
if(S_ISFIFO(st->st_mode)){
printf("<file type=\"FIFO(named pipe)\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
}
if(S_ISLNK(st->st_mode)){
char *linkname;
ssize_t r;
char *lname=strcat(dir,"");
linkname = new char[st->st_size + 1];
if (linkname == NULL) {
fprintf(stderr, "insufficient memory\n");
exit(EXIT_FAILURE);
}
r=readlink(lname, linkname, st->st_size + 1);
if (r < 0) {
return 0;
}
if (r > st->st_size) {
fprintf(stderr, "symlink increased in size "
"between lstat() and readlink()\n");
exit(EXIT_FAILURE);
}
linkname[st->st_size] = '\0';
printf("<file type=\"symbolic link\" owner=\"%d\" group=\"%d\" linkname=\"%s\">%s/%s</file>\n",st->st_uid,st->st_gid,linkname,dir,name);
}
if(S_ISSOCK(st->st_mode)){
printf("<file type=\"socket\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
}
}
return 0;
}
int main(int argc, char* argv[])
{
if(argc != 2)
{
fprintf(stderr, "Usage: %s DIR\n", argv[0]);
exit(1);
}
printf("<dir name=\"%s\">\n",argv[1]);
walk(argv[1], print_entry, 1,0);
printf("</dir>",argv[1]);
}
Создание xml файла всех директорий, поддиректорий и их файлов
sayidandrtfm 22.06.2012 21:58 # +2
Автор тот же?
linkname = new char[st->st_size + 1]; - какой ещё С?
int main без return - халтура какая-то.
Вот уж не думал что файл может одновременно быть:
regular file, charcter device, block device, FIFO(named pipe).
vercetti 23.06.2012 00:07 # +3
guest 23.06.2012 09:56 # +5
AliceGoth 23.06.2012 13:17 # +1
bormand 23.06.2012 10:02 # +2
Вдруг злые люди переопределят его, и оно перестанет вбрасывать std::bad_alloc...
rat4 23.06.2012 12:24 # +1
Vindicar 23.06.2012 12:39 # +1
rat4 23.06.2012 12:56 # +2
guest 22.06.2012 21:58 # +3
Lure Of Chaos 22.06.2012 23:49 # +2
defecate-plusplus 22.06.2012 23:50 # +3
AliceGoth 22.06.2012 23:58 # +1
bormand 23.06.2012 07:48 # 0
defecate-plusplus 23.06.2012 08:28 # +6
guest 23.06.2012 10:18 # −8
AliceGoth 23.06.2012 13:08 # −1
bormand 23.06.2012 13:16 # +1
bormand 23.06.2012 13:35 # +3
1) Надо бы выбрать какой-либо приличный стиль форматирования кода и придерживаться его.
2) Если мы пишем на С - то new и delete в нем нет, а есть malloc и free.
3) Всегда компилим код как минимум с -Wall и -Wextra. Они ничего плохого не сделают, а кучу глупых ошибок помогут устранить.
4) return используем в void функциях, return <значение> в остальных (строка 86).
5) strcat портит свой первый аргумент (строка 43) поэтому внимательно читаем man strcat и переделываем как положено.
6) У xml в первой строке желательно поставить декларацию с версией и кодировкой.
bormand 23.06.2012 13:42 # 0
AliceGoth 23.06.2012 13:55 # +1
bormand 23.06.2012 14:20 # 0
Результат, возвращаемый walk, игнорируется.
bormand 23.06.2012 15:01 # 0
sayidandrtfm 23.06.2012 16:24 # +2
Если плюсы, то std::cout, std::cin и иже с ними.
2) linkname = NULL;
Не нужно, скоуп решает.
3) Посмотрите реализацию инициализации-проверки для ваших if'ов в JavaScript
4) Единообразный стиль очень не помешает:
- если exit(EXIT_FAILURE); - то уж везде exit(EXIT_FAILURE);
- формат вывода ошибок
И уже, в конце-то концов http://ftp.gnu.org/gnu/coreutils/ есть такое ls.c
Обратите внимание на книгу «Linux программирование в примерах» А.Роббинс