Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Информация о файле


Автор: T0ohtik 27.5.2009, 20:34
Привет. В моей программе надо определить по списку является ли путь папкой или файлом. Для этой цели я использую вызов stat, который возвращает -1. И переменная errno устанавливается в 13 Permisson denied. Права на файл выставлены корректно 777. В чем может скрываться проблема? Какие еще есть способы взять получить информацию о файле?

Автор: azesmcar 27.5.2009, 20:39
Цитата(T0ohtik @  27.5.2009,  20:34 Найти цитируемый пост)
надо определить по списку является ли путь папкой или файлом

http://linux.die.net/man/3/opendir сойдет?
Цитата

Return Value
The opendir() function returns a pointer to the directory stream. On error, NULL is returned, and errno is set appropriately.
Errors

EACCES
    Permission denied. 
EMFILE
    Too many file descriptors in use by process. 
ENFILE
    Too many files are currently open in the system. 
ENOENT
    Directory does not exist, or name is an empty string. 
ENOMEM
    Insufficient memory to complete the operation. 
ENOTDIR
    name is not a directory.



Автор: MAKCim 27.5.2009, 20:40
Цитата(T0ohtik @  27.5.2009,  20:34 Найти цитируемый пост)
Какие еще есть способы взять получить информацию о файле? 

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

Добавлено через 58 секунд
Цитата(T0ohtik @  27.5.2009,  20:34 Найти цитируемый пост)
Права на файл выставлены корректно 777

а на каталог, который содержит это файл/каталог?

Автор: T0ohtik 27.5.2009, 21:37
Цитата(MAKCim @ 27.5.2009,  20:40)
Цитата(T0ohtik @  27.5.2009,  20:34 Найти цитируемый пост)
Какие еще есть способы взять получить информацию о файле? 

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

Добавлено @ 20:41
Цитата(T0ohtik @  27.5.2009,  20:34 Найти цитируемый пост)
Права на файл выставлены корректно 777

а на каталог, который содержит это файл/каталог?

хм, а вот об этом не подумал. Завтра гляну. Кстати, забыл написать, что для 3  из 7 путей нормально определяется.

Автор: T0ohtik 28.5.2009, 11:34
С opendir тоже самое. Права на каталог, содержащий файлы каталоги 750.

Автор: azesmcar 28.5.2009, 14:23
Цитата(T0ohtik @  28.5.2009,  11:34 Найти цитируемый пост)
С opendir тоже самое. Права на каталог, содержащий файлы каталоги 750. 

Код в студию.

Добавлено через 1 минуту и 15 секунд
Цитата(T0ohtik @  28.5.2009,  11:34 Найти цитируемый пост)
Права на каталог, содержащий файлы каталоги 750. 

а owner каталогов кто?

Автор: T0ohtik 28.5.2009, 18:17
Раз дошло дело до кода, тогда сразу хочу предупредить, что это все делается под iPhone.
Запускается все от имени mobile (проверял при помощи getenv("USER"))
Права на папку, содержимое которой я хочу просмотреть:
[quote]
drwxr-x---  9 mobile mobile  442 May 28 12:53 Media/
[/qote]
Права на содержимое папки Media
Цитата

drwxr-xr-x 2  mobile mobile      68 May 28 17:37 ApplicationArchives/
drwxr-x--- 6  mobile mobile     204 May 25 12:23 DCIM/
drwxr-x--- 2  mobile mobile     102 Jan 13 17:15 Downloads/
-rw-r--r--  1  mobile mobile 1482481 May 28 12:53 IMG_0489.jpg
drwxr-x--- 2  mobile mobile      68 Aug 13  2008 Photos/
-rwxr-xr-x 1  mobile mobile   58860 May 27 18:21 Picture\ 1.png*
drwxr-xr-x 4  mobile mobile     136 May 28 17:37 PublicStaging/
drwxr-xr-x 2  mobile mobile      68 Jan 13 17:15 Purchases/
-rw-r--r--  1   mobile mobile       0 Jan  3 19:22 com.apple.itunes.lock_sync
drwxr-x--- 6  mobile mobile     204 May 26 10:46 iTunes_Control/
-rwxr-xr-x 1  root   mobile   45440 Jan  3 20:03 jailbreak.log*

Корректно определяются  папки DCIM/ Photos/ и все файлы

Код

    if(opendir(chPath) )
    {     
        cell.isLocked = NO;    
        cell.isDirectory = YES;    
    }
    else
    {
        if(errno == ENOTDIR)
        {
           cell.isLocked = NO;
        }
        else 
        {
           cell.isLocked = YES;    
        }        
    
    }


Автор: Vampir41k 13.6.2009, 01:12
когда то такое в универ писал....

Код

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main (int argc, char **argv)
{
  struct stat mode;

    if (argc != 2)
    {
        printf("Usage: <file path>\n");
        exit(1);
    }

    if (stat (argv[1], &mode) == -1)
    {
        printf ("Error");
        exit (1);
    }

    printf ("File type:\t");

    switch (mode.st_mode & S_IFMT) 
    {
        case S_IFDIR:   printf("directory\n");          break;
        case S_IFIFO:   printf("FIFO\n");               break;
        case S_IFREG:   printf("regular file\n");       break;
        case S_IFCHR:   printf("character device\n");   break;
        case S_IFBLK:   printf("block device\n");       break;
    }

return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)